summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/bset.c20
-rw-r--r--drivers/md/bcache/bset.h54
-rw-r--r--drivers/md/bcache/btree_update.c6
-rw-r--r--drivers/md/bcache/extents.c13
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)