summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-06-27 16:22:45 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-06-27 16:22:45 -0400
commit9b233320cdbe4a89f93e926074381f5db3133dbc (patch)
tree9885e9a4f4646c187db978539120f5e28ad861dc
parent2cb70a82bc0ca05d8c3cf666d221badd5724e339 (diff)
bcachefs: fix an assertion
bch2_btree_iter_peek_slot() -> bch2_bkey_debugcheck() was popping, because __bch2_btree_iter_peek_slot() was using KEY_TYPE_DELETED for an extent hole
-rw-r--r--fs/bcachefs/bkey.h15
-rw-r--r--fs/bcachefs/btree_iter.c9
-rw-r--r--fs/bcachefs/btree_update_leaf.c2
-rw-r--r--fs/bcachefs/extents.c6
4 files changed, 11 insertions, 21 deletions
diff --git a/fs/bcachefs/bkey.h b/fs/bcachefs/bkey.h
index 2d6c8a230a73..565dc239a3de 100644
--- a/fs/bcachefs/bkey.h
+++ b/fs/bcachefs/bkey.h
@@ -52,21 +52,6 @@ static inline void set_bkey_val_bytes(struct bkey *k, unsigned bytes)
k->u64s = BKEY_U64s + DIV_ROUND_UP(bytes, sizeof(u64));
}
-/*
- * Mark a key as deleted without changing the size of the value (i.e. modifying
- * keys in the btree in place)
- */
-static inline void __set_bkey_deleted(struct bkey *k)
-{
- k->type = KEY_TYPE_DELETED;
-}
-
-static inline void set_bkey_deleted(struct bkey *k)
-{
- __set_bkey_deleted(k);
- set_bkey_val_u64s(k, 0);
-}
-
#define bkey_deleted(_k) ((_k)->type == KEY_TYPE_DELETED)
#define bkey_whiteout(_k) \
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 682a91434775..62c878fd6b3f 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -453,6 +453,8 @@ static void __bch2_btree_node_iter_fix(struct btree_iter *iter,
if (new_u64s &&
btree_iter_pos_cmp_packed(b, &iter->pos, where,
iter->flags & BTREE_ITER_IS_EXTENTS)) {
+ btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
+
bch2_btree_node_iter_push(node_iter, b, where, end);
if (!b->level &&
@@ -482,6 +484,8 @@ found:
goto iter_current_key_not_modified;
}
+ btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
+
bch2_btree_node_iter_sort(node_iter, b);
if (!b->level && node_iter == &iter->l[0].iter)
__btree_iter_peek_all(iter, &iter->l[0], &iter->k);
@@ -1355,6 +1359,7 @@ recheck:
n.p.offset));
EBUG_ON(!n.size);
+ n.type = KEY_TYPE_DISCARD;
}
iter->k = n;
@@ -1375,7 +1380,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter)
if (iter->uptodate == BTREE_ITER_UPTODATE) {
struct bkey_s_c ret = { .k = &iter->k };
- if (!bkey_deleted(&iter->k))
+ if (!bkey_whiteout(&iter->k))
ret.v = bkeyp_val(&l->b->format,
__bch2_btree_node_iter_peek_all(&l->iter, l->b));
@@ -1417,6 +1422,8 @@ struct bkey_s_c bch2_btree_iter_next_slot(struct btree_iter *iter)
if (!bkey_deleted(&iter->k))
__btree_iter_advance(&iter->l[0]);
+ btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
+
return __bch2_btree_iter_peek_slot(iter);
}
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index a62d83070367..526bd2a2a18e 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -205,8 +205,6 @@ btree_insert_key_leaf(struct btree_insert *trans,
int old_live_u64s = b->nr.live_u64s;
int live_u64s_added, u64s_added;
- btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
-
ret = !btree_node_is_extents(b)
? bch2_insert_fixup_key(trans, insert)
: bch2_insert_fixup_extent(trans, insert);
diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c
index b85af711b9f9..bdb1d71ccb2a 100644
--- a/fs/bcachefs/extents.c
+++ b/fs/bcachefs/extents.c
@@ -778,7 +778,7 @@ static bool __bch2_cut_front(struct bpos where, struct bkey_s k)
* cause offset to point to the next bucket:
*/
if (!len)
- __set_bkey_deleted(k.k);
+ k.k->type = KEY_TYPE_DELETED;
else if (bkey_extent_is_data(k.k)) {
struct bkey_s_extent e = bkey_s_to_extent(k);
union bch_extent_entry *entry;
@@ -833,7 +833,7 @@ bool bch2_cut_back(struct bpos where, struct bkey *k)
k->size = len;
if (!len)
- __set_bkey_deleted(k);
+ k->type = KEY_TYPE_DELETED;
return true;
}
@@ -1103,7 +1103,7 @@ static void bch2_drop_subtract(struct extent_insert_state *s, struct bkey_s k)
bch2_subtract_sectors(s, k.s_c,
bkey_start_offset(k.k), k.k->size);
k.k->size = 0;
- __set_bkey_deleted(k.k);
+ k.k->type = KEY_TYPE_DELETED;
}
static bool bch2_extent_merge_inline(struct bch_fs *,