]> git.itanic.dy.fi Git - linux-stable/commitdiff
bcachefs: If we run merges at a lower watermark, they must be nonblocking
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 22 Apr 2024 03:32:18 +0000 (23:32 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 22 Apr 2024 05:26:51 +0000 (01:26 -0400)
Fix another deadlock related to the merge path; previously, we switched
to always running merges at a lower watermark (because they are
noncritical); but when we run at a lower watermark we also need to run
nonblocking or we've introduced a new deadlock.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Reported-and-tested-by: s@m-h.ug
fs/bcachefs/btree_update_interior.c

index 6030c396754f6f494c3c137abd313f6bf80c2ffb..b4efd8cc4d1a2bfc62a9742d6f4df3e9a0f0aac5 100644 (file)
@@ -1960,7 +1960,11 @@ int __bch2_foreground_maybe_merge(struct btree_trans *trans,
        if ((flags & BCH_WATERMARK_MASK) == BCH_WATERMARK_interior_updates)
                return 0;
 
-       flags &= ~BCH_WATERMARK_MASK;
+       if ((flags & BCH_WATERMARK_MASK) <= BCH_WATERMARK_reclaim) {
+               flags &= ~BCH_WATERMARK_MASK;
+               flags |= BCH_WATERMARK_btree;
+               flags |= BCH_TRANS_COMMIT_journal_reclaim;
+       }
 
        b = trans->paths[path].l[level].b;