summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/buckets.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2025-05-17 15:05:26 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2025-05-21 20:15:04 -0400
commit15f969326ee296f7b7faf7704105a99fa02c288d (patch)
tree30c25795e64cb003c9613494bfbe16c3eee43d0a /fs/bcachefs/buckets.c
parentbcachefs: Run recovery passes asynchronously (diff)
downloadlinux-15f969326ee296f7b7faf7704105a99fa02c288d.tar.gz
linux-15f969326ee296f7b7faf7704105a99fa02c288d.zip
bcachefs: Improve bucket_bitmap code
Add some more helpers, and mismatches is now a superset of the empty bitmap - simplifies most checks. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/buckets.c')
-rw-r--r--fs/bcachefs/buckets.c25
1 files changed, 4 insertions, 21 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index ca6e58d6fbc8..8bb6384190c5 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -1324,27 +1324,10 @@ int bch2_dev_buckets_resize(struct bch_fs *c, struct bch_dev *ca, u64 nbuckets)
sizeof(bucket_gens->b[0]) * copy);
}
- for (unsigned i = 0; i < ARRAY_SIZE(ca->bucket_backpointer_mismatches); i++) {
- struct bucket_bitmap *bitmap = &ca->bucket_backpointer_mismatches[i];
-
- mutex_lock(&bitmap->lock);
- if (bitmap->buckets) {
- unsigned long *n = kvcalloc(BITS_TO_LONGS(nbuckets),
- sizeof(unsigned long), GFP_KERNEL);
- if (!n) {
- mutex_unlock(&bitmap->lock);
- ret = -BCH_ERR_ENOMEM_backpointer_mismatches_bitmap;
- goto err;
- }
-
- memcpy(n, bitmap->buckets,
- BITS_TO_LONGS(ca->mi.nbuckets) * sizeof(unsigned long));
- kvfree(bitmap->buckets);
- bitmap->buckets = n;
-
- }
- mutex_unlock(&bitmap->lock);
- }
+ ret = bch2_bucket_bitmap_resize(&ca->bucket_backpointer_mismatch,
+ ca->mi.nbuckets, nbuckets) ?:
+ bch2_bucket_bitmap_resize(&ca->bucket_backpointer_empty,
+ ca->mi.nbuckets, nbuckets);
rcu_assign_pointer(ca->bucket_gens, bucket_gens);
bucket_gens = old_bucket_gens;