]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: recalc_capacity() no longer depends on io_ref
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 20 Apr 2025 15:23:53 +0000 (11:23 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 May 2025 00:14:25 +0000 (20:14 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c

index 6ac8bd49c629d9d4a8f91e266414107a891e0460..0494d188605f10134eec9a591a8ce41f0bcd9c4d 100644 (file)
@@ -2505,15 +2505,15 @@ void bch2_recalc_capacity(struct bch_fs *c)
 
        lockdep_assert_held(&c->state_lock);
 
-       for_each_online_member(c, ca) {
-               struct backing_dev_info *bdi = ca->disk_sb.bdev->bd_disk->bdi;
-
-               ra_pages += bdi->ra_pages;
-       }
+       rcu_read_lock();
+       for_each_member_device_rcu(c, ca, NULL) {
+               struct block_device *bdev = READ_ONCE(ca->disk_sb.bdev);
+               if (bdev)
+                       ra_pages += bdev->bd_disk->bdi->ra_pages;
 
-       bch2_set_ra_pages(c, ra_pages);
+               if (ca->mi.state != BCH_MEMBER_STATE_rw)
+                       continue;
 
-       __for_each_online_member(c, ca, BIT(BCH_MEMBER_STATE_rw), READ) {
                u64 dev_reserve = 0;
 
                /*
@@ -2550,6 +2550,9 @@ void bch2_recalc_capacity(struct bch_fs *c)
                bucket_size_max = max_t(unsigned, bucket_size_max,
                                        ca->mi.bucket_size);
        }
+       rcu_read_unlock();
+
+       bch2_set_ra_pages(c, ra_pages);
 
        gc_reserve = c->opts.gc_reserve_bytes
                ? c->opts.gc_reserve_bytes >> 9