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