Commit 4e1ec2cc authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Simplify bch2_write_inode_trans, fix lockdep splat

ei_update_lock isn't currently needed for write inode (but it will be
needed again when deferred btree updates are used for inode updates)
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent af1c6871
...@@ -355,8 +355,6 @@ bchfs_extent_update_hook(struct extent_insert_hook *hook, ...@@ -355,8 +355,6 @@ bchfs_extent_update_hook(struct extent_insert_hook *hook,
h->inode_u.bi_size = offset; h->inode_u.bi_size = offset;
do_pack = true; do_pack = true;
inode->ei_inode.bi_size = offset;
spin_lock(&inode->v.i_lock); spin_lock(&inode->v.i_lock);
if (offset > inode->v.i_size) { if (offset > inode->v.i_size) {
if (h->op->is_dio) if (h->op->is_dio)
...@@ -478,6 +476,7 @@ static int bchfs_write_index_update(struct bch_write_op *wop) ...@@ -478,6 +476,7 @@ static int bchfs_write_index_update(struct bch_write_op *wop)
&hook.hook, op_journal_seq(wop), &hook.hook, op_journal_seq(wop),
BTREE_INSERT_NOFAIL| BTREE_INSERT_NOFAIL|
BTREE_INSERT_ATOMIC| BTREE_INSERT_ATOMIC|
BTREE_INSERT_NOUNLOCK|
BTREE_INSERT_USE_RESERVE, BTREE_INSERT_USE_RESERVE,
BTREE_INSERT_ENTRY(extent_iter, k)); BTREE_INSERT_ENTRY(extent_iter, k));
} }
...@@ -493,6 +492,9 @@ static int bchfs_write_index_update(struct bch_write_op *wop) ...@@ -493,6 +492,9 @@ static int bchfs_write_index_update(struct bch_write_op *wop)
if (ret) if (ret)
break; break;
if (hook.need_inode_update)
op->inode->ei_inode = hook.inode_u;
BUG_ON(bkey_cmp(extent_iter->pos, k->k.p) < 0); BUG_ON(bkey_cmp(extent_iter->pos, k->k.p) < 0);
bch2_keylist_pop_front(keys); bch2_keylist_pop_front(keys);
} while (!bch2_keylist_empty(keys)); } while (!bch2_keylist_empty(keys));
......
...@@ -157,35 +157,20 @@ int __must_check bch2_write_inode_trans(struct btree_trans *trans, ...@@ -157,35 +157,20 @@ int __must_check bch2_write_inode_trans(struct btree_trans *trans,
{ {
struct btree_iter *iter; struct btree_iter *iter;
struct bkey_inode_buf *inode_p; struct bkey_inode_buf *inode_p;
struct bkey_s_c k;
u64 inum = inode->v.i_ino;
int ret; int ret;
lockdep_assert_held(&inode->ei_update_lock); iter = bch2_trans_get_iter(trans, BTREE_ID_INODES,
POS(inode->v.i_ino, 0),
iter = bch2_trans_get_iter(trans, BTREE_ID_INODES, POS(inum, 0), BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
if (IS_ERR(iter)) if (IS_ERR(iter))
return PTR_ERR(iter); return PTR_ERR(iter);
k = bch2_btree_iter_peek_slot(iter); /* The btree node lock is our lock on the inode: */
if ((ret = btree_iter_err(k))) ret = bch2_btree_iter_traverse(iter);
if (ret)
return ret; return ret;
if (WARN_ONCE(k.k->type != BCH_INODE_FS, *inode_u = inode->ei_inode;
"inode %llu not found when updating", inum))
return -ENOENT;
ret = bch2_inode_unpack(bkey_s_c_to_inode(k), inode_u);
if (WARN_ONCE(ret,
"error %i unpacking inode %llu", ret, inum))
return -ENOENT;
BUG_ON(inode_u->bi_size != inode->ei_inode.bi_size);
BUG_ON(inode_u->bi_size != inode->ei_inode.bi_size &&
!(inode_u->bi_flags & BCH_INODE_I_SIZE_DIRTY) &&
inode_u->bi_size > i_size_read(&inode->v));
if (set) { if (set) {
ret = set(inode, inode_u, p); ret = set(inode, inode_u, p);
...@@ -505,8 +490,6 @@ static int __bch2_link(struct bch_fs *c, ...@@ -505,8 +490,6 @@ static int __bch2_link(struct bch_fs *c,
struct bch_inode_unpacked inode_u; struct bch_inode_unpacked inode_u;
int ret; int ret;
lockdep_assert_held(&inode->v.i_rwsem);
bch2_trans_init(&trans, c); bch2_trans_init(&trans, c);
retry: retry:
bch2_trans_begin(&trans); bch2_trans_begin(&trans);
...@@ -543,6 +526,8 @@ static int bch2_link(struct dentry *old_dentry, struct inode *vdir, ...@@ -543,6 +526,8 @@ static int bch2_link(struct dentry *old_dentry, struct inode *vdir,
struct bch_inode_info *inode = to_bch_ei(old_dentry->d_inode); struct bch_inode_info *inode = to_bch_ei(old_dentry->d_inode);
int ret; int ret;
lockdep_assert_held(&inode->v.i_rwsem);
ret = __bch2_link(c, inode, dir, dentry); ret = __bch2_link(c, inode, dir, dentry);
if (unlikely(ret)) if (unlikely(ret))
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment