From: Youling Tang <[email protected]>

- Reduces bkey_err() calls.
- Avoid redundant calls to bch2_trans_iter_exit() in some functions.

Signed-off-by: Youling Tang <[email protected]>
---
 fs/bcachefs/alloc_background.c | 9 +++++----
 fs/bcachefs/btree_iter.h       | 5 ++---
 fs/bcachefs/fsck.c             | 5 +++--
 fs/bcachefs/inode.c            | 4 ++--
 fs/bcachefs/io_write.c         | 2 +-
 fs/bcachefs/lru.c              | 2 +-
 fs/bcachefs/move.c             | 4 +++-
 fs/bcachefs/movinggc.c         | 3 ++-
 fs/bcachefs/quota.c            | 3 ++-
 fs/bcachefs/subvolume.c        | 5 +++--
 10 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c
index fd3a2522bc3e..9ac5c0a62041 100644
--- a/fs/bcachefs/alloc_background.c
+++ b/fs/bcachefs/alloc_background.c
@@ -460,7 +460,7 @@ bch2_trans_start_alloc_update_noupdate(struct btree_trans 
*trans, struct btree_i
                                               BTREE_ITER_intent);
        int ret = bkey_err(k);
        if (unlikely(ret))
-               return ERR_PTR(ret);
+               goto err;
 
        struct bkey_i_alloc_v4 *a = bch2_alloc_to_v4_mut_inlined(trans, k);
        ret = PTR_ERR_OR_ZERO(a);
@@ -693,7 +693,7 @@ static int bch2_bucket_do_index(struct btree_trans *trans,
                             BTREE_ITER_intent);
        ret = bkey_err(old);
        if (ret)
-               return ret;
+               goto err;
 
        if (ca->mi.freespace_initialized &&
            c->curr_recovery_pass > BCH_RECOVERY_PASS_check_alloc_info &&
@@ -738,7 +738,7 @@ static noinline int bch2_bucket_gen_update(struct 
btree_trans *trans,
                               BTREE_ITER_with_updates);
        ret = bkey_err(k);
        if (ret)
-               return ret;
+               goto out;
 
        if (k.k->type != KEY_TYPE_bucket_gens) {
                bkey_bucket_gens_init(&g->k_i);
@@ -750,6 +750,7 @@ static noinline int bch2_bucket_gen_update(struct 
btree_trans *trans,
        g->v.gens[offset] = gen;
 
        ret = bch2_trans_update(trans, &iter, &g->k_i, 0);
+out:
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
@@ -1373,7 +1374,7 @@ static noinline_for_stack int 
bch2_check_discard_freespace_key(struct btree_tran
        alloc_k = bch2_bkey_get_iter(trans, &alloc_iter, BTREE_ID_alloc, pos, 
0);
        ret = bkey_err(alloc_k);
        if (ret)
-               return ret;
+               goto out;
 
        if (fsck_err_on(!bch2_dev_bucket_exists(c, pos),
                        trans, need_discard_freespace_key_to_invalid_dev_bucket,
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
index dca62375d7d3..7fbc5a796c4c 100644
--- a/fs/bcachefs/btree_iter.h
+++ b/fs/bcachefs/btree_iter.h
@@ -552,8 +552,7 @@ static inline struct bkey_s_c __bch2_bkey_get_iter(struct 
btree_trans *trans,
 
        if (!bkey_err(k) && type && k.k->type != type)
                k = bkey_s_c_err(-BCH_ERR_ENOENT_bkey_type_mismatch);
-       if (unlikely(bkey_err(k)))
-               bch2_trans_iter_exit(trans, iter);
+
        return k;
 }
 
@@ -586,9 +585,9 @@ static inline int __bch2_bkey_get_val_typed(struct 
btree_trans *trans,
                memcpy(val, k.v, b);
                if (unlikely(b < sizeof(*val)))
                        memset((void *) val + b, 0, sizeof(*val) - b);
-               bch2_trans_iter_exit(trans, &iter);
        }
 
+       bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
 
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c
index 9138944c5ae6..83a343f1e186 100644
--- a/fs/bcachefs/fsck.c
+++ b/fs/bcachefs/fsck.c
@@ -930,7 +930,7 @@ static int check_inode_dirent_inode(struct btree_trans 
*trans, struct bkey_s_c i
        struct bkey_s_c_dirent d = inode_get_dirent(trans, &dirent_iter, inode, 
&inode_snapshot);
        int ret = bkey_err(d);
        if (ret && !bch2_err_matches(ret, ENOENT))
-               return ret;
+               goto err;
 
        if (fsck_err_on(ret,
                        trans, inode_points_to_missing_dirent,
@@ -955,6 +955,7 @@ static int check_inode_dirent_inode(struct btree_trans 
*trans, struct bkey_s_c i
        }
 
        ret = 0;
+err:
 fsck_err:
        bch2_trans_iter_exit(trans, &dirent_iter);
        printbuf_exit(&buf);
@@ -1971,7 +1972,7 @@ static int check_dirent_to_subvol(struct btree_trans 
*trans, struct btree_iter *
                                         0, subvolume);
        ret = bkey_err(s.s_c);
        if (ret && !bch2_err_matches(ret, ENOENT))
-               return ret;
+               goto out;
 
        if (ret) {
                if (fsck_err(trans, dirent_to_missing_subvol,
diff --git a/fs/bcachefs/inode.c b/fs/bcachefs/inode.c
index 2be6be33afa3..6cb4028f6f60 100644
--- a/fs/bcachefs/inode.c
+++ b/fs/bcachefs/inode.c
@@ -343,7 +343,7 @@ int bch2_inode_peek_nowarn(struct btree_trans *trans,
                               flags|BTREE_ITER_cached);
        ret = bkey_err(k);
        if (ret)
-               return ret;
+               goto err;
 
        ret = bkey_is_inode(k.k) ? 0 : -BCH_ERR_ENOENT_inode;
        if (ret)
@@ -1081,7 +1081,7 @@ static int may_delete_deleted_inode(struct btree_trans 
*trans,
        k = bch2_bkey_get_iter(trans, &inode_iter, BTREE_ID_inodes, pos, 
BTREE_ITER_cached);
        ret = bkey_err(k);
        if (ret)
-               return ret;
+               goto out;
 
        ret = bkey_is_inode(k.k) ? 0 : -BCH_ERR_ENOENT_inode;
        if (fsck_err_on(!bkey_is_inode(k.k),
diff --git a/fs/bcachefs/io_write.c b/fs/bcachefs/io_write.c
index 1d4761d15002..3ba374b47f4b 100644
--- a/fs/bcachefs/io_write.c
+++ b/fs/bcachefs/io_write.c
@@ -219,7 +219,7 @@ static inline int bch2_extent_update_i_size_sectors(struct 
btree_trans *trans,
                              BTREE_ITER_cached);
        int ret = bkey_err(k);
        if (unlikely(ret))
-               return ret;
+               goto err;
 
        /*
         * varint_decode_fast(), in the inode .invalid method, reads up to 7
diff --git a/fs/bcachefs/lru.c b/fs/bcachefs/lru.c
index 96f2f4f8c397..40bc732e996f 100644
--- a/fs/bcachefs/lru.c
+++ b/fs/bcachefs/lru.c
@@ -91,7 +91,7 @@ int bch2_lru_check_set(struct btree_trans *trans,
                                           time), 0);
        int ret = bkey_err(lru_k);
        if (ret)
-               return ret;
+               goto err;
 
        if (lru_k.k->type != KEY_TYPE_set) {
                ret = bch2_btree_write_buffer_maybe_flush(trans, referring_k, 
last_flushed);
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c
index 7d3920e03742..4148fc312ab2 100644
--- a/fs/bcachefs/move.c
+++ b/fs/bcachefs/move.c
@@ -439,8 +439,10 @@ int bch2_move_get_io_opts_one(struct btree_trans *trans,
                               SPOS(0, extent_k.k->p.inode, 
extent_k.k->p.snapshot),
                               BTREE_ITER_cached);
        ret = bkey_err(k);
-       if (bch2_err_matches(ret, BCH_ERR_transaction_restart))
+       if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) {
+               bch2_trans_iter_exit(trans, &iter);
                return ret;
+       }
 
        if (!ret && bkey_is_inode(k.k)) {
                struct bch_inode_unpacked inode;
diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c
index deef4f024d20..7ee2e74eb7fc 100644
--- a/fs/bcachefs/movinggc.c
+++ b/fs/bcachefs/movinggc.c
@@ -88,7 +88,7 @@ static int bch2_bucket_is_movable(struct btree_trans *trans,
                               b->k.bucket, BTREE_ITER_cached);
        ret = bkey_err(k);
        if (ret)
-               return ret;
+               goto out;
 
        a = bch2_alloc_to_v4(k, &_a);
        b->k.gen        = a->gen;
@@ -98,6 +98,7 @@ static int bch2_bucket_is_movable(struct btree_trans *trans,
                a->fragmentation_lru &&
                a->fragmentation_lru <= time;
 
+out:
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
diff --git a/fs/bcachefs/quota.c b/fs/bcachefs/quota.c
index c32a05e252e2..504d39a9da65 100644
--- a/fs/bcachefs/quota.c
+++ b/fs/bcachefs/quota.c
@@ -828,7 +828,7 @@ static int bch2_set_quota_trans(struct btree_trans *trans,
                               BTREE_ITER_slots|BTREE_ITER_intent);
        ret = bkey_err(k);
        if (unlikely(ret))
-               return ret;
+               goto err;
 
        if (k.k->type == KEY_TYPE_quota)
                new_quota->v = *bkey_s_c_to_quota(k).v;
@@ -844,6 +844,7 @@ static int bch2_set_quota_trans(struct btree_trans *trans,
                new_quota->v.c[Q_INO].hardlimit = 
cpu_to_le64(qdq->d_ino_hardlimit);
 
        ret = bch2_trans_update(trans, &iter, &new_quota->k_i, 0);
+err:
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
diff --git a/fs/bcachefs/subvolume.c b/fs/bcachefs/subvolume.c
index dbe834cb349f..c5358f452fc1 100644
--- a/fs/bcachefs/subvolume.c
+++ b/fs/bcachefs/subvolume.c
@@ -419,12 +419,13 @@ static int __bch2_subvolume_delete(struct btree_trans 
*trans, u32 subvolid)
        bch2_fs_inconsistent_on(bch2_err_matches(ret, ENOENT), trans->c,
                                "missing subvolume %u", subvolid);
        if (ret)
-               return ret;
+               goto err;
 
        snapid = le32_to_cpu(subvol.v->snapshot);
 
        ret =   bch2_btree_delete_at(trans, &iter, 0) ?:
                bch2_snapshot_node_set_deleted(trans, snapid);
+err:
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
@@ -648,7 +649,7 @@ static int __bch2_fs_upgrade_for_subvolumes(struct 
btree_trans *trans)
                               SPOS(0, BCACHEFS_ROOT_INO, U32_MAX), 0);
        ret = bkey_err(k);
        if (ret)
-               return ret;
+               goto err;
 
        if (!bkey_is_inode(k.k)) {
                bch_err(trans->c, "root inode not found");
-- 
2.34.1


Reply via email to