Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_subr.c
Show First 20 Lines • Show All 1,930 Lines • ▼ Show 20 Lines | bufobj_invalbuf(struct bufobj *bo, int flags, int slpflag, int slptimeo) | ||||
if (flags & V_SAVE) { | if (flags & V_SAVE) { | ||||
error = bufobj_wwait(bo, slpflag, slptimeo); | error = bufobj_wwait(bo, slpflag, slptimeo); | ||||
if (error) { | if (error) { | ||||
BO_UNLOCK(bo); | BO_UNLOCK(bo); | ||||
return (error); | return (error); | ||||
} | } | ||||
if (bo->bo_dirty.bv_cnt > 0) { | if (bo->bo_dirty.bv_cnt > 0) { | ||||
BO_UNLOCK(bo); | BO_UNLOCK(bo); | ||||
if ((error = BO_SYNC(bo, MNT_WAIT)) != 0) | do { | ||||
error = BO_SYNC(bo, MNT_WAIT); | |||||
} while (error == ERELOOKUP); | |||||
if (error != 0) | |||||
return (error); | return (error); | ||||
/* | /* | ||||
* XXX We could save a lock/unlock if this was only | * XXX We could save a lock/unlock if this was only | ||||
* enabled under INVARIANTS | * enabled under INVARIANTS | ||||
*/ | */ | ||||
BO_LOCK(bo); | BO_LOCK(bo); | ||||
if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) | if (bo->bo_numoutput > 0 || bo->bo_dirty.bv_cnt > 0) | ||||
panic("vinvalbuf: dirty bufs"); | panic("vinvalbuf: dirty bufs"); | ||||
▲ Show 20 Lines • Show All 1,724 Lines • ▼ Show 20 Lines | MNT_VNODE_FOREACH_ALL(vp, mp, mvp) { | ||||
* vnodes open for writing. | * vnodes open for writing. | ||||
*/ | */ | ||||
if (flags & WRITECLOSE) { | if (flags & WRITECLOSE) { | ||||
if (vp->v_object != NULL) { | if (vp->v_object != NULL) { | ||||
VM_OBJECT_WLOCK(vp->v_object); | VM_OBJECT_WLOCK(vp->v_object); | ||||
vm_object_page_clean(vp->v_object, 0, 0, 0); | vm_object_page_clean(vp->v_object, 0, 0, 0); | ||||
VM_OBJECT_WUNLOCK(vp->v_object); | VM_OBJECT_WUNLOCK(vp->v_object); | ||||
} | } | ||||
do { | |||||
error = VOP_FSYNC(vp, MNT_WAIT, td); | error = VOP_FSYNC(vp, MNT_WAIT, td); | ||||
} while (error == ERELOOKUP); | |||||
if (error != 0) { | if (error != 0) { | ||||
VOP_UNLOCK(vp); | VOP_UNLOCK(vp); | ||||
vdrop(vp); | vdrop(vp); | ||||
MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp); | ||||
return (error); | return (error); | ||||
} | } | ||||
error = VOP_GETATTR(vp, &vattr, td->td_ucred); | error = VOP_GETATTR(vp, &vattr, td->td_ucred); | ||||
VI_LOCK(vp); | VI_LOCK(vp); | ||||
▲ Show 20 Lines • Show All 3,112 Lines • Show Last 20 Lines |