From a965ef4986243bb0490d5af0ae202e81871554e1 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Wed, 15 Jan 2020 22:53:49 -0500 Subject: [PATCH] bcachefs: Fix bch2_sort_keys() to not modify src keys Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- fs/bcachefs/bkey_sort.c | 18 +++++++----------- fs/bcachefs/bset.h | 6 ------ fs/bcachefs/btree_iter.c | 6 ------ 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/fs/bcachefs/bkey_sort.c b/fs/bcachefs/bkey_sort.c index 18f842012f05..1c8e5a80e32a 100644 --- a/fs/bcachefs/bkey_sort.c +++ b/fs/bcachefs/bkey_sort.c @@ -254,23 +254,18 @@ unsigned bch2_sort_keys(struct bkey_packed *dst, sort_iter_sort(iter, sort_keys_cmp); while ((in = sort_iter_next(iter, sort_keys_cmp))) { + bool needs_whiteout = false; + if (bkey_whiteout(in) && (filter_whiteouts || !in->needs_whiteout)) continue; - if (bkey_whiteout(in) && - (next = sort_iter_peek(iter)) && - !bkey_cmp_packed(iter->b, in, next)) { + while ((next = sort_iter_peek(iter)) && + !bkey_cmp_packed(iter->b, in, next)) { BUG_ON(in->needs_whiteout && next->needs_whiteout); - /* - * XXX racy, called with read lock from write path - * - * leads to spurious BUG_ON() in bkey_unpack_key() in - * debug mode - */ - next->needs_whiteout |= in->needs_whiteout; - continue; + needs_whiteout |= in->needs_whiteout; + in = sort_iter_next(iter, sort_keys_cmp); } if (bkey_whiteout(in)) { @@ -279,6 +274,7 @@ unsigned bch2_sort_keys(struct bkey_packed *dst, } else { bkey_copy(out, in); } + out->needs_whiteout |= needs_whiteout; out = bkey_next(out); } diff --git a/fs/bcachefs/bset.h b/fs/bcachefs/bset.h index 5c3c5fbea4b7..50d0ce7d1afa 100644 --- a/fs/bcachefs/bset.h +++ b/fs/bcachefs/bset.h @@ -199,12 +199,6 @@ __bkey_unpack_key_format_checked(const struct btree *b, if (btree_keys_expensive_checks(b)) { struct bkey dst2 = __bch2_bkey_unpack_key(&b->format, src); - /* - * hack around a harmless race when compacting whiteouts - * for a write: - */ - dst2.needs_whiteout = dst->needs_whiteout; - BUG_ON(memcmp(dst, &dst2, sizeof(*dst))); } } diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index d1e83cfba47f..5e220284b0b3 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1339,12 +1339,6 @@ static inline struct bkey_s_c btree_iter_peek_uptodate(struct btree_iter *iter) if (debug_check_iterators(iter->trans->c)) { struct bkey k = bkey_unpack_key(l->b, _k); - /* - * this flag is internal to the btree code, - * we don't care if it doesn't match - if it's now set - * it just means the key has been written out to disk: - */ - k.needs_whiteout = iter->k.needs_whiteout; BUG_ON(memcmp(&k, &iter->k, sizeof(k))); }