From 47b15c5760d5eec6c69f207eda7f779c2170e285 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Sat, 4 Dec 2021 21:52:09 -0500 Subject: [PATCH] bcachefs: Fix copygc sectors_to_move calculation 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 --- fs/bcachefs/move.c | 3 +-- fs/bcachefs/movinggc.c | 21 +++++++++++---------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index 249d0b2be1677..482dfc29385eb 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -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); } diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c index b05dcbbd1a476..346b9ee667ec7 100644 --- a/fs/bcachefs/movinggc.c +++ b/fs/bcachefs/movinggc.c @@ -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; -- 2.30.2