summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-02-02 23:38:03 -0900
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:35:23 -0800
commit04caca85526c70fa1eee1ad8aefd1cbc53f4ad75 (patch)
treee19bdc7e12edc77edf42bda0a2592c6f5531ee40
parentf7f9d50ca4a1f574522e9b59b6cc98961550c321 (diff)
bcache: More key merging
-rw-r--r--drivers/md/bcache/bset.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index 161bb5cddc68..0c68c532b04a 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -919,39 +919,48 @@ struct bkey_packed *bch_bset_insert(struct btree_keys *b,
where, false))
return NULL;
+ src = bkey_pack_key(&packed, &insert->k, f)
+ ? &packed
+ : bkey_to_packed(insert);
+
/*
* Can we overwrite the current key, instead of doing a memmove()?
*
- * This is only legal for extents that are marked as deleted - because
+ * For extents, only legal to overwrite keys that are deleted - because
* extents are marked as deleted iff they are 0 size, deleted extents
- * don't overlap with any other existing keys. Non extents marked as
- * deleted may be needed as whiteouts, until the node is rewritten.
+ * don't overlap with any other existing keys.
+ *
+ * For non extents marked as deleted may be needed as whiteouts, until
+ * the node is rewritten, only legal to overwrite if the new key
+ * compares equal to the old.
*/
- if (b->ops->is_extents &&
- where != bset_bkey_last(i) &&
- where->u64s == insert->k.u64s &&
- bkey_deleted(where)) {
- if (!bkey_deleted(&insert->k))
- btree_keys_account_key_add(&b->nr,
- bkey_to_packed(insert));
-
- bkey_copy((void *) where, insert);
+ if (where != bset_bkey_last(i) &&
+ where->u64s == src->u64s &&
+ (b->ops->is_extents
+ ? bkey_deleted(where)
+ : !bkey_cmp_left_packed(f, where, insert->k.p))) {
+ if (!bkey_deleted(where))
+ btree_keys_account_key_drop(&b->nr, where);
+
+ memcpy(where, src,
+ bkeyp_key_bytes(f, src));
+ memcpy(bkeyp_val(f, where), &insert->v,
+ bkeyp_val_bytes(f, src));
+
+ if (!bkey_deleted(src))
+ btree_keys_account_key_add(&b->nr, src);
return NULL;
}
- src = bkey_pack_key(&packed, &insert->k, f)
- ? &packed
- : bkey_to_packed(insert);
-
memmove((u64 *) where + src->u64s,
where,
(void *) bset_bkey_last(i) - (void *) where);
+ le16_add_cpu(&i->u64s, src->u64s);
memcpy(where, src,
bkeyp_key_bytes(f, src));
memcpy(bkeyp_val(f, where), &insert->v,
bkeyp_val_bytes(f, src));
- le16_add_cpu(&i->u64s, src->u64s);
if (!bkey_deleted(src))
btree_keys_account_key_add(&b->nr, src);