]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/movinggc.c
Update bcachefs sources to fbb669e9de bcachefs: Kill btree_node_iter_large
[bcachefs-tools-debian] / libbcachefs / movinggc.c
index d414ee94cc2c3677da2468c512f4871911c25a30..abdeef20fde9fe0a34e78eee0c545e836989b008 100644 (file)
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: GPL-2.0
 /*
  * Moving/copying garbage collector
  *
@@ -5,6 +6,7 @@
  */
 
 #include "bcachefs.h"
+#include "alloc_foreground.h"
 #include "btree_iter.h"
 #include "btree_update.h"
 #include "buckets.h"
@@ -52,7 +54,7 @@ static inline int sectors_used_cmp(copygc_heap *heap,
                                   struct copygc_heap_entry l,
                                   struct copygc_heap_entry r)
 {
-       return (l.sectors > r.sectors) - (l.sectors < r.sectors);
+       return cmp_int(l.sectors, r.sectors);
 }
 
 static int bucket_offset_cmp(const void *_l, const void *_r, size_t size)
@@ -60,15 +62,15 @@ static int bucket_offset_cmp(const void *_l, const void *_r, size_t size)
        const struct copygc_heap_entry *l = _l;
        const struct copygc_heap_entry *r = _r;
 
-       return (l->offset > r->offset) - (l->offset < r->offset);
+       return cmp_int(l->offset, r->offset);
 }
 
 static bool __copygc_pred(struct bch_dev *ca,
-                         struct bkey_s_c_extent e)
+                         struct bkey_s_c k)
 {
        copygc_heap *h = &ca->copygc_heap;
        const struct bch_extent_ptr *ptr =
-               bch2_extent_has_device(e, ca->dev_idx);
+               bch2_bkey_has_device(k, ca->dev_idx);
 
        if (ptr) {
                struct copygc_heap_entry search = { .offset = ptr->offset };
@@ -86,14 +88,13 @@ static bool __copygc_pred(struct bch_dev *ca,
 }
 
 static enum data_cmd copygc_pred(struct bch_fs *c, void *arg,
-                                enum bkey_type type,
-                                struct bkey_s_c_extent e,
+                                struct bkey_s_c k,
                                 struct bch_io_opts *io_opts,
                                 struct data_opts *data_opts)
 {
        struct bch_dev *ca = arg;
 
-       if (!__copygc_pred(ca, e))
+       if (!__copygc_pred(ca, k))
                return DATA_SKIP;
 
        data_opts->target               = dev_to_target(ca->dev_idx);
@@ -106,10 +107,10 @@ static bool have_copygc_reserve(struct bch_dev *ca)
 {
        bool ret;
 
-       spin_lock(&ca->freelist_lock);
+       spin_lock(&ca->fs->freelist_lock);
        ret = fifo_full(&ca->free[RESERVE_MOVINGGC]) ||
-               ca->allocator_blocked;
-       spin_unlock(&ca->freelist_lock);
+               ca->allocator_state != ALLOCATOR_RUNNING;
+       spin_unlock(&ca->fs->freelist_lock);
 
        return ret;
 }
@@ -159,7 +160,7 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
                        .sectors        = bucket_sectors_used(m),
                        .offset         = bucket_to_sector(ca, b),
                };
-               heap_add_or_replace(h, e, -sectors_used_cmp);
+               heap_add_or_replace(h, e, -sectors_used_cmp, NULL);
        }
        up_read(&ca->bucket_lock);
        up_read(&c->gc_lock);
@@ -168,7 +169,7 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
                sectors_to_move += i->sectors;
 
        while (sectors_to_move > COPYGC_SECTORS_PER_ITER(ca)) {
-               BUG_ON(!heap_pop(h, e, -sectors_used_cmp));
+               BUG_ON(!heap_pop(h, e, -sectors_used_cmp, NULL));
                sectors_to_move -= e.sectors;
        }
 
@@ -201,7 +202,8 @@ static void bch2_copygc(struct bch_fs *c, struct bch_dev *ca)
        up_read(&ca->bucket_lock);
 
        if (sectors_not_moved && !ret)
-               bch_warn(c, "copygc finished but %llu/%llu sectors, %llu/%llu buckets not moved",
+               bch_warn_ratelimited(c,
+                       "copygc finished but %llu/%llu sectors, %llu/%llu buckets not moved",
                         sectors_not_moved, sectors_to_move,
                         buckets_not_moved, buckets_to_move);
 
@@ -274,7 +276,8 @@ int bch2_copygc_start(struct bch_fs *c, struct bch_dev *ca)
 {
        struct task_struct *t;
 
-       BUG_ON(ca->copygc_thread);
+       if (ca->copygc_thread)
+               return 0;
 
        if (c->opts.nochanges)
                return 0;