diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-02-10 11:40:44 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:09:23 +0300 |
commit | aa8982c3f2cbfca89fb73daad9d6e65f7be022c2 (patch) | |
tree | d6bf123038184fbb5e10a319e2d5fe4fb3e60ac9 /fs/bcachefs/btree_gc.c | |
parent | c45c866761671ddfc180a7fffa2e9f96bb8affd2 (diff) | |
download | linux-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.c | 12 |
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) |