diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-11-29 03:24:06 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-12-03 11:24:15 -0500 |
commit | e22893b40dba76f544bf4a6af0de6c218da003ab (patch) | |
tree | 473e76387be9f2126eccc1c75e7eb932721f6161 | |
parent | 4420b0249b248919a38ed0df5deae39747131269 (diff) |
bcachefs: Fix a btree iter usage error
previously, if the code traversed to the next btree node, that could
return an error (due to lock restarts) - which was not being checked
for.
fix is to rework it so it never iterates past the current leaf node, and
pops an assertion if it ever sees an error.
-rw-r--r-- | fs/bcachefs/fs-io.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c index 34cfd5d6224e..d90161a103cf 100644 --- a/fs/bcachefs/fs-io.c +++ b/fs/bcachefs/fs-io.c @@ -242,9 +242,15 @@ static s64 sum_sector_overwrites(struct bkey_i *new, struct btree_iter *_iter, bch2_btree_iter_link(_iter, &iter); bch2_btree_iter_copy(&iter, _iter); - for_each_btree_key_continue(&iter, BTREE_ITER_SLOTS, old) { - if (bkey_cmp(new->k.p, bkey_start_pos(old.k)) <= 0) - break; + old = bch2_btree_iter_peek_slot(&iter); + + while (1) { + /* + * should not be possible to get an error here, since we're + * carefully not advancing past @new and thus whatever leaf node + * @_iter currently points to: + */ + BUG_ON(btree_iter_err(old)); if (allocating && !bch2_extent_is_fully_allocated(old)) @@ -256,6 +262,11 @@ static s64 sum_sector_overwrites(struct bkey_i *new, struct btree_iter *_iter, bkey_start_offset(old.k))) * (bkey_extent_is_allocation(&new->k) - bkey_extent_is_allocation(old.k)); + + if (bkey_cmp(old.k->p, new->k.p) >= 0) + break; + + old = bch2_btree_iter_next_slot(&iter); } bch2_btree_iter_unlink(&iter); |