The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=e3d675958539eee899d42438f5b46a26f3c64902

commit e3d675958539eee899d42438f5b46a26f3c64902
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2021-04-13 10:22:56 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2021-04-15 12:47:42 +0000

    b_vflags update requries bufobj lock
    
    The trunc_dependencies() issue was reported by  Alexander Lochmann
    <alexander.lochm...@tu-dortmund.de>, who found the problem by performing
    lock analysis using LockDoc, see https://doi.org/10.1145/3302424.3303948.
    
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
---
 sys/ufs/ffs/ffs_softdep.c | 2 ++
 sys/ufs/ffs/ffs_vnops.c   | 4 +++-
 2 files changed, 5 insertions(+), 1 deletion(-)

diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 0091b5dcd3b8..23c0cf6e128b 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -7546,7 +7546,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 dc638595eb7b..05eb19c0ee13 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) {
_______________________________________________
dev-commits-src-main@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/dev-commits-src-main
To unsubscribe, send any mail to "dev-commits-src-main-unsubscr...@freebsd.org"

Reply via email to