aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-04-13 10:22:56 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-04-23 11:14:10 +0000
commit22f23299b7ed96932a4b9e8b3a93fc233af1f2d4 (patch)
tree61c6749972163882f79d4ce5f6bda077646a8ee2
parentc35473f4ab3a58dcc2846713c131d6983d9ed009 (diff)
downloadsrc-22f23299b7ed96932a4b9e8b3a93fc233af1f2d4.tar.gz
src-22f23299b7ed96932a4b9e8b3a93fc233af1f2d4.zip
b_vflags update requries bufobj lock
(cherry picked from commit e3d675958539eee899d42438f5b46a26f3c64902)
-rw-r--r--sys/ufs/ffs/ffs_softdep.c2
-rw-r--r--sys/ufs/ffs/ffs_vnops.c4
2 files changed, 5 insertions, 1 deletions
diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 786fb43c7d81..2cc16ab2a2c1 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -7523,7 +7523,9 @@ cleanrestart:
BO_LOCK(bo);
goto cleanrestart;
}
+ BO_LOCK(bo);
bp->b_vflags |= BV_SCANNED;
+ BO_UNLOCK(bo);
bremfree(bp);
if (blkoff != 0) {
allocbuf(bp, blkoff);
diff --git a/sys/ufs/ffs/ffs_vnops.c b/sys/ufs/ffs/ffs_vnops.c
index 582ccccc2e12..4e4e0b78fe4d 100644
--- a/sys/ufs/ffs/ffs_vnops.c
+++ b/sys/ufs/ffs/ffs_vnops.c
@@ -321,8 +321,9 @@ loop:
if (BUF_LOCK(bp,
LK_EXCLUSIVE | LK_SLEEPFAIL | LK_INTERLOCK,
BO_LOCKPTR(bo)) != 0) {
+ BO_LOCK(bo);
bp->b_vflags &= ~BV_SCANNED;
- goto next;
+ goto next_locked;
}
} else
continue;
@@ -385,6 +386,7 @@ next:
* to start from a known point.
*/
BO_LOCK(bo);
+next_locked:
nbp = TAILQ_FIRST(&bo->bo_dirty.bv_hd);
}
if (waitfor != MNT_WAIT) {