]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Trust inode in btree over bch_inode_info
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 26 Sep 2019 03:11:41 +0000 (23:11 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:28 +0000 (17:08 -0400)
This is the start of some refactoring work to make less code depend on
the linux VFS - here the inode cache - to make e.g. the fuse port
easier.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/fs.c

index 166d94e5e59ded5cc060d5327b983b8a1bb11e6b..0a83d5f61a6bcb668a98d733139781739f69cac3 100644 (file)
@@ -156,9 +156,8 @@ int __must_check bch2_write_inode_trans(struct btree_trans *trans,
 {
        struct btree_iter *iter = NULL;
        struct bkey_inode_buf *inode_p;
-       int ret;
-
-       lockdep_assert_held(&inode->ei_update_lock);
+       struct bkey_s_c k;
+       int ret = 0;
 
        iter = bch2_trans_get_iter(trans, BTREE_ID_INODES,
                                   POS(inode->v.i_ino, 0),
@@ -166,12 +165,17 @@ int __must_check bch2_write_inode_trans(struct btree_trans *trans,
        if (IS_ERR(iter))
                return PTR_ERR(iter);
 
-       /* The btree node lock is our lock on the inode: */
-       ret = bch2_btree_iter_traverse(iter);
+       k = bch2_btree_iter_peek_slot(iter);
+       ret = bkey_err(k);
        if (ret)
                return ret;
 
-       *inode_u = inode->ei_inode;
+       if (k.k->type != KEY_TYPE_inode)
+               return -EIO;
+
+       ret = bch2_inode_unpack(bkey_s_c_to_inode(k), inode_u);
+       if (ret)
+               return ret;
 
        if (set) {
                ret = set(inode, inode_u, p);
@@ -185,7 +189,6 @@ int __must_check bch2_write_inode_trans(struct btree_trans *trans,
 
        bch2_inode_pack(inode_p, inode_u);
        bch2_trans_update(trans, iter, &inode_p->inode.k_i);
-
        return 0;
 }