bcachefs: Skip 0 size deleted extents in journal replay
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 5 Mar 2020 23:43:31 +0000 (18:43 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:36 +0000 (17:08 -0400)
These are created by the new extent update path, but not used yet by the
recovery code and they break the existing recovery code, so we can just
skip them.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/recovery.c

index 712a6b1fd968589548b456513337d22fa4f8a8b9..bd0edda7abf911494eb539e033a0ae3d44527eba 100644 (file)
@@ -230,7 +230,11 @@ static struct journal_keys journal_keys_sort(struct list_head *journal_entries)
                goto err;
 
        list_for_each_entry(p, journal_entries, list)
-               for_each_jset_key(k, _n, entry, &p->j)
+               for_each_jset_key(k, _n, entry, &p->j) {
+                       if (bkey_deleted(&k->k) &&
+                           btree_node_type_is_extents(entry->btree_id))
+                               continue;
+
                        keys.d[keys.nr++] = (struct journal_key) {
                                .btree_id       = entry->btree_id,
                                .pos            = bkey_start_pos(&k->k),
@@ -239,8 +243,9 @@ static struct journal_keys journal_keys_sort(struct list_head *journal_entries)
                                        keys.journal_seq_base,
                                .journal_offset = k->_data - p->j._data,
                        };
+               }
 
-       sort(keys.d, nr_keys, sizeof(keys.d[0]), journal_sort_key_cmp, NULL);
+       sort(keys.d, keys.nr, sizeof(keys.d[0]), journal_sort_key_cmp, NULL);
 
        i = keys.d;
        while (i < keys.d + keys.nr) {