bcachefs: Add missing call to bch2_replicas_entry_sort()
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 2 Feb 2021 20:56:44 +0000 (15:56 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:52 +0000 (17:08 -0400)
This fixes a bug introduced by "bcachefs: Improve diagnostics when
journal entries are missing" - devices in a replicas entry are supposed
to be sorted.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_io.c
fs/bcachefs/replicas.c
fs/bcachefs/replicas.h

index 60cefb4ace45fc62ac3c3ab88e1eea58c0f9d8b3..7e726db7788115cb1bbf907180db99fb02e98d37 100644 (file)
@@ -937,6 +937,8 @@ int bch2_journal_read(struct bch_fs *c, struct list_head *list,
                for (ptr = 0; ptr < i->nr_ptrs; ptr++)
                        replicas.e.devs[replicas.e.nr_devs++] = i->ptrs[ptr].dev;
 
+               bch2_replicas_entry_sort(&replicas.e);
+
                /*
                 * If we're mounting in degraded mode - if we didn't read all
                 * the devices - this is wrong:
index 979e9c2b8c74dd56857b0ec3da70f0d740247272..e5e437deb9abf81f0a4b4e3fada0bfdf184bfb3a 100644 (file)
@@ -26,7 +26,7 @@ static void verify_replicas_entry(struct bch_replicas_entry *e)
 #endif
 }
 
-static void replicas_entry_sort(struct bch_replicas_entry *e)
+void bch2_replicas_entry_sort(struct bch_replicas_entry *e)
 {
        bubble_sort(e->devs, e->nr_devs, u8_cmp);
 }
@@ -122,7 +122,7 @@ void bch2_bkey_to_replicas(struct bch_replicas_entry *e,
                break;
        }
 
-       replicas_entry_sort(e);
+       bch2_replicas_entry_sort(e);
 }
 
 void bch2_devlist_to_replicas(struct bch_replicas_entry *e,
@@ -142,7 +142,7 @@ void bch2_devlist_to_replicas(struct bch_replicas_entry *e,
        for (i = 0; i < devs.nr; i++)
                e->devs[e->nr_devs++] = devs.devs[i];
 
-       replicas_entry_sort(e);
+       bch2_replicas_entry_sort(e);
 }
 
 static struct bch_replicas_cpu
@@ -197,7 +197,7 @@ static inline int __replicas_entry_idx(struct bch_replicas_cpu *r,
 int bch2_replicas_entry_idx(struct bch_fs *c,
                            struct bch_replicas_entry *search)
 {
-       replicas_entry_sort(search);
+       bch2_replicas_entry_sort(search);
 
        return __replicas_entry_idx(&c->replicas, search);
 }
@@ -690,7 +690,7 @@ __bch2_sb_replicas_to_cpu_replicas(struct bch_sb_field_replicas *sb_r,
        for_each_replicas_entry(sb_r, e) {
                dst = cpu_replicas_entry(cpu_r, idx++);
                memcpy(dst, e, replicas_entry_bytes(e));
-               replicas_entry_sort(dst);
+               bch2_replicas_entry_sort(dst);
        }
 
        return 0;
@@ -727,7 +727,7 @@ __bch2_sb_replicas_v0_to_cpu_replicas(struct bch_sb_field_replicas_v0 *sb_r,
                dst->nr_devs    = e->nr_devs;
                dst->nr_required = 1;
                memcpy(dst->devs, e->devs, e->nr_devs);
-               replicas_entry_sort(dst);
+               bch2_replicas_entry_sort(dst);
        }
 
        return 0;
index 8b95164fbb56636fbee194ae4d61a0e4f63178bc..a16ef23bde8af4fdf7d9113601c504a04c5b3853 100644 (file)
@@ -5,6 +5,7 @@
 #include "eytzinger.h"
 #include "replicas_types.h"
 
+void bch2_replicas_entry_sort(struct bch_replicas_entry *);
 void bch2_replicas_entry_to_text(struct printbuf *,
                                 struct bch_replicas_entry *);
 void bch2_cpu_replicas_to_text(struct printbuf *, struct bch_replicas_cpu *);