MFC r275743:
Put the buffer cleanup code after inactivation.
This commit is contained in:
parent
f419d174a9
commit
febae1567d
@ -1567,6 +1567,7 @@ buf_vlist_add(struct buf *bp, struct bufobj *bo, b_xflags_t xflags)
|
||||
int error;
|
||||
|
||||
ASSERT_BO_WLOCKED(bo);
|
||||
KASSERT((bo->bo_flag & BO_DEAD) == 0, ("dead bo %p", bo));
|
||||
KASSERT((bp->b_xflags & (BX_VNDIRTY|BX_VNCLEAN)) == 0,
|
||||
("buf_vlist_add: Buf %p has existing xflags %d", bp, bp->b_xflags));
|
||||
bp->b_xflags |= xflags;
|
||||
@ -2793,16 +2794,6 @@ vgonel(struct vnode *vp)
|
||||
VI_UNLOCK(vp);
|
||||
vfs_notify_upper(vp, VFS_NOTIFY_UPPER_RECLAIM);
|
||||
|
||||
/*
|
||||
* Clean out any buffers associated with the vnode.
|
||||
* If the flush fails, just toss the buffers.
|
||||
*/
|
||||
mp = NULL;
|
||||
if (!TAILQ_EMPTY(&vp->v_bufobj.bo_dirty.bv_hd))
|
||||
(void) vn_start_secondary_write(vp, &mp, V_WAIT);
|
||||
if (vinvalbuf(vp, V_SAVE, 0, 0) != 0)
|
||||
vinvalbuf(vp, 0, 0, 0);
|
||||
|
||||
/*
|
||||
* If purging an active vnode, it must be closed and
|
||||
* deactivated before being reclaimed.
|
||||
@ -2817,6 +2808,29 @@ vgonel(struct vnode *vp)
|
||||
}
|
||||
if (vp->v_type == VSOCK)
|
||||
vfs_unp_reclaim(vp);
|
||||
|
||||
/*
|
||||
* Clean out any buffers associated with the vnode.
|
||||
* If the flush fails, just toss the buffers.
|
||||
*/
|
||||
mp = NULL;
|
||||
if (!TAILQ_EMPTY(&vp->v_bufobj.bo_dirty.bv_hd))
|
||||
(void) vn_start_secondary_write(vp, &mp, V_WAIT);
|
||||
if (vinvalbuf(vp, V_SAVE, 0, 0) != 0) {
|
||||
while (vinvalbuf(vp, 0, 0, 0) != 0)
|
||||
;
|
||||
}
|
||||
#ifdef INVARIANTS
|
||||
BO_LOCK(&vp->v_bufobj);
|
||||
KASSERT(TAILQ_EMPTY(&vp->v_bufobj.bo_dirty.bv_hd) &&
|
||||
vp->v_bufobj.bo_dirty.bv_cnt == 0 &&
|
||||
TAILQ_EMPTY(&vp->v_bufobj.bo_clean.bv_hd) &&
|
||||
vp->v_bufobj.bo_clean.bv_cnt == 0,
|
||||
("vp %p bufobj not invalidated", vp));
|
||||
vp->v_bufobj.bo_flag |= BO_DEAD;
|
||||
BO_UNLOCK(&vp->v_bufobj);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Reclaim the vnode.
|
||||
*/
|
||||
|
@ -112,6 +112,7 @@ struct bufobj {
|
||||
*/
|
||||
#define BO_ONWORKLST (1 << 0) /* On syncer work-list */
|
||||
#define BO_WWAIT (1 << 1) /* Wait for output to complete */
|
||||
#define BO_DEAD (1 << 2) /* Dead; only with INVARIANTS */
|
||||
|
||||
#define BO_LOCKPTR(bo) (&(bo)->bo_lock)
|
||||
#define BO_LOCK(bo) rw_wlock(BO_LOCKPTR((bo)))
|
||||
|
Loading…
Reference in New Issue
Block a user