]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Don't schedule non persistent passes persistently
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 6 Jul 2025 23:25:27 +0000 (19:25 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 7 Jul 2025 18:10:47 +0000 (14:10 -0400)
  if (!(in_recovery && (flags & RUN_RECOVERY_PASS_nopersistent)))

should have been

  if (!in_recovery && !(flags & RUN_RECOVERY_PASS_nopersistent)))

But the !in_recovery part was also wrong: the assumption is that if
we're in recovery we'll just rewind and run the recovery pass
immediately, but we're not able to do so if we've already gone RW and
the pass must be run before we go RW. In that case, we need to schedule
it in the superblock so it can be run on the next mount attempt.

Scheduling it persistently is fine, because it'll be cleared in the
superblock immediately when the pass completes successfully.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/recovery_passes.c

index c09ed2dd463990b9b54c01b76a4e54282f90e886..6a039e0110643f4f4bae5a1197904e1882241948 100644 (file)
@@ -360,7 +360,7 @@ int __bch2_run_explicit_recovery_pass(struct bch_fs *c,
                !(r->passes_complete & BIT_ULL(pass));
        bool ratelimit = flags & RUN_RECOVERY_PASS_ratelimit;
 
-       if (!(in_recovery && (flags & RUN_RECOVERY_PASS_nopersistent))) {
+       if (!(flags & RUN_RECOVERY_PASS_nopersistent)) {
                struct bch_sb_field_ext *ext = bch2_sb_field_get(c->disk_sb.sb, ext);
                __set_bit_le64(bch2_recovery_pass_to_stable(pass), ext->recovery_passes_required);
        }