bcachefs: Simplify bch2_inode_delete_keys()
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 27 Dec 2021 23:25:23 +0000 (18:25 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:22 +0000 (17:09 -0400)
Had a bug report that implies bch2_inode_delete_keys() returned -EINTR
before it completed, so this patch simplifies it and makes the flow
control a little more conventional.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/inode.c

index 104575734b96a2a0ee2a68712bd7ba48bc57a95a..79ee9ca2f1d0806cf74033ed4deb861aa9725b61 100644 (file)
@@ -585,62 +585,49 @@ found_slot:
 static int bch2_inode_delete_keys(struct btree_trans *trans,
                                  subvol_inum inum, enum btree_id id)
 {
-       u64 offset = 0;
+       struct btree_iter iter;
+       struct bkey_s_c k;
+       struct bkey_i delete;
+       u32 snapshot;
        int ret = 0;
 
-       while (!ret || ret == -EINTR) {
-               struct disk_reservation disk_res =
-                       bch2_disk_reservation_init(trans->c, 0);
-               struct btree_iter iter;
-               struct bkey_s_c k;
-               struct bkey_i delete;
-               u32 snapshot;
+       /*
+        * We're never going to be deleting extents, no need to use an extent
+        * iterator:
+        */
+       bch2_trans_iter_init(trans, &iter, id, POS(inum.inum, 0),
+                            BTREE_ITER_NOT_EXTENTS|
+                            BTREE_ITER_INTENT);
 
+       while (1) {
                bch2_trans_begin(trans);
 
                ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
                if (ret)
-                       continue;
+                       goto err;
 
-               bch2_trans_iter_init(trans, &iter, id,
-                                    SPOS(inum.inum, offset, snapshot),
-                                    BTREE_ITER_INTENT);
-               k = bch2_btree_iter_peek(&iter);
-
-               if (!k.k || iter.pos.inode != inum.inum) {
-                       bch2_trans_iter_exit(trans, &iter);
-                       break;
-               }
+               bch2_btree_iter_set_snapshot(&iter, snapshot);
 
+               k = bch2_btree_iter_peek(&iter);
                ret = bkey_err(k);
                if (ret)
                        goto err;
 
+               if (!k.k || iter.pos.inode != inum.inum)
+                       break;
+
                bkey_init(&delete.k);
                delete.k.p = iter.pos;
 
-               if (btree_node_type_is_extents(iter.btree_id)) {
-                       unsigned max_sectors =
-                               min_t(u64, U64_MAX - iter.pos.offset,
-                                     KEY_SIZE_MAX & (~0 << trans->c->block_bits));
-
-                       /* create the biggest key we can */
-                       bch2_key_resize(&delete.k, max_sectors);
-
-                       ret = bch2_extent_trim_atomic(trans, &iter, &delete);
-                       if (ret)
-                               goto err;
-               }
-
                ret = bch2_trans_update(trans, &iter, &delete, 0) ?:
-                     bch2_trans_commit(trans, &disk_res, NULL,
+                     bch2_trans_commit(trans, NULL, NULL,
                                        BTREE_INSERT_NOFAIL);
-               bch2_disk_reservation_put(trans->c, &disk_res);
 err:
-               offset = iter.pos.offset;
-               bch2_trans_iter_exit(trans, &iter);
+               if (ret && ret != -EINTR)
+                       break;
        }
 
+       bch2_trans_iter_exit(trans, &iter);
        return ret;
 }