diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-06-12 16:26:04 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-07-28 20:41:53 -0400 |
commit | 1f6c50ae2865fc8a8f7fab01e96b66e43d08a856 (patch) | |
tree | cf7eeae5aeca7404b3fba6213ac8f29abd78c661 | |
parent | c22851094144b5e02ffb03b54f6974932bd00bff (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.c | 20 |
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); |