diff options
author | jeff <jeff@FreeBSD.org> | 2003-02-25 03:37:48 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2003-02-25 03:37:48 +0000 |
commit | 9e4c9a6ce908881b1e6f83cbb906a9fce08dd3ab (patch) | |
tree | df5eb5e550ba49b92f45eadaca861cb18128ad5d /sys/ufs | |
parent | 541937cf7373ff6a61c871266ea041503bb02233 (diff) | |
download | FreeBSD-src-9e4c9a6ce908881b1e6f83cbb906a9fce08dd3ab.zip FreeBSD-src-9e4c9a6ce908881b1e6f83cbb906a9fce08dd3ab.tar.gz |
- Add an interlock argument to BUF_LOCK and BUF_TIMELOCK.
- Remove the buftimelock mutex and acquire the buf's interlock to protect
these fields instead.
- Hold the vnode interlock while locking bufs on the clean/dirty queues.
This reduces some cases from one BUF_LOCK with a LK_NOWAIT and another
BUF_LOCK with a LK_TIMEFAIL to a single lock.
Reviewed by: arch, mckusick
Diffstat (limited to 'sys/ufs')
-rw-r--r-- | sys/ufs/ffs/ffs_softdep.c | 9 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_vnops.c | 2 |
2 files changed, 6 insertions, 5 deletions
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index 8d4b5de..c51b02a 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -327,7 +327,7 @@ interlocked_sleep(lk, op, ident, mtx, flags, wmesg, timo) retval = msleep(ident, mtx, flags, wmesg, timo); break; case LOCKBUF: - retval = BUF_LOCK((struct buf *)ident, flags); + retval = BUF_LOCK((struct buf *)ident, flags, NULL); break; default: panic("interlocked_sleep: unknown operation"); @@ -4890,11 +4890,11 @@ softdep_fsync_mountdev(vp) VI_LOCK(vp); for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { nbp = TAILQ_NEXT(bp, b_vnbufs); - VI_UNLOCK(vp); /* * If it is already scheduled, skip to the next buffer. */ - if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, + VI_MTX(vp))) { VI_LOCK(vp); continue; } @@ -5807,7 +5807,8 @@ getdirtybuf(bpp, waitfor) for (;;) { if ((bp = *bpp) == NULL) return (0); - if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT) == 0) { + /* XXX Probably needs interlock */ + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL) == 0) { if ((bp->b_xflags & BX_BKGRDINPROG) == 0) break; BUF_UNLOCK(bp); diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c index 66fc2fe..9b39812 100644 --- a/sys/ufs/ffs/ffs_vnops.c +++ b/sys/ufs/ffs/ffs_vnops.c @@ -200,7 +200,7 @@ loop: bp->b_vflags |= BV_SCANNED; if ((skipmeta == 1 && bp->b_lblkno < 0)) continue; - if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) continue; if (!wait && LIST_FIRST(&bp->b_dep) != NULL && (bp->b_flags & B_DEFERRED) == 0 && |