From: Kent Overstreet Date: Mon, 8 Mar 2021 22:09:13 +0000 (-0500) Subject: bcachefs: Fix locking in bch2_btree_iter_traverse_cached() X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=53b3e3c0e2f14f661cd61bbc9b82dc9383f783b9;p=linux.git bcachefs: Fix locking in bch2_btree_iter_traverse_cached() bch2_btree_iter_traverse() is supposed to ensure we have the correct type of lock - it was downgrading if necessary, but if we entered with a read lock it wasn't upgrading to an intent lock, oops. Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c index 6dc13fa3d1f4e..76f19f86c8adb 100644 --- a/fs/bcachefs/btree_key_cache.c +++ b/fs/bcachefs/btree_key_cache.c @@ -298,7 +298,14 @@ fill: set_bit(BKEY_CACHED_ACCESSED, &ck->flags); iter->uptodate = BTREE_ITER_NEED_PEEK; - bch2_btree_iter_downgrade(iter); + + if (!(iter->flags & BTREE_ITER_INTENT)) + bch2_btree_iter_downgrade(iter); + else if (!iter->locks_want) { + if (!__bch2_btree_iter_upgrade(iter, 1)) + ret = -EINTR; + } + return ret; err: if (ret != -EINTR) {