bcachefs: Change copygc wait amount to be min of per device waits
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 27 Apr 2021 18:03:13 +0000 (14:03 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:02 +0000 (17:09 -0400)
We're seeing a filesystem get stuck when all devices but one have no
more reclaimable buckets - because the copygc wait amount is curretly
filesystem wide.

This patch should fix that, possibly at the expensive of running too
much when only one or a few devices is full and the rebalance thread
needs to move data around.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/movinggc.c

index f9146ccd70ef05b7f44823d87eb54780e6e84049..acb4d943db79e2e0d95b179c4884c1d279a75f01 100644 (file)
@@ -293,17 +293,19 @@ unsigned long bch2_copygc_wait_amount(struct bch_fs *c)
 {
        struct bch_dev *ca;
        unsigned dev_idx;
-       u64 fragmented_allowed = 0, fragmented = 0;
+       s64 wait = S64_MAX, fragmented_allowed, fragmented;
 
        for_each_rw_member(ca, c, dev_idx) {
                struct bch_dev_usage usage = bch2_dev_usage_read(ca);
 
-               fragmented_allowed += ((__dev_buckets_reclaimable(ca, usage) *
+               fragmented_allowed = ((__dev_buckets_reclaimable(ca, usage) *
                                        ca->mi.bucket_size) >> 1);
-               fragmented += usage.d[BCH_DATA_user].fragmented;
+               fragmented = usage.d[BCH_DATA_user].fragmented;
+
+               wait = min(wait, max(0LL, fragmented_allowed - fragmented));
        }
 
-       return max_t(s64, 0, fragmented_allowed - fragmented);
+       return wait;
 }
 
 static int bch2_copygc_thread(void *arg)