diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-10-08 22:56:33 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-10-08 23:04:27 -0400 |
commit | 14331cd9b2c3c862d2c8fe7e9b851072d79efab3 (patch) | |
tree | eb3ce7f68ade54a6df6acdfd8d32798047dc5822 | |
parent | 9d24d6a81367108d69bec4a0c4b690b98fc320fe (diff) |
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@gmail.com>
-rw-r--r-- | fs/bcachefs/bcachefs_format.h | 4 | ||||
-rw-r--r-- | fs/bcachefs/ec.c | 32 |
2 files changed, 16 insertions, 20 deletions
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h index d4b04ef0d27d..d619e5caf09b 100644 --- a/fs/bcachefs/bcachefs_format.h +++ b/fs/bcachefs/bcachefs_format.h @@ -1503,14 +1503,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 { diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c index ee9f62abbba6..ad92d3b452c0 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; |