diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-10-24 18:57:47 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:09:14 +0300 |
commit | 114eea75c73dfd95ae529eb841aad0330793f446 (patch) | |
tree | b46844a61fe38a422c689d8e9094b2f2e59db8ee | |
parent | ab44d7bdeebe316a03f37c08c1f66c13ea9aa5d5 (diff) | |
download | linux-114eea75c73dfd95ae529eb841aad0330793f446.tar.xz |
bcachefs: Fix dev accounting after device add
This is a hacky but effective fix to device usage stats for superblock
and journal being wrong on a newly added device (following the comment
that already told us how it needed to be done!)
Reported-by: Chris Webb <chris@arachsys.com>
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/super.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c index db38d6b0f2ad..d17e4f005b3f 100644 --- a/fs/bcachefs/super.c +++ b/fs/bcachefs/super.c @@ -1591,6 +1591,8 @@ int bch2_dev_add(struct bch_fs *c, const char *path) struct bch_dev *ca = NULL; struct bch_sb_field_members *mi; struct bch_member dev_mi; + struct bucket_array *buckets; + struct bucket *g; unsigned dev_idx, nr_devices, u64s; int ret; @@ -1694,6 +1696,16 @@ have_slot: bch2_dev_usage_journal_reserve(c); + /* + * Clear marks before marking transactionally in the btree, so that + * per-device accounting gets done correctly: + */ + down_read(&ca->bucket_lock); + buckets = bucket_array(ca); + for_each_bucket(g, buckets) + atomic64_set(&g->_mark.v, 0); + up_read(&ca->bucket_lock); + err = "error marking superblock"; ret = bch2_trans_mark_dev_sb(c, ca); if (ret) |