diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-02-02 23:38:03 -0900 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-07 12:35:23 -0800 |
commit | 04caca85526c70fa1eee1ad8aefd1cbc53f4ad75 (patch) | |
tree | e19bdc7e12edc77edf42bda0a2592c6f5531ee40 | |
parent | f7f9d50ca4a1f574522e9b59b6cc98961550c321 (diff) |
bcache: More key merging
-rw-r--r-- | drivers/md/bcache/bset.c | 43 |
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); |