diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-01 17:17:16 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-01 17:33:19 -0400 |
commit | bb6f4111fbfe2550eb7b583586e732a473ba62f0 (patch) | |
tree | 72f01b9dbeaba544efb75016309c0da6839913ae /libbcachefs/btree_iter.c | |
parent | d7bfc55d236363c7f9d2edee7437202497e462b5 (diff) |
Update bcachefs sources to 9abf628c70 bcachefs: Fix a spurious error in fsck
Diffstat (limited to 'libbcachefs/btree_iter.c')
-rw-r--r-- | libbcachefs/btree_iter.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index 70c3132e..95ee9f61 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -152,7 +152,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, * the prev sibling in btree node merging: */ if (iter->nodes_locked && - __ffs(iter->nodes_locked) == level && + __ffs(iter->nodes_locked) <= level && __btree_iter_cmp(iter->btree_id, pos, iter)) return false; @@ -592,6 +592,8 @@ static inline void __btree_iter_init(struct btree_iter *iter, /* Skip to first non whiteout: */ if (b->level) bch2_btree_node_iter_peek(&l->iter, b); + + btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK); } static inline void btree_iter_node_set(struct btree_iter *iter, @@ -1084,6 +1086,8 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter) EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != (iter->btree_id == BTREE_ID_EXTENTS)); EBUG_ON(iter->flags & BTREE_ITER_SLOTS); + EBUG_ON(iter->uptodate == BTREE_ITER_UPTODATE && + !btree_node_locked(iter, 0)); if (iter->uptodate == BTREE_ITER_UPTODATE) { struct bkey_packed *k = @@ -1093,8 +1097,6 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter) .v = bkeyp_val(&l->b->format, k) }; - EBUG_ON(!btree_node_locked(iter, 0)); - if (debug_check_bkeys(iter->c)) bch2_bkey_debugcheck(iter->c, l->b, ret); return ret; @@ -1257,16 +1259,16 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != (iter->btree_id == BTREE_ID_EXTENTS)); EBUG_ON(!(iter->flags & BTREE_ITER_SLOTS)); + EBUG_ON(iter->uptodate == BTREE_ITER_UPTODATE && + !btree_node_locked(iter, 0)); if (iter->uptodate == BTREE_ITER_UPTODATE) { - struct bkey_s_c ret = { .k = &iter->k };; + struct bkey_s_c ret = { .k = &iter->k }; if (!bkey_deleted(&iter->k)) ret.v = bkeyp_val(&l->b->format, __bch2_btree_node_iter_peek_all(&l->iter, l->b)); - EBUG_ON(!btree_node_locked(iter, 0)); - if (debug_check_bkeys(iter->c)) bch2_bkey_debugcheck(iter->c, l->b, ret); return ret; |