mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-15 07:04:44 +00:00
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>
This commit is contained in:
parent
37954a275f
commit
9ec211b0ff
2 changed files with 16 additions and 20 deletions
|
@ -1510,14 +1510,14 @@ LE32_BITMASK(JSET_BIG_ENDIAN, struct jset, flags, 4, 5);
|
|||
|
||||
/* Btree: */
|
||||
|
||||
#define BCH_BTREE_IDS() \
|
||||
#define BCH_BTREE_IDS() \
|
||||
x(EXTENTS, 0, "extents") \
|
||||
x(INODES, 1, "inodes") \
|
||||
x(DIRENTS, 2, "dirents") \
|
||||
x(XATTRS, 3, "xattrs") \
|
||||
x(ALLOC, 4, "alloc") \
|
||||
x(QUOTAS, 5, "quotas") \
|
||||
x(EC, 6, "erasure_coding") \
|
||||
x(EC, 6, "stripes") \
|
||||
x(REFLINK, 7, "reflink")
|
||||
|
||||
enum btree_id {
|
||||
|
|
|
@ -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;
|
||||
if (!cmp)
|
||||
btree_k = bch2_btree_iter_next(btree_iter);
|
||||
} else if (cmp == 0) {
|
||||
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;
|
||||
|
|
Loading…
Reference in a new issue