Changeset View
Changeset View
Standalone View
Standalone View
sys/ufs/ffs/ffs_snapshot.c
Show First 20 Lines • Show All 529 Lines • ▼ Show 20 Lines | #endif | ||||
snaplistsize = fs->fs_ncg + howmany(fs->fs_cssize, fs->fs_bsize) + | snaplistsize = fs->fs_ncg + howmany(fs->fs_cssize, fs->fs_bsize) + | ||||
FSMAXSNAP + 1 /* superblock */ + 1 /* last block */ + 1 /* size */; | FSMAXSNAP + 1 /* superblock */ + 1 /* last block */ + 1 /* size */; | ||||
MNT_ILOCK(mp); | MNT_ILOCK(mp); | ||||
mp->mnt_kern_flag &= ~MNTK_SUSPENDED; | mp->mnt_kern_flag &= ~MNTK_SUSPENDED; | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
loop: | loop: | ||||
MNT_VNODE_FOREACH_ALL(xvp, mp, mvp) { | MNT_VNODE_FOREACH_ALL(xvp, mp, mvp) { | ||||
if ((xvp->v_usecount == 0 && | if ((xvp->v_usecount == 0 && | ||||
(xvp->v_iflag & (VI_OWEINACT | VI_DOINGINACT)) == 0) || | ((xvp->v_irflag & VIRF_OWEINACT) == 0 && | ||||
(xvp->v_iflag & VI_DOINGINACT) == 0)) || | |||||
xvp->v_type == VNON || | xvp->v_type == VNON || | ||||
IS_SNAPSHOT(VTOI(xvp))) { | IS_SNAPSHOT(VTOI(xvp))) { | ||||
VI_UNLOCK(xvp); | VI_UNLOCK(xvp); | ||||
continue; | continue; | ||||
} | } | ||||
/* | /* | ||||
* We can skip parent directory vnode because it must have | * We can skip parent directory vnode because it must have | ||||
* this snapshot file in it. | * this snapshot file in it. | ||||
*/ | */ | ||||
if (xvp == nd.ni_dvp) { | if (xvp == nd.ni_dvp) { | ||||
VI_UNLOCK(xvp); | VI_UNLOCK(xvp); | ||||
continue; | continue; | ||||
} | } | ||||
vholdl(xvp); | vholdl(xvp); | ||||
if (vn_lock(xvp, LK_EXCLUSIVE | LK_INTERLOCK) != 0) { | if (vn_lock(xvp, LK_EXCLUSIVE | LK_INTERLOCK) != 0) { | ||||
MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | ||||
vdrop(xvp); | vdrop(xvp); | ||||
goto loop; | goto loop; | ||||
} | } | ||||
VI_LOCK(xvp); | VI_LOCK(xvp); | ||||
if (xvp->v_usecount == 0 && | if (xvp->v_usecount == 0 && | ||||
(xvp->v_iflag & (VI_OWEINACT | VI_DOINGINACT)) == 0) { | ((xvp->v_irflag & VIRF_OWEINACT) == 0 && | ||||
(xvp->v_iflag & VI_DOINGINACT) == 0)) { | |||||
VI_UNLOCK(xvp); | VI_UNLOCK(xvp); | ||||
VOP_UNLOCK(xvp); | VOP_UNLOCK(xvp); | ||||
vdrop(xvp); | vdrop(xvp); | ||||
continue; | continue; | ||||
} | } | ||||
VI_UNLOCK(xvp); | VI_UNLOCK(xvp); | ||||
#ifdef DIAGNOSTIC | #ifdef DIAGNOSTIC | ||||
if (snapdebug) | if (snapdebug) | ||||
▲ Show 20 Lines • Show All 1,990 Lines • ▼ Show 20 Lines | loop: | ||||
MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | ||||
/* | /* | ||||
* IN_LAZYACCESS is checked here without holding any | * IN_LAZYACCESS is checked here without holding any | ||||
* vnode lock, but this flag is set only while holding | * vnode lock, but this flag is set only while holding | ||||
* vnode interlock. | * vnode interlock. | ||||
*/ | */ | ||||
if (vp->v_type == VNON || | if (vp->v_type == VNON || | ||||
((VTOI(vp)->i_flag & IN_LAZYACCESS) == 0 && | ((VTOI(vp)->i_flag & IN_LAZYACCESS) == 0 && | ||||
((vp->v_iflag & VI_OWEINACT) == 0 || vp->v_usecount > 0))) { | ((vp->v_irflag & VIRF_OWEINACT) == 0 || vp->v_usecount > 0))) { | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
continue; | continue; | ||||
} | } | ||||
vholdl(vp); | vholdl(vp); | ||||
error = vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK); | error = vn_lock(vp, LK_EXCLUSIVE | LK_INTERLOCK); | ||||
if (error != 0) { | if (error != 0) { | ||||
vdrop(vp); | vdrop(vp); | ||||
if (error == ENOENT) | if (error == ENOENT) | ||||
▲ Show 20 Lines • Show All 139 Lines • Show Last 20 Lines |