From: Kent Overstreet Date: Thu, 22 Jul 2021 16:39:11 +0000 (-0400) Subject: bcachefs: Ensure btree_iter_traverse() obeys iter->should_be_locked X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=e829b7175b54c9ccdf4412baea592bc495bc97f1;p=linux.git bcachefs: Ensure btree_iter_traverse() obeys iter->should_be_locked iter->should_be_locked means that if bch2_btree_iter_relock() fails, we need to restart the transaction. Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index ac7a7c18ebe24..b7292f9320002 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1403,6 +1403,15 @@ static int btree_iter_traverse_one(struct btree_iter *iter, unsigned l, depth_want = iter->level; int ret = 0; + /* + * Ensure we obey iter->should_be_locked: if it's set, we can't unlock + * and re-traverse the iterator without a transaction restart: + */ + if (iter->should_be_locked) { + ret = bch2_btree_iter_relock(iter, trace_ip) ? 0 : -EINTR; + goto out; + } + if (btree_iter_type(iter) == BTREE_ITER_CACHED) { ret = bch2_btree_iter_traverse_cached(iter); goto out;