diff options
-rw-r--r-- | drivers/md/bcache/extents.c | 10 |
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); /* |