diff options
author | peter <peter@FreeBSD.org> | 2000-01-13 18:48:12 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2000-01-13 18:48:12 +0000 |
commit | f45fdd3f47eb65e321536ed0dfb9e029ca80a9b8 (patch) | |
tree | e259a637c094011f73e06dc3cdd3379f07d2087f /sys | |
parent | c56370111027a72f591f6b72e0b49b9d1a33cb39 (diff) | |
download | FreeBSD-src-f45fdd3f47eb65e321536ed0dfb9e029ca80a9b8.zip FreeBSD-src-f45fdd3f47eb65e321536ed0dfb9e029ca80a9b8.tar.gz |
Free the global softupdates lock prior to tsleep() in getdirtybuf().
This seems to be responsible for a bunch of panics where the process
sleeps and something else finds softupdates "locked" when it shouldn't
be. This commit is unreviewed, but has been a big help here.
Previously my boxes would panic pretty much on the first fsync() that
wrote something to disk.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/contrib/softupdates/ffs_softdep.c | 2 | ||||
-rw-r--r-- | sys/ufs/ffs/ffs_softdep.c | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/sys/contrib/softupdates/ffs_softdep.c b/sys/contrib/softupdates/ffs_softdep.c index b2e2c62..c4cd06d 100644 --- a/sys/contrib/softupdates/ffs_softdep.c +++ b/sys/contrib/softupdates/ffs_softdep.c @@ -4563,7 +4563,9 @@ getdirtybuf(bpp, waitfor) if (waitfor != MNT_WAIT) return (0); bp->b_xflags |= BX_BKGRDWAIT; + FREE_LOCK_INTERLOCKED(&lk); tsleep(&bp->b_xflags, PRIBIO, "getbuf", 0); + ACQUIRE_LOCK_INTERLOCKED(&lk); if (bp->b_xflags & BX_BKGRDINPROG) panic("getdirtybuf: still writing"); continue; diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c index b2e2c62..c4cd06d 100644 --- a/sys/ufs/ffs/ffs_softdep.c +++ b/sys/ufs/ffs/ffs_softdep.c @@ -4563,7 +4563,9 @@ getdirtybuf(bpp, waitfor) if (waitfor != MNT_WAIT) return (0); bp->b_xflags |= BX_BKGRDWAIT; + FREE_LOCK_INTERLOCKED(&lk); tsleep(&bp->b_xflags, PRIBIO, "getbuf", 0); + ACQUIRE_LOCK_INTERLOCKED(&lk); if (bp->b_xflags & BX_BKGRDINPROG) panic("getdirtybuf: still writing"); continue; |