]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to 3421116a6c bcachefs: bch2_btree_delete_range_trans() now...
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 18 Aug 2022 17:03:43 +0000 (13:03 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Thu, 18 Aug 2022 17:03:43 +0000 (13:03 -0400)
.bcachefs_revision
libbcachefs/btree_update_leaf.c
libbcachefs/fsck.c

index 9f7af72c512d87e411df3b7977d19e48dee8a031..a2dcaa4f82e76f416adf1992aa8f32f24b2f08fc 100644 (file)
@@ -1 +1 @@
-dfaf9a6ee24f5c415635f9a75f5281f385535ebd
+3421116a6c137a36963cfe93c485f48ccd8802b9
index dd832f12b128555d45c2c084ef9a07da98ec97e2..ca9883927d9c124d9936e5eca7c68a6db79d835b 100644 (file)
@@ -1693,15 +1693,16 @@ int bch2_btree_delete_range_trans(struct btree_trans *trans, enum btree_id id,
                                  unsigned update_flags,
                                  u64 *journal_seq)
 {
+       u32 restart_count = trans->restart_count;
        struct btree_iter iter;
        struct bkey_s_c k;
        int ret = 0;
 
        bch2_trans_iter_init(trans, &iter, id, start, BTREE_ITER_INTENT);
 retry:
-       while ((bch2_trans_begin(trans),
-              (k = bch2_btree_iter_peek(&iter)).k) &&
-              !(ret = bkey_err(k)) &&
+       while ((k = bch2_btree_iter_peek(&iter)).k &&
+              !(ret = bkey_err(k) ?:
+                btree_trans_too_many_iters(trans)) &&
               bkey_cmp(iter.pos, end) < 0) {
                struct disk_reservation disk_res =
                        bch2_disk_reservation_init(trans->c, 0);
@@ -1747,11 +1748,15 @@ retry:
        }
 
        if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) {
+               bch2_trans_begin(trans);
                ret = 0;
                goto retry;
        }
 
        bch2_trans_iter_exit(trans, &iter);
+
+       if (!ret && trans_was_restarted(trans, restart_count))
+               ret = -BCH_ERR_transaction_restart_nested;
        return ret;
 }
 
@@ -1765,8 +1770,12 @@ int bch2_btree_delete_range(struct bch_fs *c, enum btree_id id,
                            unsigned update_flags,
                            u64 *journal_seq)
 {
-       return bch2_trans_run(c,
-                       bch2_btree_delete_range_trans(&trans, id, start, end, update_flags, journal_seq));
+       int ret = bch2_trans_run(c,
+                       bch2_btree_delete_range_trans(&trans, id, start, end,
+                                                     update_flags, journal_seq));
+       if (ret == -BCH_ERR_transaction_restart_nested)
+               ret = 0;
+       return ret;
 }
 
 int bch2_trans_log_msg(struct btree_trans *trans, const char *msg)
index 1a841146e379fb129ed2ce5de1c55ea147aa88a8..ff10f09eee5606e17e685aaeb12f0581925151ee 100644 (file)
 
 #define QSTR(n) { { { .len = strlen(n) } }, .name = n }
 
+/*
+ * XXX: this is handling transaction restarts without returning
+ * -BCH_ERR_transaction_restart_nested, this is not how we do things anymore:
+ */
 static s64 bch2_count_inode_sectors(struct btree_trans *trans, u64 inum,
                                    u32 snapshot)
 {
@@ -239,18 +243,20 @@ static int fsck_inode_rm(struct btree_trans *trans, u64 inum, u32 snapshot)
        struct bkey_s_c k;
        int ret;
 
-       ret   = bch2_btree_delete_range_trans(trans, BTREE_ID_extents,
-                                             SPOS(inum, 0, snapshot),
-                                             SPOS(inum, U64_MAX, snapshot),
-                                             0, NULL) ?:
-               bch2_btree_delete_range_trans(trans, BTREE_ID_dirents,
-                                             SPOS(inum, 0, snapshot),
-                                             SPOS(inum, U64_MAX, snapshot),
-                                             0, NULL) ?:
-               bch2_btree_delete_range_trans(trans, BTREE_ID_xattrs,
-                                             SPOS(inum, 0, snapshot),
-                                             SPOS(inum, U64_MAX, snapshot),
-                                             0, NULL);
+       do {
+               ret   = bch2_btree_delete_range_trans(trans, BTREE_ID_extents,
+                                                     SPOS(inum, 0, snapshot),
+                                                     SPOS(inum, U64_MAX, snapshot),
+                                                     0, NULL) ?:
+                       bch2_btree_delete_range_trans(trans, BTREE_ID_dirents,
+                                                     SPOS(inum, 0, snapshot),
+                                                     SPOS(inum, U64_MAX, snapshot),
+                                                     0, NULL) ?:
+                       bch2_btree_delete_range_trans(trans, BTREE_ID_xattrs,
+                                                     SPOS(inum, 0, snapshot),
+                                                     SPOS(inum, U64_MAX, snapshot),
+                                                     0, NULL);
+       } while (ret == -BCH_ERR_transaction_restart_nested);
        if (ret)
                goto err;
 retry: