diff options
-rw-r--r-- | drivers/md/bcache/bset.c | 20 | ||||
-rw-r--r-- | drivers/md/bcache/bset.h | 54 | ||||
-rw-r--r-- | drivers/md/bcache/btree_update.c | 6 | ||||
-rw-r--r-- | drivers/md/bcache/extents.c | 13 |
4 files changed, 57 insertions, 36 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c index 4bee8ad1a956..6f2efcc5ff54 100644 --- a/drivers/md/bcache/bset.c +++ b/drivers/md/bcache/bset.c @@ -117,7 +117,7 @@ void __bch_verify_btree_nr_keys(struct btree_keys *b) for (k = b->set[i].data->start; k != bset_bkey_last(b->set[i].data); k = bkey_next(k)) - if (!bkey_deleted(k)) + if (!bkey_packed_is_whiteout(b, k)) btree_keys_account_key_add(&nr, i, k); BUG_ON(memcmp(&nr, &b->nr, sizeof(nr))); @@ -981,7 +981,7 @@ struct bkey_packed *bch_bset_insert(struct btree_keys *b, bch_bset_fix_lookup_table(b, t, where); - if (!bkey_deleted(src)) + if (!bkey_is_whiteout(&insert->k)) btree_keys_account_key_add(&b->nr, b->nsets, src); bch_verify_key_order(b, iter, where); @@ -1025,10 +1025,10 @@ bool bch_bset_try_overwrite(struct btree_keys *b, return false; overwrite: - if (!bkey_deleted(where)) - btree_keys_account_key_drop(&b->nr, t - b->set, where); - if (!bkey_deleted(src)) - btree_keys_account_key_add(&b->nr, t - b->set, src); + if (!bkey_packed_is_whiteout(b, where)) + btree_keys_account_key_drop(&b->nr, b->nsets, where); + if (!bkey_is_whiteout(&insert->k)) + btree_keys_account_key_add(&b->nr, b->nsets, src); memcpy(where, src, bkeyp_key_bytes(f, src)); memcpy(bkeyp_val(f, where), &insert->v, @@ -1551,7 +1551,7 @@ static struct btree_nr_keys btree_mergesort_simple(struct btree_keys *b, unsigned i; while ((in = bch_btree_node_iter_next_all(iter, b))) { - if (!bkey_deleted(in)) { + if (!bkey_packed_is_whiteout(b, in)) { /* XXX: need better bkey_copy */ memcpy(out, in, bkey_bytes(in)); out = bkey_next(out); @@ -1586,7 +1586,7 @@ static struct btree_nr_keys btree_mergesort(struct btree_keys *dst, memset(&nr, 0, sizeof(nr)); while ((in = bch_btree_node_iter_next_all(iter, src))) { - if (bkey_deleted(in)) + if (bkey_packed_is_whiteout(src, in)) continue; if (bch_bkey_transform(out_f, out, bkey_packed(in) @@ -1624,7 +1624,7 @@ static struct btree_nr_keys btree_mergesort_extents(struct btree_keys *dst, memset(&nr, 0, sizeof(nr)); while ((k = bch_btree_node_iter_next_all(iter, src))) { - if (bkey_deleted(k)) + if (bkey_packed_is_whiteout(src, k)) continue; /* @@ -1778,7 +1778,7 @@ bool bch_maybe_compact_deleted_keys(struct btree_keys *b) for (k = i->start; k != bset_bkey_last(i); k = n) { n = bkey_next(k); - if (!bkey_deleted(k)) { + if (!bkey_packed_is_whiteout(b, k)) { memmove(out, k, bkey_bytes(k)); out = bkey_next(out); } diff --git a/drivers/md/bcache/bset.h b/drivers/md/bcache/bset.h index 23c3561b34d8..f020bf9745af 100644 --- a/drivers/md/bcache/bset.h +++ b/drivers/md/bcache/bset.h @@ -329,25 +329,6 @@ bool bch_bset_try_overwrite(struct btree_keys *, struct btree_node_iter *, struct bset_tree *, struct bkey_packed *, struct bkey_i *); -static inline void btree_keys_account_key(struct btree_nr_keys *n, - unsigned bset, - struct bkey_packed *k, - int sign) -{ - n->live_u64s += k->u64s * sign; - n->bset_u64s[bset] += k->u64s * sign; - - if (bkey_packed(k)) - n->packed_keys += sign; - else - n->unpacked_keys += sign; -} - -#define btree_keys_account_key_add(_nr, _bset_idx, _k) \ - btree_keys_account_key(_nr, _bset_idx, _k, 1) -#define btree_keys_account_key_drop(_nr, _bset_idx, _k) \ - btree_keys_account_key(_nr, _bset_idx, _k, -1) - /* Bkey utility code */ /* Returns true if @k is after iterator position @pos */ @@ -562,6 +543,41 @@ struct bkey_s_c bch_btree_node_iter_peek_unpack(struct btree_node_iter *, (k = bch_btree_node_iter_peek_unpack((iter), (b), (unpacked))).k;\ bch_btree_node_iter_advance(iter, b)) +/* Accounting: */ + +static inline bool bkey_is_whiteout(const struct bkey *k) +{ + return bkey_deleted(k) || + (k->type == KEY_TYPE_DISCARD && !k->version); +} + +static inline bool bkey_packed_is_whiteout(const struct btree_keys *b, + const struct bkey_packed *k) +{ + return bkey_deleted(k) || + (k->type == KEY_TYPE_DISCARD && + !bkey_unpack_key(&b->format, k).version); +} + +static inline void btree_keys_account_key(struct btree_nr_keys *n, + unsigned bset, + struct bkey_packed *k, + int sign) +{ + n->live_u64s += k->u64s * sign; + n->bset_u64s[bset] += k->u64s * sign; + + if (bkey_packed(k)) + n->packed_keys += sign; + else + n->unpacked_keys += sign; +} + +#define btree_keys_account_key_add(_nr, _bset_idx, _k) \ + btree_keys_account_key(_nr, _bset_idx, _k, 1) +#define btree_keys_account_key_drop(_nr, _bset_idx, _k) \ + btree_keys_account_key(_nr, _bset_idx, _k, -1) + /* Sorting */ struct bset_sort_state { diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c index 8693f50f9ce5..515e1355e8cb 100644 --- a/drivers/md/bcache/btree_update.c +++ b/drivers/md/bcache/btree_update.c @@ -682,9 +682,11 @@ void bch_btree_bset_insert_key(struct btree_iter *iter, return; } + if (!bkey_packed_is_whiteout(&b->keys, k)) + btree_keys_account_key_drop(&b->keys.nr, + t - b->keys.set, k); + k->type = KEY_TYPE_DELETED; - btree_keys_account_key_drop(&b->keys.nr, - t - b->keys.set, k); bch_btree_node_iter_fix(iter, b, node_iter, t, k, true); if (t == bset_tree_last(&b->keys) && bkey_deleted(&insert->k)) diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c index 8dbe25c2ebbd..5558c97d1a2a 100644 --- a/drivers/md/bcache/extents.c +++ b/drivers/md/bcache/extents.c @@ -54,8 +54,9 @@ static inline bool should_drop_next_key(struct btree_node_iter *iter, { const struct bkey_format *f = &b->format; struct btree_node_iter_set *l = iter->data, *r = iter->data + 1; + struct bkey_packed *k = __btree_node_offset_to_key(b, l->k); - if (bkey_deleted(__btree_node_offset_to_key(b, l->k))) + if (bkey_packed_is_whiteout(b, k)) return true; if (iter->used < 2) @@ -763,7 +764,7 @@ static void extent_sort_append(struct btree_keys *b, struct bkey_format *f = &b->format; BKEY_PADDED(k) tmp; - if (bkey_deleted(k)) + if (bkey_packed_is_whiteout(b, k)) return; bkey_unpack(&tmp.k, f, k); @@ -1420,7 +1421,7 @@ bch_insert_fixup_extent(struct btree_insert *trans, struct bpos orig_pos = k.k->p; /* The insert key completely covers k, invalidate k */ - if (!bkey_deleted(_k)) + if (!bkey_is_whiteout(k.k)) btree_keys_account_key_drop(&b->keys.nr, t - b->keys.set, _k); @@ -1952,8 +1953,10 @@ static void extent_sort_ptrs(struct cache_set *c, struct bkey_s_extent e) /* * bch_extent_normalize - clean up an extent, dropping stale pointers etc. * - * Returns true if @k should be dropped entirely (when compacting/rewriting - * btree nodes). + * Returns true if @k should be dropped entirely + * + * For existing keys, only called when btree nodes are being rewritten, not when + * they're merely being compacted/resorted in memory. */ static bool __bch_extent_normalize(struct cache_set *c, struct bkey_s k, bool sort) |