From: Kent Overstreet Date: Tue, 23 Aug 2022 03:39:23 +0000 (-0400) Subject: bcachefs: bch2_btree_node_lock_write_nofail() X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=d5024b011cb37b03aeeddd4b38857db427a04f11;p=linux.git bcachefs: bch2_btree_node_lock_write_nofail() Taking a write lock will be able to fail, with the new cycle detector - unless we pass it nofail, which is possible but not preferred. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c index 38a66302d6e9f..94979b1a4912c 100644 --- a/fs/bcachefs/btree_key_cache.c +++ b/fs/bcachefs/btree_key_cache.c @@ -342,11 +342,12 @@ static int btree_key_cache_fill(struct btree_trans *trans, } } - /* - * XXX: not allowed to be holding read locks when we take a write lock, - * currently - */ - bch2_btree_node_lock_write(trans, ck_path, ck_path->l[0].b); + ret = bch2_btree_node_lock_write(trans, ck_path, ck_path->l[0].b); + if (ret) { + kfree(new_k); + goto err; + } + if (new_k) { kfree(ck->k); ck->u64s = new_u64s; diff --git a/fs/bcachefs/btree_locking.h b/fs/bcachefs/btree_locking.h index 32c28c1341e97..6eaf44fd3f37b 100644 --- a/fs/bcachefs/btree_locking.h +++ b/fs/bcachefs/btree_locking.h @@ -281,7 +281,7 @@ static inline int btree_node_lock(struct btree_trans *trans, void __bch2_btree_node_lock_write(struct btree_trans *, struct btree *); -static inline void bch2_btree_node_lock_write(struct btree_trans *trans, +static inline void bch2_btree_node_lock_write_nofail(struct btree_trans *trans, struct btree_path *path, struct btree *b) { @@ -300,6 +300,15 @@ static inline void bch2_btree_node_lock_write(struct btree_trans *trans, __bch2_btree_node_lock_write(trans, b); } +static inline int __must_check +bch2_btree_node_lock_write(struct btree_trans *trans, + struct btree_path *path, + struct btree *b) +{ + bch2_btree_node_lock_write_nofail(trans, path, b); + return 0; +} + /* relock: */ bool bch2_btree_path_relock_norestart(struct btree_trans *, diff --git a/fs/bcachefs/btree_update_interior.c b/fs/bcachefs/btree_update_interior.c index 6fe49766c6c84..db45883d27ceb 100644 --- a/fs/bcachefs/btree_update_interior.c +++ b/fs/bcachefs/btree_update_interior.c @@ -1163,7 +1163,7 @@ static void bch2_btree_set_root(struct btree_update *as, * Ensure no one is using the old root while we switch to the * new root: */ - bch2_btree_node_lock_write(trans, path, old); + bch2_btree_node_lock_write_nofail(trans, path, old); bch2_btree_set_root_inmem(c, b); @@ -2002,7 +2002,7 @@ static int __bch2_btree_node_update_key(struct btree_trans *trans, if (ret) goto err; - bch2_btree_node_lock_write(trans, iter->path, b); + bch2_btree_node_lock_write_nofail(trans, iter->path, b); if (new_hash) { mutex_lock(&c->btree_cache.lock); diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index d414cbefa3c95..3efec0b304669 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -81,7 +81,7 @@ void bch2_btree_node_lock_for_insert(struct btree_trans *trans, struct btree_path *path, struct btree *b) { - bch2_btree_node_lock_write(trans, path, b); + bch2_btree_node_lock_write_nofail(trans, path, b); bch2_btree_node_prep_for_write(trans, path, b); }