]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: Fix ec_stripes_read()
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 9 Oct 2019 02:56:33 +0000 (22:56 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:29 +0000 (17:08 -0400)
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>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/ec.c

index eb6d712e78448b499228338451cdce55a7f26093..6ba83058384620315c684ac40651157f9cf4b9c2 100644 (file)
@@ -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 {
index 316dd82809ffc66618a3a7d871e99565e570c883..f32b8e6bf2ce7c1c7ac0d157ec6ab874133455d9 100644 (file)
@@ -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;