bcachefs: bch2_hash_lookup() now returns bkey_s_c
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 7 Apr 2024 20:16:49 +0000 (16:16 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:17 +0000 (17:29 -0400)
small cleanup

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/acl.c
fs/bcachefs/dirent.c
fs/bcachefs/fs.c
fs/bcachefs/fsck.c
fs/bcachefs/str_hash.h
fs/bcachefs/xattr.c

index 5c180fdc3efbdf09791c7941f3f1522cd6d6f9dc..b4b112e33be4c54ebd302663b94d1c64cb8d002a 100644 (file)
@@ -282,18 +282,12 @@ struct posix_acl *bch2_get_acl(struct mnt_idmap *idmap,
        struct btree_trans *trans = bch2_trans_get(c);
        struct btree_iter iter = { NULL };
        struct posix_acl *acl = NULL;
-       struct bkey_s_c k;
-       int ret;
 retry:
        bch2_trans_begin(trans);
 
-       ret = bch2_hash_lookup(trans, &iter, bch2_xattr_hash_desc,
-                       &hash, inode_inum(inode), &search, 0);
-       if (ret)
-               goto err;
-
-       k = bch2_btree_iter_peek_slot(&iter);
-       ret = bkey_err(k);
+       struct bkey_s_c k = bch2_hash_lookup(trans, &iter, bch2_xattr_hash_desc,
+                                            &hash, inode_inum(inode), &search, 0);
+       int ret = bkey_err(k);
        if (ret)
                goto err;
 
@@ -414,39 +408,30 @@ int bch2_acl_chmod(struct btree_trans *trans, subvol_inum inum,
        struct bch_hash_info hash_info = bch2_hash_info_init(trans->c, inode);
        struct xattr_search_key search = X_SEARCH(KEY_TYPE_XATTR_INDEX_POSIX_ACL_ACCESS, "", 0);
        struct btree_iter iter;
-       struct bkey_s_c_xattr xattr;
-       struct bkey_i_xattr *new;
        struct posix_acl *acl = NULL;
-       struct bkey_s_c k;
-       int ret;
 
-       ret = bch2_hash_lookup(trans, &iter, bch2_xattr_hash_desc,
+       struct bkey_s_c k = bch2_hash_lookup(trans, &iter, bch2_xattr_hash_desc,
                               &hash_info, inum, &search, BTREE_ITER_INTENT);
+       int ret = bkey_err(k);
        if (ret)
                return bch2_err_matches(ret, ENOENT) ? 0 : ret;
 
-       k = bch2_btree_iter_peek_slot(&iter);
-       ret = bkey_err(k);
-       if (ret)
-               goto err;
-       xattr = bkey_s_c_to_xattr(k);
+       struct bkey_s_c_xattr xattr = bkey_s_c_to_xattr(k);
 
        acl = bch2_acl_from_disk(trans, xattr_val(xattr.v),
                        le16_to_cpu(xattr.v->x_val_len));
        ret = PTR_ERR_OR_ZERO(acl);
-       if (IS_ERR_OR_NULL(acl))
+       if (ret)
                goto err;
 
-       ret = allocate_dropping_locks_errcode(trans,
-                               __posix_acl_chmod(&acl, _gfp, mode));
+       ret = allocate_dropping_locks_errcode(trans, __posix_acl_chmod(&acl, _gfp, mode));
        if (ret)
                goto err;
 
-       new = bch2_acl_to_xattr(trans, acl, ACL_TYPE_ACCESS);
-       if (IS_ERR(new)) {
-               ret = PTR_ERR(new);
+       struct bkey_i_xattr *new = bch2_acl_to_xattr(trans, acl, ACL_TYPE_ACCESS);
+       ret = PTR_ERR_OR_ZERO(new);
+       if (ret)
                goto err;
-       }
 
        new->k.p = iter.pos;
        ret = bch2_trans_update(trans, &iter, &new->k_i, 0);
index d37bd07afbfe4088ebb9b92feb56ff86127ae1ab..d4e3ca5045d61353286be59425c00f017266e23c 100644 (file)
@@ -301,13 +301,9 @@ int bch2_dirent_rename(struct btree_trans *trans,
        memset(dst_inum, 0, sizeof(*dst_inum));
 
        /* Lookup src: */
-       ret = bch2_hash_lookup(trans, &src_iter, bch2_dirent_hash_desc,
-                              src_hash, src_dir, src_name,
-                              BTREE_ITER_INTENT);
-       if (ret)
-               goto out;
-
-       old_src = bch2_btree_iter_peek_slot(&src_iter);
+       old_src = bch2_hash_lookup(trans, &src_iter, bch2_dirent_hash_desc,
+                                  src_hash, src_dir, src_name,
+                                  BTREE_ITER_INTENT);
        ret = bkey_err(old_src);
        if (ret)
                goto out;
@@ -329,13 +325,9 @@ int bch2_dirent_rename(struct btree_trans *trans,
                if (ret)
                        goto out;
        } else {
-               ret = bch2_hash_lookup(trans, &dst_iter, bch2_dirent_hash_desc,
-                                      dst_hash, dst_dir, dst_name,
-                                      BTREE_ITER_INTENT);
-               if (ret)
-                       goto out;
-
-               old_dst = bch2_btree_iter_peek_slot(&dst_iter);
+               old_dst = bch2_hash_lookup(trans, &dst_iter, bch2_dirent_hash_desc,
+                                           dst_hash, dst_dir, dst_name,
+                                           BTREE_ITER_INTENT);
                ret = bkey_err(old_dst);
                if (ret)
                        goto out;
@@ -479,13 +471,9 @@ int bch2_dirent_lookup_trans(struct btree_trans *trans,
                             const struct qstr *name, subvol_inum *inum,
                             unsigned flags)
 {
-       int ret = bch2_hash_lookup(trans, iter, bch2_dirent_hash_desc,
-                                  hash_info, dir, name, flags);
-       if (ret)
-               return ret;
-
-       struct bkey_s_c k = bch2_btree_iter_peek_slot(iter);
-       ret = bkey_err(k);
+       struct bkey_s_c k = bch2_hash_lookup(trans, iter, bch2_dirent_hash_desc,
+                                            hash_info, dir, name, flags);
+       int ret = bkey_err(k);
        if (ret)
                goto err;
 
index 6f114803c6f23951189872cedf0f41144fa81b07..3d15275909bd2b97af25ee66794d05dee921d40f 100644 (file)
@@ -377,16 +377,12 @@ static struct bch_inode_info *bch2_lookup_trans(struct btree_trans *trans,
        struct btree_iter dirent_iter = {};
        subvol_inum inum = {};
 
-       int ret = bch2_hash_lookup(trans, &dirent_iter, bch2_dirent_hash_desc,
-                                  dir_hash_info, dir, name, 0);
+       struct bkey_s_c k = bch2_hash_lookup(trans, &dirent_iter, bch2_dirent_hash_desc,
+                                            dir_hash_info, dir, name, 0);
+       int ret = bkey_err(k);
        if (ret)
                return ERR_PTR(ret);
 
-       struct bkey_s_c k = bch2_btree_iter_peek_slot(&dirent_iter);
-       ret = bkey_err(k);
-       if (ret)
-               goto err;
-
        ret = bch2_dirent_read_target(trans, dir, bkey_s_c_to_dirent(k), &inum);
        if (ret > 0)
                ret = -ENOENT;
index 8e2010212cc371ddb53e651fb355ca376ee60f4b..caef81aa618c9a22fd95c1b0bc7418c0084005c7 100644 (file)
@@ -127,13 +127,13 @@ static int lookup_dirent_in_snapshot(struct btree_trans *trans,
                           u64 *target, unsigned *type, u32 snapshot)
 {
        struct btree_iter iter;
-       struct bkey_s_c_dirent d;
-       int ret = bch2_hash_lookup_in_snapshot(trans, &iter, bch2_dirent_hash_desc,
-                              &hash_info, dir, name, 0, snapshot);
+       struct bkey_s_c k = bch2_hash_lookup_in_snapshot(trans, &iter, bch2_dirent_hash_desc,
+                                                        &hash_info, dir, name, 0, snapshot);
+       int ret = bkey_err(k);
        if (ret)
                return ret;
 
-       d = bkey_s_c_to_dirent(bch2_btree_iter_peek_slot(&iter));
+       struct bkey_s_c_dirent d = bkey_s_c_to_dirent(bch2_btree_iter_peek_slot(&iter));
        *target = le64_to_cpu(d.v->d_inum);
        *type = d.v->d_type;
        bch2_trans_iter_exit(trans, &iter);
index 3976f80721bf1b40736a3d882c9f841fa7ab961b..11f5f5d27d23d0338f71fec556149844b005011d 100644 (file)
@@ -159,7 +159,7 @@ static inline bool is_visible_key(struct bch_hash_desc desc, subvol_inum inum, s
                 desc.is_visible(inum, k));
 }
 
-static __always_inline int
+static __always_inline struct bkey_s_c
 bch2_hash_lookup_in_snapshot(struct btree_trans *trans,
                 struct btree_iter *iter,
                 const struct bch_hash_desc desc,
@@ -176,7 +176,7 @@ bch2_hash_lookup_in_snapshot(struct btree_trans *trans,
                           BTREE_ITER_SLOTS|flags, k, ret) {
                if (is_visible_key(desc, inum, k)) {
                        if (!desc.cmp_key(k, key))
-                               return 0;
+                               return k;
                } else if (k.k->type == KEY_TYPE_hash_whiteout) {
                        ;
                } else {
@@ -186,10 +186,10 @@ bch2_hash_lookup_in_snapshot(struct btree_trans *trans,
        }
        bch2_trans_iter_exit(trans, iter);
 
-       return ret ?: -BCH_ERR_ENOENT_str_hash_lookup;
+       return bkey_s_c_err(ret ?: -BCH_ERR_ENOENT_str_hash_lookup);
 }
 
-static __always_inline int
+static __always_inline struct bkey_s_c
 bch2_hash_lookup(struct btree_trans *trans,
                 struct btree_iter *iter,
                 const struct bch_hash_desc desc,
@@ -198,8 +198,11 @@ bch2_hash_lookup(struct btree_trans *trans,
                 unsigned flags)
 {
        u32 snapshot;
-       return  bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot) ?:
-               bch2_hash_lookup_in_snapshot(trans, iter, desc, info, inum, key, flags, snapshot);
+       int ret = bch2_subvolume_get_snapshot(trans, inum.subvol, &snapshot);
+       if (ret)
+               return bkey_s_c_err(ret);
+
+       return bch2_hash_lookup_in_snapshot(trans, iter, desc, info, inum, key, flags, snapshot);
 }
 
 static __always_inline int
@@ -369,14 +372,10 @@ int bch2_hash_delete(struct btree_trans *trans,
                     subvol_inum inum, const void *key)
 {
        struct btree_iter iter;
-       int ret;
-
-       ret = bch2_hash_lookup(trans, &iter, desc, info, inum, key,
-                               BTREE_ITER_INTENT);
-       if (ret)
-               return ret;
-
-       ret = bch2_hash_delete_at(trans, desc, info, &iter, 0);
+       struct bkey_s_c k = bch2_hash_lookup(trans, &iter, desc, info, inum, key,
+                                            BTREE_ITER_INTENT);
+       int ret = bkey_err(k) ?:
+                 bch2_hash_delete_at(trans, desc, info, &iter, 0);
        bch2_trans_iter_exit(trans, &iter);
        return ret;
 }
index 4b3a2df2da3231bcca57d38557744c04ddf80538..d787f1d4cc780165a73c55b4fbafd3738318d0a6 100644 (file)
@@ -144,21 +144,13 @@ static int bch2_xattr_get_trans(struct btree_trans *trans, struct bch_inode_info
        struct bch_hash_info hash = bch2_hash_info_init(trans->c, &inode->ei_inode);
        struct xattr_search_key search = X_SEARCH(type, name, strlen(name));
        struct btree_iter iter;
-       struct bkey_s_c_xattr xattr;
-       struct bkey_s_c k;
-       int ret;
-
-       ret = bch2_hash_lookup(trans, &iter, bch2_xattr_hash_desc, &hash,
-                              inode_inum(inode), &search, 0);
-       if (ret)
-               goto err1;
-
-       k = bch2_btree_iter_peek_slot(&iter);
-       ret = bkey_err(k);
+       struct bkey_s_c k = bch2_hash_lookup(trans, &iter, bch2_xattr_hash_desc, &hash,
+                                            inode_inum(inode), &search, 0);
+       int ret = bkey_err(k);
        if (ret)
-               goto err2;
+               return ret;
 
-       xattr = bkey_s_c_to_xattr(k);
+       struct bkey_s_c_xattr xattr = bkey_s_c_to_xattr(k);
        ret = le16_to_cpu(xattr.v->x_val_len);
        if (buffer) {
                if (ret > size)
@@ -166,10 +158,8 @@ static int bch2_xattr_get_trans(struct btree_trans *trans, struct bch_inode_info
                else
                        memcpy(buffer, xattr_val(xattr.v), ret);
        }
-err2:
        bch2_trans_iter_exit(trans, &iter);
-err1:
-       return ret < 0 && bch2_err_matches(ret, ENOENT) ? -ENODATA : ret;
+       return ret;
 }
 
 int bch2_xattr_set(struct btree_trans *trans, subvol_inum inum,
@@ -365,6 +355,9 @@ static int bch2_xattr_get_handler(const struct xattr_handler *handler,
        int ret = bch2_trans_do(c, NULL, NULL, 0,
                bch2_xattr_get_trans(trans, inode, name, buffer, size, handler->flags));
 
+       if (ret < 0 && bch2_err_matches(ret, ENOENT))
+               ret = -ENODATA;
+
        return bch2_err_class(ret);
 }