summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-06-12 16:26:04 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-07-28 20:41:53 -0400
commit1f6c50ae2865fc8a8f7fab01e96b66e43d08a856 (patch)
treecf7eeae5aeca7404b3fba6213ac8f29abd78c661
parentc22851094144b5e02ffb03b54f6974932bd00bff (diff)
bcachefs: Write out shorter JSET_ENTRY_dev_usage entries
We don't need to write out the entries for the last data type(s) if they're zeroes - and the next patch is going to be increasing BCH_DATA_NR, so this is needed to avoid the next patch being an on disk format change. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/super-io.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c
index 3903b730bba3..29c0c68e693b 100644
--- a/fs/bcachefs/super-io.c
+++ b/fs/bcachefs/super-io.c
@@ -1066,18 +1066,26 @@ void bch2_journal_super_entries_add_common(struct bch_fs *c,
}
for_each_member_device(ca, c, dev) {
- unsigned b = sizeof(struct jset_entry_dev_usage) +
- sizeof(struct jset_entry_dev_usage_type) * BCH_DATA_NR;
- struct jset_entry_dev_usage *u =
- container_of(jset_entry_init(end, b),
- struct jset_entry_dev_usage, entry);
+ unsigned bytes, nr = BCH_DATA_NR;
+ struct jset_entry_dev_usage *u;
+
+ while (nr &&
+ !ca->usage_base->d[nr - 1].buckets &&
+ !ca->usage_base->d[nr - 1].sectors &&
+ !ca->usage_base->d[nr - 1].fragmented)
+ nr--;
+
+ bytes = sizeof(struct jset_entry_dev_usage) +
+ sizeof(struct jset_entry_dev_usage_type) * nr;
+ u = container_of(jset_entry_init(end, bytes),
+ struct jset_entry_dev_usage, entry);
u->entry.type = BCH_JSET_ENTRY_dev_usage;
u->dev = cpu_to_le32(dev);
u->buckets_ec = cpu_to_le64(ca->usage_base->buckets_ec);
u->buckets_unavailable = cpu_to_le64(ca->usage_base->buckets_unavailable);
- for (i = 0; i < BCH_DATA_NR; i++) {
+ for (i = 0; i < nr; i++) {
u->d[i].buckets = cpu_to_le64(ca->usage_base->d[i].buckets);
u->d[i].sectors = cpu_to_le64(ca->usage_base->d[i].sectors);
u->d[i].fragmented = cpu_to_le64(ca->usage_base->d[i].fragmented);