summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2000-01-13 18:48:12 +0000
committerpeter <peter@FreeBSD.org>2000-01-13 18:48:12 +0000
commitf45fdd3f47eb65e321536ed0dfb9e029ca80a9b8 (patch)
treee259a637c094011f73e06dc3cdd3379f07d2087f /sys
parentc56370111027a72f591f6b72e0b49b9d1a33cb39 (diff)
downloadFreeBSD-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.c2
-rw-r--r--sys/ufs/ffs/ffs_softdep.c2
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;
OpenPOWER on IntegriCloud