Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/nfsclient/nfs_clvfsops.c
Show First 20 Lines • Show All 1,915 Lines • ▼ Show 20 Lines | if (NFSCL_FORCEDISM(mp)) { | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
return (EBADF); | return (EBADF); | ||||
} | } | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
/* | /* | ||||
* Force stale buffer cache information to be flushed. | * Force stale buffer cache information to be flushed. | ||||
*/ | */ | ||||
loop: | |||||
MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | ||||
/* XXX Racy bv_cnt check. */ | /* XXX Racy bv_cnt check. */ | ||||
if (NFSVOPISLOCKED(vp) || vp->v_bufobj.bo_dirty.bv_cnt == 0 || | if (NFSVOPISLOCKED(vp) || vp->v_bufobj.bo_dirty.bv_cnt == 0 || | ||||
waitfor == MNT_LAZY) { | waitfor == MNT_LAZY) { | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
continue; | continue; | ||||
} | } | ||||
if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK)) { | if (vget(vp, LK_EXCLUSIVE | LK_INTERLOCK) != 0) { | ||||
MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | continue; | ||||
goto loop; | |||||
} | } | ||||
error = VOP_FSYNC(vp, waitfor, td); | error = VOP_FSYNC(vp, waitfor, td); | ||||
if (error) | if (error) | ||||
allerror = error; | allerror = error; | ||||
NFSVOPUNLOCK(vp); | NFSVOPUNLOCK(vp); | ||||
vrele(vp); | vrele(vp); | ||||
} | } | ||||
return (allerror); | return (allerror); | ||||
▲ Show 20 Lines • Show All 222 Lines • Show Last 20 Lines |