]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/movinggc.c
Update bcachefs sources to e99d29e402 bcachefs: zstd support, compression refactoring
[bcachefs-tools-debian] / libbcachefs / movinggc.c
index 90eb4ca2959f82b902fe73456f06881cf6da181d..c306a89f8401f160dd3204c75cdc57fb17a730da 100644 (file)
@@ -61,9 +61,9 @@ static int bucket_offset_cmp(const void *_l, const void *_r, size_t size)
        return (l->offset > r->offset) - (l->offset < r->offset);
 }
 
-static bool copygc_pred(void *arg, struct bkey_s_c_extent e)
+static bool __copygc_pred(struct bch_dev *ca,
+                         struct bkey_s_c_extent e)
 {
-       struct bch_dev *ca = arg;
        copygc_heap *h = &ca->copygc_heap;
        const struct bch_extent_ptr *ptr =
                bch2_extent_has_device(e, ca->dev_idx);
@@ -83,6 +83,22 @@ static bool copygc_pred(void *arg, struct bkey_s_c_extent e)
        return false;
 }
 
+static enum data_cmd copygc_pred(struct bch_fs *c, void *arg,
+                                enum bkey_type type,
+                                struct bkey_s_c_extent e,
+                                struct bch_io_opts *io_opts,
+                                struct data_opts *data_opts)
+{
+       struct bch_dev *ca = arg;
+
+       if (!__copygc_pred(ca, e))
+               return DATA_SKIP;
+
+       data_opts->btree_insert_flags   = BTREE_INSERT_USE_RESERVE,
+       data_opts->rewrite_dev          = ca->dev_idx;
+       return DATA_REWRITE;
+}
+
 static bool have_copygc_reserve(struct bch_dev *ca)
 {
        bool ret;
@@ -100,12 +116,13 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
        copygc_heap *h = &ca->copygc_heap;
        struct copygc_heap_entry e, *i;
        struct bucket_array *buckets;
-       u64 keys_moved, sectors_moved;
+       struct bch_move_stats move_stats;
        u64 sectors_to_move = 0, sectors_not_moved = 0;
        u64 buckets_to_move, buckets_not_moved = 0;
        size_t b;
        int ret;
 
+       memset(&move_stats, 0, sizeof(move_stats));
        closure_wait_event(&c->freelist_wait, have_copygc_reserve(ca));
 
        /*
@@ -164,11 +181,9 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
                             SECTORS_IN_FLIGHT_PER_DEVICE,
                             &ca->self,
                             writepoint_ptr(&ca->copygc_write_point),
-                            BTREE_INSERT_USE_RESERVE,
-                            ca->dev_idx,
+                            POS_MIN, POS_MAX,
                             copygc_pred, ca,
-                            &keys_moved,
-                            &sectors_moved);
+                            &move_stats);
 
        down_read(&ca->bucket_lock);
        buckets = bucket_array(ca);
@@ -189,7 +204,7 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
                         buckets_not_moved, buckets_to_move);
 
        trace_copygc(ca,
-                    sectors_moved, sectors_not_moved,
+                    atomic64_read(&move_stats.sectors_moved), sectors_not_moved,
                     buckets_to_move, buckets_not_moved);
 }