]> www.infradead.org Git - linux.git/commitdiff
bcachefs: quota_reserve_range() -> for_each_btree_key_in_subvolume_upto
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 17 Jul 2024 17:24:28 +0000 (13:24 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 9 Sep 2024 13:41:48 +0000 (09:41 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs-io.c

index 4359fde8660325dd69ccc7d7c03ce04523b0f2b4..71d0fa3875094b3b98d946273148f25cef5a778a 100644 (file)
@@ -794,41 +794,23 @@ static int quota_reserve_range(struct bch_inode_info *inode,
                               u64 start, u64 end)
 {
        struct bch_fs *c = inode->v.i_sb->s_fs_info;
-       struct btree_trans *trans = bch2_trans_get(c);
-       struct btree_iter iter;
-       struct bkey_s_c k;
-       u32 snapshot;
        u64 sectors = end - start;
-       u64 pos = start;
-       int ret;
-retry:
-       bch2_trans_begin(trans);
-
-       ret = bch2_subvolume_get_snapshot(trans, inode->ei_inum.subvol, &snapshot);
-       if (ret)
-               goto err;
 
-       bch2_trans_iter_init(trans, &iter, BTREE_ID_extents,
-                            SPOS(inode->v.i_ino, pos, snapshot), 0);
-
-       while (!(ret = btree_trans_too_many_iters(trans)) &&
-              (k = bch2_btree_iter_peek_upto(&iter, POS(inode->v.i_ino, end - 1))).k &&
-              !(ret = bkey_err(k))) {
-               if (bkey_extent_is_allocation(k.k)) {
-                       u64 s = min(end, k.k->p.offset) -
-                               max(start, bkey_start_offset(k.k));
-                       BUG_ON(s > sectors);
-                       sectors -= s;
-               }
-               bch2_btree_iter_advance(&iter);
-       }
-       pos = iter.pos.offset;
-       bch2_trans_iter_exit(trans, &iter);
-err:
-       if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
-               goto retry;
+       int ret = bch2_trans_run(c,
+               for_each_btree_key_in_subvolume_upto(trans, iter,
+                               BTREE_ID_extents,
+                               POS(inode->v.i_ino, start),
+                               POS(inode->v.i_ino, end - 1),
+                               inode->ei_inum.subvol, 0, k, ({
+                       if (bkey_extent_is_allocation(k.k)) {
+                               u64 s = min(end, k.k->p.offset) -
+                                       max(start, bkey_start_offset(k.k));
+                               BUG_ON(s > sectors);
+                               sectors -= s;
+                       }
 
-       bch2_trans_put(trans);
+                       0;
+               })));
 
        return ret ?: bch2_quota_reservation_add(c, inode, res, sectors, true);
 }