From be9fecdcdaf730dbf2ca70dbe5b6d42922df50d6 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 22 May 2025 18:12:54 -0400 Subject: [PATCH] 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 --- fs/bcachefs/btree_locking.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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; -- 2.39.5