From 6988e85be525b874745824622bae4209c265dc5a Mon Sep 17 00:00:00 2001 From: Kent Overstreet <kent.overstreet@gmail.com> Date: Wed, 25 Sep 2019 23:11:41 -0400 Subject: [PATCH] bcachefs: Trust inode in btree over bch_inode_info 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 | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c index 166d94e5e59de..0a83d5f61a6bc 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -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; } -- 2.30.2