summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-12-05 22:34:25 -0900
committerKent Overstreet <kent.overstreet@gmail.com>2016-12-05 22:34:25 -0900
commitabb20f675f8b06c2a413715fed79639c902b42bc (patch)
tree81bf6c75cad3461eec5959fbe330ec91971cc627
parent50706f36b51a721791124f4d7348252d4d6d3458 (diff)
bcachefs: fix a regression from extent whiteouts optimizations
checking bkey_whiteout(&s->insert->k->k) in extent_insert_committed() was incorrect, because if we were already finished, the insert key's size would be 0 and 0 size extents are always KEY_TYPE_DELETED (i.e. whiteouts).
-rw-r--r--drivers/md/bcache/extents.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/md/bcache/extents.c b/drivers/md/bcache/extents.c
index 4a13d90d7e57..1758441c0388 100644
--- a/drivers/md/bcache/extents.c
+++ b/drivers/md/bcache/extents.c
@@ -1052,6 +1052,7 @@ struct extent_insert_state {
/* for deleting: */
struct bkey_i whiteout;
bool do_journal;
+ bool deleting;
};
static enum btree_insert_ret
@@ -1123,7 +1124,7 @@ static void extent_insert_committed(struct extent_insert_state *s)
{
struct cache_set *c = s->trans->c;
struct btree_iter *iter = s->insert->iter;
- struct bkey_i *insert = !bkey_whiteout(&s->insert->k->k)
+ struct bkey_i *insert = !s->deleting
? s->insert->k
: &s->whiteout;
BKEY_PADDED(k) split;
@@ -1134,7 +1135,7 @@ static void extent_insert_committed(struct extent_insert_state *s)
if (!bkey_cmp(s->committed, bkey_start_pos(&insert->k)))
return;
- if (bkey_whiteout(&s->insert->k->k) && !s->do_journal) {
+ if (s->deleting && !s->do_journal) {
bch_cut_front(s->committed, insert);
goto done;
}
@@ -1164,7 +1165,7 @@ static void extent_insert_committed(struct extent_insert_state *s)
bch_btree_journal_key(s->trans, iter, &split.k);
- if (!bkey_whiteout(&split.k.k))
+ if (!s->deleting)
extent_bset_insert(c, iter, &split.k);
done:
bch_btree_iter_set_pos_same_leaf(iter, s->committed);
@@ -1568,12 +1569,13 @@ bch_insert_fixup_extent(struct btree_insert *trans,
.trans = trans,
.insert = insert,
.committed = insert->iter->pos,
+ .deleting = bkey_whiteout(&insert->k->k),
};
EBUG_ON(iter->level);
EBUG_ON(bkey_deleted(&insert->k->k) || !insert->k->k.size);
- if (bkey_whiteout(&insert->k->k))
+ if (s.deleting)
return bch_delete_fixup_extent(&s);
/*