diff options
Diffstat (limited to 'libbcachefs/bkey_methods.c')
-rw-r--r-- | libbcachefs/bkey_methods.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/libbcachefs/bkey_methods.c b/libbcachefs/bkey_methods.c index 48c86e52..711bc88f 100644 --- a/libbcachefs/bkey_methods.c +++ b/libbcachefs/bkey_methods.c @@ -201,15 +201,20 @@ enum merge_result bch2_bkey_merge(struct bch_fs *c, struct bkey_i *l, struct bkey_i *r) { const struct bkey_ops *ops = &bch2_bkey_ops[l->k.type]; + enum merge_result ret; - if (!key_merging_disabled(c) && - ops->key_merge && - l->k.type == r->k.type && - !bversion_cmp(l->k.version, r->k.version) && - !bkey_cmp(l->k.p, bkey_start_pos(&r->k))) - return ops->key_merge(c, l, r); + if (key_merging_disabled(c) || + !ops->key_merge || + l->k.type != r->k.type || + bversion_cmp(l->k.version, r->k.version) || + bkey_cmp(l->k.p, bkey_start_pos(&r->k))) + return BCH_MERGE_NOMERGE; - return BCH_MERGE_NOMERGE; + ret = ops->key_merge(c, l, r); + + if (ret != BCH_MERGE_NOMERGE) + l->k.needs_whiteout |= r->k.needs_whiteout; + return ret; } static const struct old_bkey_type { |