summaryrefslogtreecommitdiff
path: root/fs/bcachefs/ec.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-10-08 22:56:33 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:29 -0400
commit9ec211b0ff4019407d029c49099f24dfedbc4db1 (patch)
tree01849eeed2760a90610220bcc601d0f2d0bbcbf8 /fs/bcachefs/ec.c
parent37954a275fce612f60406bc79f5bc0b07b4b6558 (diff)
downloadlwn-9ec211b0ff4019407d029c49099f24dfedbc4db1.tar.gz
lwn-9ec211b0ff4019407d029c49099f24dfedbc4db1.zip
bcachefs: Fix ec_stripes_read()
The bkey_s_c returned by btree_iter_(peek|next) points into the btree iter type, so advancing the iterator and then using the one previously returned is a bug... Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/ec.c')
-rw-r--r--fs/bcachefs/ec.c32
1 files changed, 14 insertions, 18 deletions
diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c
index 316dd82809ff..f32b8e6bf2ce 100644
--- a/fs/bcachefs/ec.c
+++ b/fs/bcachefs/ec.c
@@ -135,8 +135,6 @@ void bch2_stripe_to_text(struct printbuf *out, struct bch_fs *c,
pr_buf(out, " %u:%llu:%u", s->ptrs[i].dev,
(u64) s->ptrs[i].offset,
stripe_blockcount_get(s, i));
-
- bch2_bkey_ptrs_to_text(out, c, k);
}
static int ptr_matches_stripe(struct bch_fs *c,
@@ -1277,7 +1275,7 @@ int bch2_stripes_read(struct bch_fs *c, struct journal_keys *journal_keys)
struct btree_trans trans;
struct btree_iter *btree_iter;
struct journal_iter journal_iter;
- struct bkey_s_c btree_k, journal_k, k;
+ struct bkey_s_c btree_k, journal_k;
int ret;
ret = bch2_fs_ec_start(c);
@@ -1293,33 +1291,31 @@ int bch2_stripes_read(struct bch_fs *c, struct journal_keys *journal_keys)
journal_k = bch2_journal_iter_peek(&journal_iter);
while (1) {
+ bool btree;
+
if (btree_k.k && journal_k.k) {
int cmp = bkey_cmp(btree_k.k->p, journal_k.k->p);
- if (cmp < 0) {
- k = btree_k;
- btree_k = bch2_btree_iter_next(btree_iter);
- } else if (cmp == 0) {
+ if (!cmp)
btree_k = bch2_btree_iter_next(btree_iter);
- k = journal_k;
- journal_k = bch2_journal_iter_next(&journal_iter);
- } else {
- k = journal_k;
- journal_k = bch2_journal_iter_next(&journal_iter);
- }
+ btree = cmp < 0;
} else if (btree_k.k) {
- k = btree_k;
- btree_k = bch2_btree_iter_next(btree_iter);
+ btree = true;
} else if (journal_k.k) {
- k = journal_k;
- journal_k = bch2_journal_iter_next(&journal_iter);
+ btree = false;
} else {
break;
}
- bch2_mark_key(c, k, 0, 0, NULL, 0,
+ bch2_mark_key(c, btree ? btree_k : journal_k,
+ 0, 0, NULL, 0,
BCH_BUCKET_MARK_ALLOC_READ|
BCH_BUCKET_MARK_NOATOMIC);
+
+ if (btree)
+ btree_k = bch2_btree_iter_next(btree_iter);
+ else
+ journal_k = bch2_journal_iter_next(&journal_iter);
}
ret = bch2_trans_exit(&trans) ?: ret;