summaryrefslogtreecommitdiff
path: root/libbcachefs/bkey_methods.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/bkey_methods.c')
-rw-r--r--libbcachefs/bkey_methods.c19
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 {