summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_gc.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-02-10 11:40:44 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:23 +0300
commitaa8982c3f2cbfca89fb73daad9d6e65f7be022c2 (patch)
treed6bf123038184fbb5e10a319e2d5fe4fb3e60ac9 /fs/bcachefs/btree_gc.c
parentc45c866761671ddfc180a7fffa2e9f96bb8affd2 (diff)
downloadlinux-aa8982c3f2cbfca89fb73daad9d6e65f7be022c2.tar.xz
bcachefs: Fix reflink repair code
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>
Diffstat (limited to 'fs/bcachefs/btree_gc.c')
-rw-r--r--fs/bcachefs/btree_gc.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c
index 9c33341c7947..d1fbe3b77379 100644
--- a/fs/bcachefs/btree_gc.c
+++ b/fs/bcachefs/btree_gc.c
@@ -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)