bcachefs: Split out SPOS_MAX
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 6 Jul 2021 02:02:07 +0000 (22:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:07 +0000 (17:09 -0400)
Internal btree code really wants a POS_MAX with all fields ~0; external
code more likely wants the snapshot field to be 0, because when we're
passing it to bch2_trans_get_iter() it's used for the snapshot we're
operating in, which should be 0 for most btrees that don't use
snapshots.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/bcachefs_format.h
fs/bcachefs/btree_gc.c
fs/bcachefs/btree_gc.h
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/debug.c
fs/bcachefs/move.c

index 63f7c7c8f390b5c311933c113073554f237280b8..24853bd8923b5c71bb37b764406bb2edd8517461 100644 (file)
@@ -152,7 +152,8 @@ static inline struct bpos SPOS(__u64 inode, __u64 offset, __u32 snapshot)
 }
 
 #define POS_MIN                                SPOS(0, 0, 0)
-#define POS_MAX                                SPOS(KEY_INODE_MAX, KEY_OFFSET_MAX, KEY_SNAPSHOT_MAX)
+#define POS_MAX                                SPOS(KEY_INODE_MAX, KEY_OFFSET_MAX, 0)
+#define SPOS_MAX                       SPOS(KEY_INODE_MAX, KEY_OFFSET_MAX, KEY_SNAPSHOT_MAX)
 #define POS(_inode, _offset)           SPOS(_inode, _offset, 0)
 
 /* Empty placeholder struct, for container_of() */
index 1d690190d9585fd340575c74f5ac43316c76c76e..8bddab73a46160025f91ed773994fd1d9ed3aeee 100644 (file)
@@ -962,7 +962,7 @@ static int bch2_gc_btree_init(struct bch_fs *c,
                goto fsck_err;
        }
 
-       if (mustfix_fsck_err_on(bpos_cmp(b->data->max_key, POS_MAX), c,
+       if (mustfix_fsck_err_on(bpos_cmp(b->data->max_key, SPOS_MAX), c,
                        "btree root with incorrect max_key: %s",
                        (bch2_bpos_to_text(&PBUF(buf), b->data->max_key), buf))) {
                bch_err(c, "repair unimplemented");
index e9a87394370ad7a5ac52add7f3a50b35ceed9268..59dfb069e699402eb57bcc62b63626d3b4f2f25d 100644 (file)
@@ -87,7 +87,7 @@ static inline struct gc_pos gc_pos_btree_node(struct btree *b)
  */
 static inline struct gc_pos gc_pos_btree_root(enum btree_id id)
 {
-       return gc_pos_btree(id, POS_MAX, BTREE_MAX_DEPTH);
+       return gc_pos_btree(id, SPOS_MAX, BTREE_MAX_DEPTH);
 }
 
 static inline bool gc_visited(struct bch_fs *c, struct gc_pos pos)
index 31d8c89ae255f5a0f918c0c170285ac8da4daf0d..8d42feae070affe22d70a3508a5a1cee84196964 100644 (file)
@@ -1081,7 +1081,7 @@ static inline int btree_iter_lock_root(struct btree_iter *iter,
                }
 
                lock_type = __btree_lock_want(iter, iter->level);
-               if (unlikely(!btree_node_lock(b, POS_MAX, iter->level,
+               if (unlikely(!btree_node_lock(b, SPOS_MAX, iter->level,
                                              iter, lock_type,
                                              lock_root_check_fn, rootp,
                                              trace_ip)))
@@ -1602,7 +1602,7 @@ out:
 inline bool bch2_btree_iter_advance(struct btree_iter *iter)
 {
        struct bpos pos = iter->k.p;
-       bool ret = bpos_cmp(pos, POS_MAX) != 0;
+       bool ret = bpos_cmp(pos, SPOS_MAX) != 0;
 
        if (ret && !(iter->flags & BTREE_ITER_IS_EXTENTS))
                pos = bkey_successor(iter, pos);
@@ -1624,7 +1624,7 @@ inline bool bch2_btree_iter_rewind(struct btree_iter *iter)
 static inline bool btree_iter_set_pos_to_next_leaf(struct btree_iter *iter)
 {
        struct bpos next_pos = iter->l[0].b->key.k.p;
-       bool ret = bpos_cmp(next_pos, POS_MAX) != 0;
+       bool ret = bpos_cmp(next_pos, SPOS_MAX) != 0;
 
        /*
         * Typically, we don't want to modify iter->pos here, since that
@@ -1634,7 +1634,7 @@ static inline bool btree_iter_set_pos_to_next_leaf(struct btree_iter *iter)
        if (ret)
                btree_iter_set_search_pos(iter, bpos_successor(next_pos));
        else
-               bch2_btree_iter_set_pos(iter, POS_MAX);
+               bch2_btree_iter_set_pos(iter, SPOS_MAX);
 
        return ret;
 }
index f577fd386ab4f65d13512fad2364f4899f4e92d9..361ae8063bb27ffed9eb323b1cfb05299a0b49ab 100644 (file)
@@ -367,7 +367,7 @@ static struct btree *__btree_root_alloc(struct btree_update *as, unsigned level)
        struct btree *b = bch2_btree_node_alloc(as, level);
 
        btree_set_min(b, POS_MIN);
-       btree_set_max(b, POS_MAX);
+       btree_set_max(b, SPOS_MAX);
        b->data->format = bch2_btree_calc_format(b);
 
        btree_node_set_format(b, b->data->format);
@@ -1590,7 +1590,7 @@ retry:
        b = iter->l[level].b;
 
        if ((sib == btree_prev_sib && !bpos_cmp(b->data->min_key, POS_MIN)) ||
-           (sib == btree_next_sib && !bpos_cmp(b->data->max_key, POS_MAX))) {
+           (sib == btree_next_sib && !bpos_cmp(b->data->max_key, SPOS_MAX))) {
                b->sib_u64s[sib] = U16_MAX;
                goto out;
        }
@@ -2014,7 +2014,7 @@ void bch2_btree_root_alloc(struct bch_fs *c, enum btree_id id)
        b->c.btree_id   = id;
 
        bkey_btree_ptr_init(&b->key);
-       b->key.k.p = POS_MAX;
+       b->key.k.p = SPOS_MAX;
        *((u64 *) bkey_i_to_btree_ptr(&b->key)->v.start) = U64_MAX - id;
 
        bch2_bset_init_first(b, &b->data->keys);
@@ -2022,7 +2022,7 @@ void bch2_btree_root_alloc(struct bch_fs *c, enum btree_id id)
 
        b->data->flags = 0;
        btree_set_min(b, POS_MIN);
-       btree_set_max(b, POS_MAX);
+       btree_set_max(b, SPOS_MAX);
        b->data->format = bch2_btree_calc_format(b);
        btree_node_set_format(b, b->data->format);
 
index d6dde62b6d48d269fef88f13cfe436b65e6c6221..cbadb38f680f669f8c44b0d199225b485aa11748 100644 (file)
@@ -313,7 +313,7 @@ static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf,
        if (err)
                return err;
 
-       if (!i->size || !bpos_cmp(POS_MAX, i->from))
+       if (!i->size || !bpos_cmp(SPOS_MAX, i->from))
                return i->ret;
 
        bch2_trans_init(&trans, i->c, 0, 0);
@@ -329,7 +329,7 @@ static ssize_t bch2_read_btree_formats(struct file *file, char __user *buf,
                 * can't easily correctly restart a btree node traversal across
                 * all nodes, meh
                 */
-               i->from = bpos_cmp(POS_MAX, b->key.k.p)
+               i->from = bpos_cmp(SPOS_MAX, b->key.k.p)
                        ? bpos_successor(b->key.k.p)
                        : b->key.k.p;
 
index 93d7beaa5fceb46659bcef94e13955c4dd4cf3c8..f1337a16cafb9041efa7f1ce56511ae869b2f8d0 100644 (file)
@@ -769,7 +769,7 @@ static int bch2_move_btree(struct bch_fs *c,
                                break;
 
                        if ((cmp_int(id, end_btree_id) ?:
-                            bkey_cmp(b->key.k.p, end_pos)) > 0)
+                            bpos_cmp(b->key.k.p, end_pos)) > 0)
                                break;
 
                        stats->pos = iter->pos;
@@ -921,7 +921,7 @@ int bch2_scan_old_btree_nodes(struct bch_fs *c, struct bch_move_stats *stats)
 
        ret = bch2_move_btree(c,
                              0,                POS_MIN,
-                             BTREE_ID_NR,      POS_MAX,
+                             BTREE_ID_NR,      SPOS_MAX,
                              rewrite_old_nodes_pred, c, stats);
        if (!ret) {
                mutex_lock(&c->sb_lock);