Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/vfs_subr.c
Show First 20 Lines • Show All 2,855 Lines • ▼ Show 20 Lines | _vhold(struct vnode *vp, bool locked) | ||||
VNASSERT(vp->v_holdcnt == 0, vp, | VNASSERT(vp->v_holdcnt == 0, vp, | ||||
("%s: wrong hold count", __func__)); | ("%s: wrong hold count", __func__)); | ||||
VNASSERT(vp->v_op != NULL, vp, | VNASSERT(vp->v_op != NULL, vp, | ||||
("%s: vnode already reclaimed.", __func__)); | ("%s: vnode already reclaimed.", __func__)); | ||||
/* | /* | ||||
* Remove a vnode from the free list, mark it as in use, | * Remove a vnode from the free list, mark it as in use, | ||||
* and put it on the active list. | * and put it on the active list. | ||||
*/ | */ | ||||
VNASSERT(vp->v_mount != NULL, vp, | |||||
("_vhold: vnode not on per mount vnode list")); | |||||
mp = vp->v_mount; | mp = vp->v_mount; | ||||
mtx_lock(&mp->mnt_listmtx); | mtx_lock(&mp->mnt_listmtx); | ||||
if ((vp->v_mflag & VMP_TMPMNTFREELIST) != 0) { | if ((vp->v_mflag & VMP_TMPMNTFREELIST) != 0) { | ||||
TAILQ_REMOVE(&mp->mnt_tmpfreevnodelist, vp, v_actfreelist); | TAILQ_REMOVE(&mp->mnt_tmpfreevnodelist, vp, v_actfreelist); | ||||
mp->mnt_tmpfreevnodelistsize--; | mp->mnt_tmpfreevnodelistsize--; | ||||
vp->v_mflag &= ~VMP_TMPMNTFREELIST; | vp->v_mflag &= ~VMP_TMPMNTFREELIST; | ||||
} else { | } else { | ||||
mtx_lock(&vnode_free_list_mtx); | mtx_lock(&vnode_free_list_mtx); | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | if ((vp->v_iflag & VI_DOOMED) == 0) { | ||||
VNASSERT((vp->v_iflag & VI_FREE) == 0, vp, | VNASSERT((vp->v_iflag & VI_FREE) == 0, vp, | ||||
("vnode already free")); | ("vnode already free")); | ||||
VNASSERT(vp->v_holdcnt == 0, vp, | VNASSERT(vp->v_holdcnt == 0, vp, | ||||
("vdropl: freeing when we shouldn't")); | ("vdropl: freeing when we shouldn't")); | ||||
active = vp->v_iflag & VI_ACTIVE; | active = vp->v_iflag & VI_ACTIVE; | ||||
if ((vp->v_iflag & VI_OWEINACT) == 0) { | if ((vp->v_iflag & VI_OWEINACT) == 0) { | ||||
vp->v_iflag &= ~VI_ACTIVE; | vp->v_iflag &= ~VI_ACTIVE; | ||||
mp = vp->v_mount; | mp = vp->v_mount; | ||||
if (mp != NULL) { | |||||
mtx_lock(&mp->mnt_listmtx); | mtx_lock(&mp->mnt_listmtx); | ||||
if (active) { | if (active) { | ||||
TAILQ_REMOVE(&mp->mnt_activevnodelist, vp, | TAILQ_REMOVE(&mp->mnt_activevnodelist, | ||||
v_actfreelist); | vp, v_actfreelist); | ||||
mp->mnt_activevnodelistsize--; | mp->mnt_activevnodelistsize--; | ||||
} | } | ||||
TAILQ_INSERT_TAIL(&mp->mnt_tmpfreevnodelist, vp, | TAILQ_INSERT_TAIL(&mp->mnt_tmpfreevnodelist, | ||||
v_actfreelist); | vp, v_actfreelist); | ||||
mp->mnt_tmpfreevnodelistsize++; | mp->mnt_tmpfreevnodelistsize++; | ||||
vp->v_iflag |= VI_FREE; | vp->v_iflag |= VI_FREE; | ||||
vp->v_mflag |= VMP_TMPMNTFREELIST; | vp->v_mflag |= VMP_TMPMNTFREELIST; | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
if (mp->mnt_tmpfreevnodelistsize >= mnt_free_list_batch) | if (mp->mnt_tmpfreevnodelistsize >= | ||||
mnt_free_list_batch) | |||||
vnlru_return_batch_locked(mp); | vnlru_return_batch_locked(mp); | ||||
mtx_unlock(&mp->mnt_listmtx); | mtx_unlock(&mp->mnt_listmtx); | ||||
} else { | |||||
VNASSERT(active == 0, vp, | |||||
("vdropl: active vnode not on per mount " | |||||
"vnode list")); | |||||
mtx_lock(&vnode_free_list_mtx); | |||||
TAILQ_INSERT_TAIL(&vnode_free_list, vp, | |||||
v_actfreelist); | |||||
freevnodes++; | |||||
vp->v_iflag |= VI_FREE; | |||||
VI_UNLOCK(vp); | |||||
mtx_unlock(&vnode_free_list_mtx); | |||||
} | |||||
} else { | } else { | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
counter_u64_add(free_owe_inact, 1); | counter_u64_add(free_owe_inact, 1); | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
/* | /* | ||||
* The vnode has been marked for destruction, so free it. | * The vnode has been marked for destruction, so free it. | ||||
▲ Show 20 Lines • Show All 2,580 Lines • Show Last 20 Lines |