bcachefs: BKEY_INVALID_FROM_JOURNAL
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 21 Dec 2022 01:00:34 +0000 (20:00 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:52 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.c
fs/bcachefs/bkey_methods.h
fs/bcachefs/journal_io.c

index 8b15d7a789339c42c46c54d546454d64bc8459ba..e8412fb1547eae89b9801b46f519f80f479f0b57 100644 (file)
@@ -280,11 +280,9 @@ int bch2_alloc_v4_invalid(const struct bch_fs *c, struct bkey_s_c k,
                return -BCH_ERR_invalid_bkey;
        }
 
-       /*
-        * XXX this is wrong, we'll be checking updates that happened from
-        * before BCH_FS_CHECK_BACKPOINTERS_DONE
-        */
-       if (rw == WRITE && test_bit(BCH_FS_CHECK_BACKPOINTERS_DONE, &c->flags)) {
+       if (rw == WRITE &&
+           !(flags & BKEY_INVALID_FROM_JOURNAL) &&
+           test_bit(BCH_FS_CHECK_BACKPOINTERS_DONE, &c->flags)) {
                unsigned i, bp_len = 0;
 
                for (i = 0; i < BCH_ALLOC_V4_NR_BACKPOINTERS(a.v); i++)
index 8f60e1df678e13bf20c8b9f71afdfca03f7af448..9a6afab87f6c6c6ff2918e6d0dca59b7b218b8b7 100644 (file)
@@ -38,6 +38,8 @@ struct bkey_ops {
 
 extern const struct bkey_ops bch2_bkey_ops[];
 
+#define BKEY_INVALID_FROM_JOURNAL              (1 << 1)
+
 int bch2_bkey_val_invalid(struct bch_fs *, struct bkey_s_c, unsigned, struct printbuf *);
 int __bch2_bkey_invalid(struct bch_fs *, struct bkey_s_c,
                        enum btree_node_type, unsigned, struct printbuf *);
index a9744924d619501deb3eab7e5369cdb012931018..c6bb78d2a07ff80ef759947f77abb0c872493f26 100644 (file)
@@ -340,7 +340,7 @@ static int journal_entry_btree_keys_validate(struct bch_fs *c,
                int ret = journal_validate_key(c, jset, entry,
                                               entry->level,
                                               entry->btree_id,
-                                              k, version, big_endian, write);
+                                              k, version, big_endian, write|BKEY_INVALID_FROM_JOURNAL);
                if (ret == FSCK_DELETED_KEY)
                        continue;
 
@@ -661,7 +661,8 @@ static int journal_entry_overwrite_validate(struct bch_fs *c,
                                      struct jset_entry *entry,
                                      unsigned version, int big_endian, int write)
 {
-       return journal_entry_btree_keys_validate(c, jset, entry, version, big_endian, READ);
+       return journal_entry_btree_keys_validate(c, jset, entry,
+                               version, big_endian, READ);
 }
 
 static void journal_entry_overwrite_to_text(struct printbuf *out, struct bch_fs *c,