bcachefs: Fix reflink repair code
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 10 Feb 2022 08:40:44 +0000 (03:40 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:23 +0000 (17:09 -0400)
The reflink repair code was incorrectly inserting a nonzero deleted key
via journal replay - this is due to bch2_journal_key_insert() being
somewhat hacky, and so this fix is also hacky for now.

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

index 9c33341c7947484caef127a060d7de5e33e06104..d1fbe3b77379ae9202c33001d62d8a603468d917 100644 (file)
@@ -1501,10 +1501,18 @@ static int bch2_gc_reflink_done(struct bch_fs *c, bool initial,
 
                        bkey_reassemble(new, k);
 
-                       if (!r->refcount)
+                       if (!r->refcount) {
                                new->k.type = KEY_TYPE_deleted;
-                       else
+                               /*
+                                * XXX ugly: bch2_journal_key_insert() queues up
+                                * the key for the journal replay code, which
+                                * doesn't run the extent overwrite pass
+                                */
+                               if (initial)
+                                       new->k.size = 0;
+                       } else {
                                *bkey_refcount(new) = cpu_to_le64(r->refcount);
+                       }
 
                        ret = initial
                               ? bch2_journal_key_insert(c, BTREE_ID_stripes, 0, new)