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/nfsclient/nfs_vnops.c | |
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/nfsclient/nfs_vnops.c')
-rw-r--r-- | sys/nfsclient/nfs_vnops.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/nfsclient/nfs_vnops.c b/sys/nfsclient/nfs_vnops.c index 919f2a3..5d7a4d0 100644 --- a/sys/nfsclient/nfs_vnops.c +++ b/sys/nfsclient/nfs_vnops.c @@ -2658,10 +2658,11 @@ again: for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { if (bvecpos >= bvecsize) break; - VI_UNLOCK(vp); if ((bp->b_flags & (B_DELWRI | B_NEEDCOMMIT)) != (B_DELWRI | B_NEEDCOMMIT) || - BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { + BUF_LOCK(bp, + LK_EXCLUSIVE | LK_NOWAIT | LK_INTERLOCK, + VI_MTX(vp))) { VI_LOCK(vp); nbp = TAILQ_NEXT(bp, b_vnbufs); continue; @@ -2785,14 +2786,13 @@ loop: VI_LOCK(vp); for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { nbp = TAILQ_NEXT(bp, b_vnbufs); - VI_UNLOCK(vp); - if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) { - if (waitfor != MNT_WAIT || passone) { - VI_LOCK(vp); + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) { + if (waitfor != MNT_WAIT || passone) continue; - } - error = BUF_TIMELOCK(bp, LK_EXCLUSIVE | LK_SLEEPFAIL, - "nfsfsync", slpflag, slptimeo); + + error = BUF_TIMELOCK(bp, + LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK, + VI_MTX(vp), "nfsfsync", slpflag, slptimeo); splx(s); if (error == 0) panic("nfs_fsync: inconsistent lock"); |