]> www.infradead.org Git - linux.git/commitdiff
bcachefs: bch2_xattr_list() -> 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/xattr.c

index 4b5898d3eda0ec9249c907ad5f6d6640a500d1ba..9f810fb36ba1b24676b833241a82ef961eec810a 100644 (file)
@@ -295,54 +295,23 @@ ssize_t bch2_xattr_list(struct dentry *dentry, char *buffer, size_t buffer_size)
 {
        struct bch_fs *c = dentry->d_sb->s_fs_info;
        struct bch_inode_info *inode = to_bch_ei(dentry->d_inode);
-       struct btree_trans *trans = bch2_trans_get(c);
-       struct btree_iter iter;
-       struct bkey_s_c k;
        struct xattr_buf buf = { .buf = buffer, .len = buffer_size };
        u64 offset = 0, inum = inode->ei_inode.bi_inum;
-       u32 snapshot;
-       int ret;
-retry:
-       bch2_trans_begin(trans);
-       iter = (struct btree_iter) { NULL };
 
-       ret = bch2_subvolume_get_snapshot(trans, inode->ei_inum.subvol, &snapshot);
-       if (ret)
-               goto err;
-
-       for_each_btree_key_upto_norestart(trans, iter, BTREE_ID_xattrs,
-                          SPOS(inum, offset, snapshot),
-                          POS(inum, U64_MAX), 0, k, ret) {
-               if (k.k->type != KEY_TYPE_xattr)
-                       continue;
+       int ret = bch2_trans_run(c,
+               for_each_btree_key_in_subvolume_upto(trans, iter, BTREE_ID_xattrs,
+                                  POS(inum, offset),
+                                  POS(inum, U64_MAX),
+                                  inode->ei_inum.subvol, 0, k, ({
+                       if (k.k->type != KEY_TYPE_xattr)
+                               continue;
 
-               ret = bch2_xattr_emit(dentry, bkey_s_c_to_xattr(k).v, &buf);
-               if (ret)
-                       break;
-       }
+                       bch2_xattr_emit(dentry, bkey_s_c_to_xattr(k).v, &buf);
+               }))) ?:
+               bch2_xattr_list_bcachefs(c, &inode->ei_inode, &buf, false) ?:
+               bch2_xattr_list_bcachefs(c, &inode->ei_inode, &buf, true);
 
-       offset = iter.pos.offset;
-       bch2_trans_iter_exit(trans, &iter);
-err:
-       if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
-               goto retry;
-
-       bch2_trans_put(trans);
-
-       if (ret)
-               goto out;
-
-       ret = bch2_xattr_list_bcachefs(c, &inode->ei_inode, &buf, false);
-       if (ret)
-               goto out;
-
-       ret = bch2_xattr_list_bcachefs(c, &inode->ei_inode, &buf, true);
-       if (ret)
-               goto out;
-
-       return buf.used;
-out:
-       return bch2_err_class(ret);
+       return ret ? bch2_err_class(ret) : buf.used;
 }
 
 static int bch2_xattr_get_handler(const struct xattr_handler *handler,