diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-27 16:22:45 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-27 16:22:45 -0400 |
commit | 9b233320cdbe4a89f93e926074381f5db3133dbc (patch) | |
tree | 9885e9a4f4646c187db978539120f5e28ad861dc | |
parent | 2cb70a82bc0ca05d8c3cf666d221badd5724e339 (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.h | 15 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.c | 9 | ||||
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/extents.c | 6 |
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 *, |