bcachefs: Fix snapshot skiplists
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 26 Oct 2023 20:20:08 +0000 (16:20 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 2 Nov 2023 01:11:07 +0000 (21:11 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/snapshot.c

index 315e88cc3867f5bbbf13b9017f9eab8fa3234515..e70adfcbd953c8581906068c267cd98666fa9bf3 100644 (file)
@@ -255,8 +255,7 @@ int bch2_snapshot_invalid(const struct bch_fs *c, struct bkey_s_c k,
                for (i = 0; i < ARRAY_SIZE(s.v->skip); i++) {
                        id = le32_to_cpu(s.v->skip[i]);
 
-                       if ((id && !s.v->parent) ||
-                           (id && id <= k.k->p.offset)) {
+                       if (id && id < le32_to_cpu(s.v->parent)) {
                                prt_printf(err, "bad skiplist node %u", id);
                                return -BCH_ERR_invalid_bkey;
                        }
@@ -1348,12 +1347,12 @@ static int bch2_fix_child_of_deleted_snapshot(struct btree_trans *trans,
                        u32 id = le32_to_cpu(s->v.skip[j]);
 
                        if (snapshot_list_has_id(deleted, id)) {
-                               id = depth > 1
-                                       ? bch2_snapshot_nth_parent_skip(c,
+                               id = bch2_snapshot_nth_parent_skip(c,
                                                        parent,
-                                                       get_random_u32_below(depth - 1),
-                                                       deleted)
-                                       : parent;
+                                                       depth > 1
+                                                       ? get_random_u32_below(depth - 1)
+                                                       : 0,
+                                                       deleted);
                                s->v.skip[j] = cpu_to_le32(id);
                        }
                }