bcachefs: discard_one_bucket() now uses need_discard_or_freespace_err()
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 27 Oct 2024 03:25:17 +0000 (23:25 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Dec 2024 06:36:18 +0000 (01:36 -0500)
More conversion of inconsistent errors to fsck errors.

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

index 0c044201787f088f24f768025f06cc0c63dc9d44..e90561b6def668e5cab9ffd3eb60160c9b18644f 100644 (file)
@@ -1770,11 +1770,13 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
                goto out;
 
        if (a->v.data_type != BCH_DATA_need_discard) {
-               if (bch2_trans_inconsistent_on(c->curr_recovery_pass > BCH_RECOVERY_PASS_check_alloc_info,
-                                              trans, "bucket incorrectly set in need_discard btree\n"
-                                              "%s",
-                                              (bch2_bkey_val_to_text(&buf, c, k), buf.buf)))
-                       ret = -EIO;
+               if (need_discard_or_freespace_err(trans, k, true, true, true)) {
+                       ret = bch2_btree_bit_mod_iter(trans, need_discard_iter, false);
+                       if (ret)
+                               goto out;
+                       goto commit;
+               }
+
                goto out;
        }
 
@@ -1814,16 +1816,20 @@ static int bch2_discard_one_bucket(struct btree_trans *trans,
        SET_BCH_ALLOC_V4_NEED_DISCARD(&a->v, false);
        alloc_data_type_set(&a->v, a->v.data_type);
 
-       ret =   bch2_trans_update(trans, &iter, &a->k_i, 0) ?:
-               bch2_trans_commit(trans, NULL, NULL,
-                                 BCH_WATERMARK_btree|
-                                 BCH_TRANS_COMMIT_no_enospc);
+       ret = bch2_trans_update(trans, &iter, &a->k_i, 0);
+       if (ret)
+               goto out;
+commit:
+       ret = bch2_trans_commit(trans, NULL, NULL,
+                               BCH_WATERMARK_btree|
+                               BCH_TRANS_COMMIT_no_enospc);
        if (ret)
                goto out;
 
        count_event(c, bucket_discard);
        s->discarded++;
 out:
+fsck_err:
        if (discard_locked)
                discard_in_flight_remove(ca, iter.pos.offset);
        s->seen++;