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-06-15 20:40:55 -0400
commit512db97484e5f680b105bb9eea0eb758a0087247 (patch)
treeb99dffbba28dd6c04765534c7d1c4942b7237e6d
parent1aa4383d4419872a9781ad9f548839a01a28f75e (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 c771b92d9496..54fa16901f01 100644
--- a/fs/bcachefs/super-io.c
+++ b/fs/bcachefs/super-io.c
@@ -1065,18 +1065,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);