summaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorJeff Roberson <jeff@FreeBSD.org>2008-03-22 09:15:16 +0000
committerJeff Roberson <jeff@FreeBSD.org>2008-03-22 09:15:16 +0000
commit698b1a6643b3010e921a719cfc0bf7fb13781c00 (patch)
tree5fedc50643363d96cefce7e3cd6edbdbf2d7fb2b /sys/kern/vfs_subr.c
parent435cdf88ea76245289e15e9b1d3136a835685c23 (diff)
Notes
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c54
1 files changed, 29 insertions, 25 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index a0df9e66b1db..0fcff5f2b9da 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -936,7 +936,7 @@ alloc:
*/
bo = &vp->v_bufobj;
bo->__bo_vnode = vp;
- bo->bo_mtx = &vp->v_interlock;
+ mtx_init(BO_MTX(bo), "bufobj interlock", NULL, MTX_DEF);
bo->bo_ops = &buf_ops_bio;
bo->bo_private = vp;
TAILQ_INIT(&bo->bo_clean.bv_hd);
@@ -1236,8 +1236,8 @@ vtruncbuf(struct vnode *vp, struct ucred *cred, struct thread *td,
ASSERT_VOP_LOCKED(vp, "vtruncbuf");
restart:
- VI_LOCK(vp);
bo = &vp->v_bufobj;
+ BO_LOCK(bo);
anyfreed = 1;
for (;anyfreed;) {
anyfreed = 0;
@@ -1246,7 +1246,7 @@ restart:
continue;
if (BUF_LOCK(bp,
LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK,
- VI_MTX(vp)) == ENOLCK)
+ BO_MTX(bo)) == ENOLCK)
goto restart;
bremfree(bp);
@@ -1261,7 +1261,7 @@ restart:
(nbp->b_flags & B_DELWRI))) {
goto restart;
}
- VI_LOCK(vp);
+ BO_LOCK(bo);
}
TAILQ_FOREACH_SAFE(bp, &bo->bo_dirty.bv_hd, b_bobufs, nbp) {
@@ -1269,7 +1269,7 @@ restart:
continue;
if (BUF_LOCK(bp,
LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK,
- VI_MTX(vp)) == ENOLCK)
+ BO_MTX(bo)) == ENOLCK)
goto restart;
bremfree(bp);
bp->b_flags |= (B_INVAL | B_RELBUF);
@@ -1282,7 +1282,7 @@ restart:
(nbp->b_flags & B_DELWRI) == 0)) {
goto restart;
}
- VI_LOCK(vp);
+ BO_LOCK(bo);
}
}
@@ -1305,13 +1305,13 @@ restartsync:
bremfree(bp);
bawrite(bp);
- VI_LOCK(vp);
+ BO_LOCK(bo);
goto restartsync;
}
}
bufobj_wwait(bo, 0, 0);
- VI_UNLOCK(vp);
+ BO_UNLOCK(bo);
vnode_pager_setsize(vp, length);
return (0);
@@ -1503,24 +1503,25 @@ gbincore(struct bufobj *bo, daddr_t lblkno)
void
bgetvp(struct vnode *vp, struct buf *bp)
{
+ struct bufobj *bo;
+ bo = &vp->v_bufobj;
+ ASSERT_BO_LOCKED(bo);
VNASSERT(bp->b_vp == NULL, bp->b_vp, ("bgetvp: not free"));
CTR3(KTR_BUF, "bgetvp(%p) vp %p flags %X", bp, vp, bp->b_flags);
VNASSERT((bp->b_xflags & (BX_VNDIRTY|BX_VNCLEAN)) == 0, vp,
("bgetvp: bp already attached! %p", bp));
- ASSERT_VI_LOCKED(vp, "bgetvp");
- vholdl(vp);
- if (VFS_NEEDSGIANT(vp->v_mount) ||
- vp->v_bufobj.bo_flag & BO_NEEDSGIANT)
+ vhold(vp);
+ if (VFS_NEEDSGIANT(vp->v_mount) || bo->bo_flag & BO_NEEDSGIANT)
bp->b_flags |= B_NEEDSGIANT;
bp->b_vp = vp;
- bp->b_bufobj = &vp->v_bufobj;
+ bp->b_bufobj = bo;
/*
* Insert onto list for new vnode.
*/
- buf_vlist_add(bp, &vp->v_bufobj, BX_VNCLEAN);
+ buf_vlist_add(bp, bo, BX_VNCLEAN);
}
/*
@@ -1557,7 +1558,8 @@ brelvp(struct buf *bp)
bp->b_vp = NULL;
bp->b_bufobj = NULL;
waiters = bp->b_waiters;
- vdropl(vp);
+ BO_UNLOCK(bo);
+ vdrop(vp);
return (waiters);
}
@@ -1668,7 +1670,7 @@ restart:
(void) VOP_FSYNC(vp, MNT_LAZY, td);
VOP_UNLOCK(vp, 0);
vn_finished_write(mp);
- VI_LOCK(vp);
+ BO_LOCK(*bo);
if (((*bo)->bo_flag & BO_ONWORKLST) != 0) {
/*
* Put us back on the worklist. The worklist
@@ -1678,7 +1680,8 @@ restart:
*/
vn_syncer_add_to_worklist(*bo, syncdelay);
}
- vdropl(vp);
+ BO_UNLOCK(*bo);
+ vdrop(vp);
VFS_UNLOCK_GIANT(vfslocked);
mtx_lock(&sync_mtx);
return (0);
@@ -1886,7 +1889,7 @@ reassignbuf(struct buf *bp)
/*
* Delete from old vnode list, if on one.
*/
- VI_LOCK(vp);
+ BO_LOCK(bo);
if (bp->b_xflags & (BX_VNDIRTY | BX_VNCLEAN))
buf_vlist_remove(bp);
else
@@ -1937,7 +1940,7 @@ reassignbuf(struct buf *bp)
KASSERT(bp == NULL || bp->b_bufobj == bo,
("bp %p wrong b_bufobj %p should be %p", bp, bp->b_bufobj, bo));
#endif
- VI_UNLOCK(vp);
+ BO_UNLOCK(bo);
}
/*
@@ -3127,6 +3130,7 @@ int
vfs_allocate_syncvnode(struct mount *mp)
{
struct vnode *vp;
+ struct bufobj *bo;
static long start, incr, next;
int error;
@@ -3155,14 +3159,14 @@ vfs_allocate_syncvnode(struct mount *mp)
}
next = start;
}
- VI_LOCK(vp);
- vn_syncer_add_to_worklist(&vp->v_bufobj,
- syncdelay > 0 ? next % syncdelay : 0);
+ bo = &vp->v_bufobj;
+ BO_LOCK(bo);
+ vn_syncer_add_to_worklist(bo, syncdelay > 0 ? next % syncdelay : 0);
/* XXX - vn_syncer_add_to_worklist() also grabs and drops sync_mtx. */
mtx_lock(&sync_mtx);
sync_vnode_count++;
mtx_unlock(&sync_mtx);
- VI_UNLOCK(vp);
+ BO_UNLOCK(bo);
mp->mnt_syncer = vp;
return (0);
}
@@ -3244,8 +3248,8 @@ sync_reclaim(struct vop_reclaim_args *ap)
struct vnode *vp = ap->a_vp;
struct bufobj *bo;
- VI_LOCK(vp);
bo = &vp->v_bufobj;
+ BO_LOCK(bo);
vp->v_mount->mnt_syncer = NULL;
if (bo->bo_flag & BO_ONWORKLST) {
mtx_lock(&sync_mtx);
@@ -3255,7 +3259,7 @@ sync_reclaim(struct vop_reclaim_args *ap)
mtx_unlock(&sync_mtx);
bo->bo_flag &= ~BO_ONWORKLST;
}
- VI_UNLOCK(vp);
+ BO_UNLOCK(bo);
return (0);
}