diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-04-07 06:23:43 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2017-01-18 21:39:00 -0900 |
commit | f89da52d37ee356bd095635d13fef85806f1e314 (patch) | |
tree | 9ef47759d3a24a7ebbcede6c5730fab3a344e194 | |
parent | bcdadb7d10b2ea5172cf84cf9a2046fb799e67aa (diff) |
bcache: reimplement handle_existing_key_newer()
-rw-r--r-- | drivers/md/bcache/extents.c | 83 |
1 files changed, 11 insertions, 72 deletions
diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c index 1902ade8d1c7..1c0d019cae76 100644 --- a/drivers/md/bcache/extents.c +++ b/drivers/md/bcache/extents.c @@ -985,57 +985,6 @@ enum btree_insert_hook_ret bch_extent_cmpxchg(struct btree_insert_hook *hook, } } -#if 0 -/* We are trying to insert a key with an older version than the existing one */ -static void handle_existing_key_newer(struct btree_iter *iter, - struct bkey_i *insert, - const struct bkey *k, - struct journal_res *res) -{ - struct bkey_i *split; - - /* k is the key currently in the tree, 'insert' the new key */ - - switch (bch_extent_overlap(k, &insert->k)) { - case BCH_EXTENT_OVERLAP_FRONT: - /* k and insert share the start, remove it from insert */ - bch_cut_subtract_front(iter, k->p, bkey_i_to_s(insert)); - break; - - case BCH_EXTENT_OVERLAP_BACK: - /* k and insert share the end, remove it from insert */ - bch_cut_subtract_back(iter, bkey_start_pos(k), - bkey_i_to_s(insert)); - break; - - case BCH_EXTENT_OVERLAP_MIDDLE: - /* - * We have an overlap where @k (newer version) splits - * @insert (older version) in three: - * - start only in insert - * - middle common section -- keep k - * - end only in insert - * - * Insert the start of @insert ourselves, then update - * @insert to to represent the end. - * - * Since we're splitting the insert key, we have to use - * bch_btree_insert_and_journal(), which adds a journal - * entry to @res. - */ - split = bch_key_split(bkey_start_pos(k), insert), - bch_cut_subtract_front(iter, k->p, bkey_i_to_s(insert)); - bch_btree_insert_and_journal(iter, split, res); - break; - - case BCH_EXTENT_OVERLAP_ALL: - /* k completely covers insert -- drop insert */ - bch_drop_subtract(iter, bkey_i_to_s(insert)); - break; - } -} -#endif - #define MAX_LOCK_HOLD_TIME (5 * NSEC_PER_MSEC) static enum btree_insert_ret extent_insert_should_stop(struct btree_iter *iter, @@ -1097,9 +1046,16 @@ __extent_insert_advance_pos(struct btree_insert_hook *hook, struct journal_res *res, struct bucket_stats_cache_set *stats) { - enum btree_insert_hook_ret ret = hook - ? hook->fn(hook, iter, next_pos, k, insert) - : BTREE_HOOK_DO_INSERT; + enum btree_insert_hook_ret ret; + + if (k.k && k.k->size && + insert->k.version && + k.k->version > insert->k.version) + ret = BTREE_HOOK_NO_INSERT; + else if (hook) + ret = hook->fn(hook, iter, next_pos, k, insert); + else + ret = BTREE_HOOK_DO_INSERT; EBUG_ON(bkey_deleted(&insert->k) || !insert->k.size); @@ -1254,24 +1210,7 @@ bch_insert_fixup_extent(struct btree_iter *iter, start_time, nr_done); if (ret != BTREE_INSERT_OK) goto stop; -#if 0 - /* - * Currently broken w.r.t. cmpxchg: - - * handle_existing_key_newer() can't insert @insert itself - * (which it does when @k splits @insert) because bkey_cmpxchg() - * hasn't seen @insert yet, and might not want to insert it: - * - * need to change handle_existing_key_newer() to just drop the - * tail half of the split until later, and have - * btree_insert_key() be responsible for inserting it later - - * but tricky: - */ - if (k.k->size && insert->k.version && - insert->k.version < k.k->version) { - handle_existing_key_newer(iter, insert, k.k, res); - continue; - } -#endif + /* * Only call advance pos & call hook for nonzero size extents: * If hook returned BTREE_HOOK_NO_INSERT, @insert no longer |