diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-07-22 12:39:11 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-07-27 18:11:10 -0400 |
commit | 12d52ae658963cffd9809e8cd96e2d6d20381f46 (patch) | |
tree | 3f9d260a3c5d54869d48c2d1a5322cd08ea2c075 | |
parent | 173f4cdf7ee7121eb64f103cdacdacac62cb4521 (diff) |
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 <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/btree_iter.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 526c9b3d8adb..f156b1d4fd14 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1380,6 +1380,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; |