bcachefs: Check for bad key version number
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 19 Feb 2020 01:02:41 +0000 (20:02 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:35 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_gc.c
fs/bcachefs/io.c

index a0b65267cf760fa6db09263f4ea964ec18d7cfc4..a5fe3b316e066a1af44400233d3d4386b639048a 100644 (file)
@@ -126,7 +126,11 @@ static int bch2_gc_mark_key(struct bch_fs *c, struct bkey_s_c k,
                BUG_ON(journal_seq_verify(c) &&
                       k.k->version.lo > journal_cur_seq(&c->journal));
 
-               if (k.k->version.lo > atomic64_read(&c->key_version))
+               /* XXX change to fsck check */
+               if (fsck_err_on(k.k->version.lo > atomic64_read(&c->key_version), c,
+                               "key version number higher than recorded: %llu > %llu",
+                               k.k->version.lo,
+                               atomic64_read(&c->key_version)))
                        atomic64_set(&c->key_version, k.k->version.lo);
 
                if (test_bit(BCH_FS_REBUILD_REPLICAS, &c->flags) ||
index 679ad54d4c4ea0040a96471ae7cededa1ac986c1..33603624b42a95e57bc371e8b021dd0fa699660c 100644 (file)
@@ -943,7 +943,7 @@ static int bch2_write_extent(struct bch_write_op *op, struct write_point *wp,
 
                if (bch2_csum_type_is_encryption(op->csum_type)) {
                        if (bversion_zero(version)) {
-                               version.lo = atomic64_inc_return(&c->key_version) + 1;
+                               version.lo = atomic64_inc_return(&c->key_version);
                        } else {
                                crc.nonce = op->nonce;
                                op->nonce += src_len >> 9;