From: Kent Overstreet Date: Thu, 22 May 2025 22:12:54 +0000 (-0400) Subject: bcachefs: bch2_path_get() reuses paths if upgrade_fails & !should_be_locked X-Git-Tag: v6.16-rc1~211^2~12 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be9fecdcdaf730dbf2ca70dbe5b6d42922df50d6;p=thirdparty%2Flinux.git bcachefs: bch2_path_get() reuses paths if upgrade_fails & !should_be_locked Small additional optimization over the previous patch, bringing us closer to the original behaviour, except when we need to clone to avoid a transaction restart. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/btree_locking.c b/fs/bcachefs/btree_locking.c index 6e43269a9c47a..78f485ed17469 100644 --- a/fs/bcachefs/btree_locking.c +++ b/fs/bcachefs/btree_locking.c @@ -628,8 +628,13 @@ bool __bch2_btree_path_upgrade_norestart(struct btree_trans *trans, { path->locks_want = new_locks_want; - struct get_locks_fail f = {}; - bool ret = !btree_path_get_locks(trans, path, true, &f, 0); + /* + * If we need it locked, we can't touch it. Otherwise, we can return + * success - bch2_path_get() will use this path, and it'll just be + * retraversed: + */ + bool ret = !btree_path_get_locks(trans, path, true, NULL, 0) || + !path->should_be_locked; bch2_btree_path_verify_locks(path); return ret;