bcachefs: Fix copygc sectors_to_move calculation
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 5 Dec 2021 02:52:09 +0000 (21:52 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:18 +0000 (17:09 -0400)
With erasure coding, copygc's count of sectors to move was off, which
matters for the debug statement it prints out when it's not able to move
all the data it tried to.

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

index 249d0b2be167767368b91d5bf9c99ba4a9491034..482dfc29385eb2ae4d993d030ffde83f39f92c57 100644 (file)
@@ -768,8 +768,7 @@ static int __bch2_move_data(struct bch_fs *c,
                if (rate)
                        bch2_ratelimit_increment(rate, k.k->size);
 next:
-               atomic64_add(k.k->size * bch2_bkey_nr_ptrs_allocated(k),
-                            &stats->sectors_seen);
+               atomic64_add(k.k->size, &stats->sectors_seen);
 next_nondata:
                bch2_btree_iter_advance(&iter);
        }
index b05dcbbd1a476272d03ffe1a2690c73175d0f3af..346b9ee667ec7e08b584f172d31f46020ab3701f 100644 (file)
@@ -139,7 +139,7 @@ static int bch2_copygc(struct bch_fs *c)
        struct copygc_heap_entry e, *i;
        struct bucket_array *buckets;
        struct bch_move_stats move_stats;
-       u64 sectors_to_move = 0, sectors_not_moved = 0;
+       u64 sectors_to_move = 0, sectors_to_write = 0, sectors_not_moved = 0;
        u64 sectors_reserved = 0;
        u64 buckets_to_move, buckets_not_moved = 0;
        struct bch_dev *ca;
@@ -205,22 +205,23 @@ static int bch2_copygc(struct bch_fs *c)
                up_read(&ca->bucket_lock);
        }
 
+       /*
+        * Our btree node allocations also come out of RESERVE_MOVINGGC:
+        */
+       sectors_reserved = (sectors_reserved * 3) / 4;
        if (!sectors_reserved) {
                bch2_fs_fatal_error(c, "stuck, ran out of copygc reserve!");
                return -1;
        }
 
-       /*
-        * Our btree node allocations also come out of RESERVE_MOVINGGC:
-        */
-       sectors_to_move = (sectors_to_move * 3) / 4;
-
-       for (i = h->data; i < h->data + h->used; i++)
-               sectors_to_move += i->sectors * i->replicas;
+       for (i = h->data; i < h->data + h->used; i++) {
+               sectors_to_move += i->sectors;
+               sectors_to_write += i->sectors * i->replicas;
+       }
 
-       while (sectors_to_move > sectors_reserved) {
+       while (sectors_to_write > sectors_reserved) {
                BUG_ON(!heap_pop(h, e, -fragmentation_cmp, NULL));
-               sectors_to_move -= e.sectors * e.replicas;
+               sectors_to_write -= e.sectors * e.replicas;
        }
 
        buckets_to_move = h->used;