]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_gc.c
Update bcachefs sources to 400f275d46 bcachefs: Fix check_overlapping_extents()
[bcachefs-tools-debian] / libbcachefs / btree_gc.c
index a728e9906e9c080a1e54894f007395dbb68b3a90..02154c38ec14960b60a32f2681b3c65dec524901 100644 (file)
@@ -27,6 +27,7 @@
 #include "reflink.h"
 #include "replicas.h"
 #include "super-io.h"
+#include "trace.h"
 
 #include <linux/slab.h>
 #include <linux/bitops.h>
@@ -35,7 +36,6 @@
 #include <linux/preempt.h>
 #include <linux/rcupdate.h>
 #include <linux/sched/task.h>
-#include <trace/events/bcachefs.h>
 
 #define DROP_THIS_NODE         10
 #define DROP_PREV_NODE         11
@@ -572,15 +572,15 @@ static int bch2_check_fix_ptrs(struct btree_trans *trans, enum btree_id btree_id
                struct bucket *g = PTR_GC_BUCKET(ca, &p.ptr);
                enum bch_data_type data_type = bch2_bkey_ptr_data_type(*k, &entry->ptr);
 
-               if (c->opts.reconstruct_alloc ||
-                   fsck_err_on(!g->gen_valid, c,
-                               "bucket %u:%zu data type %s ptr gen %u missing in alloc btree\n"
-                               "while marking %s",
-                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
-                               bch2_data_types[ptr_data_type(k->k, &p.ptr)],
-                               p.ptr.gen,
-                               (printbuf_reset(&buf),
-                                bch2_bkey_val_to_text(&buf, c, *k), buf.buf))) {
+               if (!g->gen_valid &&
+                   (c->opts.reconstruct_alloc ||
+                    fsck_err(c, "bucket %u:%zu data type %s ptr gen %u missing in alloc btree\n"
+                             "while marking %s",
+                             p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
+                             bch2_data_types[ptr_data_type(k->k, &p.ptr)],
+                             p.ptr.gen,
+                             (printbuf_reset(&buf),
+                              bch2_bkey_val_to_text(&buf, c, *k), buf.buf)))) {
                        if (!p.ptr.cached) {
                                g->gen_valid            = true;
                                g->gen                  = p.ptr.gen;
@@ -589,14 +589,15 @@ static int bch2_check_fix_ptrs(struct btree_trans *trans, enum btree_id btree_id
                        }
                }
 
-               if (fsck_err_on(gen_cmp(p.ptr.gen, g->gen) > 0, c,
-                               "bucket %u:%zu data type %s ptr gen in the future: %u > %u\n"
-                               "while marking %s",
-                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
-                               bch2_data_types[ptr_data_type(k->k, &p.ptr)],
-                               p.ptr.gen, g->gen,
-                               (printbuf_reset(&buf),
-                                bch2_bkey_val_to_text(&buf, c, *k), buf.buf))) {
+               if (gen_cmp(p.ptr.gen, g->gen) > 0 &&
+                   (c->opts.reconstruct_alloc ||
+                    fsck_err(c, "bucket %u:%zu data type %s ptr gen in the future: %u > %u\n"
+                             "while marking %s",
+                             p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
+                             bch2_data_types[ptr_data_type(k->k, &p.ptr)],
+                             p.ptr.gen, g->gen,
+                             (printbuf_reset(&buf),
+                              bch2_bkey_val_to_text(&buf, c, *k), buf.buf)))) {
                        if (!p.ptr.cached) {
                                g->gen_valid            = true;
                                g->gen                  = p.ptr.gen;
@@ -609,25 +610,26 @@ static int bch2_check_fix_ptrs(struct btree_trans *trans, enum btree_id btree_id
                        }
                }
 
-               if (fsck_err_on(gen_cmp(g->gen, p.ptr.gen) > BUCKET_GC_GEN_MAX, c,
-                               "bucket %u:%zu gen %u data type %s: ptr gen %u too stale\n"
-                               "while marking %s",
-                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr), g->gen,
-                               bch2_data_types[ptr_data_type(k->k, &p.ptr)],
-                               p.ptr.gen,
-                               (printbuf_reset(&buf),
-                                bch2_bkey_val_to_text(&buf, c, *k), buf.buf)))
+               if (gen_cmp(g->gen, p.ptr.gen) > BUCKET_GC_GEN_MAX &&
+                   (c->opts.reconstruct_alloc ||
+                    fsck_err(c, "bucket %u:%zu gen %u data type %s: ptr gen %u too stale\n"
+                             "while marking %s",
+                             p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr), g->gen,
+                             bch2_data_types[ptr_data_type(k->k, &p.ptr)],
+                             p.ptr.gen,
+                             (printbuf_reset(&buf),
+                              bch2_bkey_val_to_text(&buf, c, *k), buf.buf))))
                        do_update = true;
 
-               if (fsck_err_on(!p.ptr.cached &&
-                               gen_cmp(p.ptr.gen, g->gen) < 0, c,
-                               "bucket %u:%zu data type %s stale dirty ptr: %u < %u\n"
-                               "while marking %s",
-                               p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
-                               bch2_data_types[ptr_data_type(k->k, &p.ptr)],
-                               p.ptr.gen, g->gen,
-                               (printbuf_reset(&buf),
-                                bch2_bkey_val_to_text(&buf, c, *k), buf.buf)))
+               if (!p.ptr.cached && gen_cmp(p.ptr.gen, g->gen) < 0 &&
+                   (c->opts.reconstruct_alloc ||
+                    fsck_err(c, "bucket %u:%zu data type %s stale dirty ptr: %u < %u\n"
+                             "while marking %s",
+                             p.ptr.dev, PTR_BUCKET_NR(ca, &p.ptr),
+                             bch2_data_types[ptr_data_type(k->k, &p.ptr)],
+                             p.ptr.gen, g->gen,
+                             (printbuf_reset(&buf),
+                              bch2_bkey_val_to_text(&buf, c, *k), buf.buf))))
                        do_update = true;
 
                if (data_type != BCH_DATA_btree && p.ptr.gen != g->gen)
@@ -757,7 +759,7 @@ found:
                if (level)
                        bch2_btree_node_update_key_early(trans, btree_id, level - 1, *k, new);
 
-               if (c->opts.verbose) {
+               if (0) {
                        printbuf_reset(&buf);
                        bch2_bkey_val_to_text(&buf, c, *k);
                        bch_info(c, "updated %s", buf.buf);
@@ -1592,7 +1594,7 @@ static int bch2_gc_write_reflink_key(struct btree_trans *trans,
                        "  should be %u",
                        (bch2_bkey_val_to_text(&buf, c, k), buf.buf),
                        r->refcount)) {
-               struct bkey_i *new = bch2_bkey_make_mut(trans, k);
+               struct bkey_i *new = bch2_bkey_make_mut(trans, iter, k, 0);
 
                ret = PTR_ERR_OR_ZERO(new);
                if (ret)
@@ -1602,8 +1604,6 @@ static int bch2_gc_write_reflink_key(struct btree_trans *trans,
                        new->k.type = KEY_TYPE_deleted;
                else
                        *bkey_refcount(new) = cpu_to_le64(r->refcount);
-
-               ret = bch2_trans_update(trans, iter, new, 0);
        }
 fsck_err:
        printbuf_exit(&buf);
@@ -1800,9 +1800,10 @@ again:
 
        bch2_mark_superblocks(c);
 
-       if (BCH_SB_HAS_TOPOLOGY_ERRORS(c->disk_sb.sb) &&
-           !test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags) &&
-           c->opts.fix_errors != FSCK_OPT_NO) {
+       if (IS_ENABLED(CONFIG_BCACHEFS_DEBUG) ||
+           (BCH_SB_HAS_TOPOLOGY_ERRORS(c->disk_sb.sb) &&
+            !test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags) &&
+            c->opts.fix_errors != FSCK_OPT_NO)) {
                bch_info(c, "Starting topology repair pass");
                ret = bch2_repair_topology(c);
                if (ret)
@@ -1918,13 +1919,13 @@ static int gc_btree_gens_key(struct btree_trans *trans,
        percpu_up_read(&c->mark_lock);
        return 0;
 update:
-       u = bch2_bkey_make_mut(trans, k);
+       u = bch2_bkey_make_mut(trans, iter, k, 0);
        ret = PTR_ERR_OR_ZERO(u);
        if (ret)
                return ret;
 
        bch2_extent_normalize(c, bkey_i_to_s(u));
-       return bch2_trans_update(trans, iter, u, 0);
+       return 0;
 }
 
 static int bch2_alloc_write_oldest_gen(struct btree_trans *trans, struct btree_iter *iter,