bcachefs: Add BTREE_PTR_RANGE_UPDATED
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 27 Jan 2021 01:13:54 +0000 (20:13 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:52 +0000 (17:08 -0400)
This is so that when we discover btree topology issues, we can just
update the pointer to a btree node and signal btree read path that the
min/max keys in the node header should be updated from the node pointer.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/btree_io.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/extents.c

index b88a9fdf17adf5e3d2ac5783035c3b3ef05e9acb..a0e445a71c3e9c962a3b501411ee72e4bc0701e9 100644 (file)
@@ -607,13 +607,14 @@ struct bch_btree_ptr_v2 {
        __u64                   mem_ptr;
        __le64                  seq;
        __le16                  sectors_written;
-       /* In case we ever decide to do variable size btree nodes: */
-       __le16                  sectors;
+       __le16                  flags;
        struct bpos             min_key;
        __u64                   _data[0];
        struct bch_extent_ptr   start[];
 } __attribute__((packed, aligned(8)));
 
+LE16_BITMASK(BTREE_PTR_RANGE_UPDATED,  struct bch_btree_ptr_v2, flags, 0, 1);
+
 struct bch_extent {
        struct bch_val          v;
 
index cd2b300043b68333367d83b63c8c56c0e867e402..8ac50c9ffcbaadfd57024c430ad1571d7ccac23c 100644 (file)
@@ -753,6 +753,11 @@ static int validate_bset(struct bch_fs *c, struct btree *b,
                        struct bch_btree_ptr_v2 *bp =
                                &bkey_i_to_btree_ptr_v2(&b->key)->v;
 
+                       if (BTREE_PTR_RANGE_UPDATED(bp)) {
+                               b->data->min_key = bp->min_key;
+                               b->data->max_key = b->key.k.p;
+                       }
+
                        btree_err_on(bkey_cmp(b->data->min_key, bp->min_key),
                                     BTREE_ERR_MUST_RETRY, c, b, NULL,
                                     "incorrect min_key: got %llu:%llu should be %llu:%llu",
index 3b19c1c7b4506815337bc9277eb6f4921e1636e6..42015f729da74ab57671724c4f4a93bd1d3c262b 100644 (file)
@@ -297,7 +297,6 @@ static struct btree *bch2_btree_node_alloc(struct btree_update *as, unsigned lev
                bp->v.mem_ptr           = 0;
                bp->v.seq               = b->data->keys.seq;
                bp->v.sectors_written   = 0;
-               bp->v.sectors           = cpu_to_le16(c->opts.btree_node_size);
        }
 
        if (c->sb.features & (1ULL << BCH_FEATURE_new_extent_overwrite))
index a924cc66b4d072f870244183de8dd45a5b32d0bd..6e388881ebf903ca3c8cb4587aa5eeb434e5c383 100644 (file)
@@ -214,9 +214,8 @@ void bch2_btree_ptr_v2_to_text(struct printbuf *out, struct bch_fs *c,
 {
        struct bkey_s_c_btree_ptr_v2 bp = bkey_s_c_to_btree_ptr_v2(k);
 
-       pr_buf(out, "seq %llx sectors %u written %u min_key ",
+       pr_buf(out, "seq %llx written %u min_key ",
               le64_to_cpu(bp.v->seq),
-              le16_to_cpu(bp.v->sectors),
               le16_to_cpu(bp.v->sectors_written));
 
        bch2_bpos_to_text(out, bp.v->min_key);
@@ -1081,10 +1080,9 @@ const char *bch2_bkey_ptrs_invalid(const struct bch_fs *c, struct bkey_s_c k)
        unsigned nonce = UINT_MAX;
        unsigned i;
 
-       if (k.k->type == KEY_TYPE_btree_ptr)
+       if (k.k->type == KEY_TYPE_btree_ptr ||
+           k.k->type == KEY_TYPE_btree_ptr_v2)
                size_ondisk = c->opts.btree_node_size;
-       if (k.k->type == KEY_TYPE_btree_ptr_v2)
-               size_ondisk = le16_to_cpu(bkey_s_c_to_btree_ptr_v2(k).v->sectors);
 
        bkey_extent_entry_for_each(ptrs, entry) {
                if (__extent_entry_type(entry) >= BCH_EXTENT_ENTRY_MAX)