diff options
author | 2021-01-21 21:52:06 -0500 | |
---|---|---|
committer | 2023-10-22 17:08:52 -0400 | |
commit | 180fb49dea90dfbac591b9b201a4dfb75159f5f0 (patch) | |
tree | 36e637ce2b6d2f8adf1a06a1aaa175f6179b5645 /fs/bcachefs/super-io.c | |
parent | bcachefs: Persist 64 bit io clocks (diff) | |
download | linux-180fb49dea90dfbac591b9b201a4dfb75159f5f0.tar.gz linux-180fb49dea90dfbac591b9b201a4dfb75159f5f0.tar.bz2 linux-180fb49dea90dfbac591b9b201a4dfb75159f5f0.zip |
bcachefs: Journal updates to dev usage
This eliminates the need to scan every bucket to regenerate dev_usage at
mount time.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/super-io.c')
-rw-r--r-- | fs/bcachefs/super-io.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/fs/bcachefs/super-io.c b/fs/bcachefs/super-io.c index 3b082da934fb..0356541c00e2 100644 --- a/fs/bcachefs/super-io.c +++ b/fs/bcachefs/super-io.c @@ -986,7 +986,8 @@ void bch2_journal_super_entries_add_common(struct bch_fs *c, struct jset_entry **end, u64 journal_seq) { - unsigned i; + struct bch_dev *ca; + unsigned i, dev; percpu_down_read(&c->mark_lock); @@ -1041,6 +1042,25 @@ void bch2_journal_super_entries_add_common(struct bch_fs *c, "embedded variable length struct"); } + 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); + + 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++) { + 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); + } + } + percpu_up_read(&c->mark_lock); for (i = 0; i < 2; i++) { |