diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-30 21:44:05 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-06-30 23:55:25 -0400 |
commit | 3cd2bfa830a546ea5fd594f977fb077fa385f9d3 (patch) | |
tree | a4de5c8e614d2f1cb18384ff534da38c9c698136 | |
parent | 3db5dd5b30a216eca9dd149940a7da478277c0f5 (diff) |
bcachefs: BTREE_ITER_TYPE
also factor out bch2_btree_iter_checks()
-rw-r--r-- | fs/bcachefs/btree_io.c | 2 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.c | 38 | ||||
-rw-r--r-- | fs/bcachefs/btree_iter.h | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 19 | ||||
-rw-r--r-- | fs/bcachefs/journal_seq_blacklist.c | 3 |
5 files changed, 36 insertions, 29 deletions
diff --git a/fs/bcachefs/btree_io.c b/fs/bcachefs/btree_io.c index 0c825bcbc45c..847dfd685eac 100644 --- a/fs/bcachefs/btree_io.c +++ b/fs/bcachefs/btree_io.c @@ -1547,7 +1547,7 @@ static void bch2_btree_node_write_error(struct bch_fs *c, __bch2_btree_iter_init(&iter, c, b->btree_id, b->key.k.p, BTREE_MAX_DEPTH, - b->level, 0); + b->level, BTREE_ITER_NODES); retry: ret = bch2_btree_iter_traverse(&iter); if (ret) diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 3f8aae6a47eb..16bd36f22d9d 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1074,6 +1074,18 @@ int __must_check bch2_btree_iter_traverse(struct btree_iter *iter) return ret; } +static inline void bch2_btree_iter_checks(struct btree_iter *iter, + enum btree_iter_type type) +{ + EBUG_ON(iter->btree_id >= BTREE_ID_NR); + EBUG_ON((iter->flags & BTREE_ITER_TYPE) != type); + EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != + (iter->btree_id == BTREE_ID_EXTENTS && + type != BTREE_ITER_NODES)); + + bch2_btree_iter_verify_locks(iter); +} + /* Iterate across nodes (leaf and interior nodes) */ struct btree *bch2_btree_iter_peek_node(struct btree_iter *iter) @@ -1081,8 +1093,7 @@ struct btree *bch2_btree_iter_peek_node(struct btree_iter *iter) struct btree *b; int ret; - EBUG_ON(iter->flags & BTREE_ITER_IS_EXTENTS); - bch2_btree_iter_verify_locks(iter); + bch2_btree_iter_checks(iter, BTREE_ITER_NODES); if (iter->uptodate == BTREE_ITER_UPTODATE) return iter->l[iter->level].b; @@ -1113,8 +1124,7 @@ struct btree *bch2_btree_iter_next_node(struct btree_iter *iter, unsigned depth) struct btree *b; int ret; - EBUG_ON(iter->flags & BTREE_ITER_IS_EXTENTS); - bch2_btree_iter_verify_locks(iter); + bch2_btree_iter_checks(iter, BTREE_ITER_NODES); btree_iter_up(iter); @@ -1248,10 +1258,7 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter) struct bkey_s_c k; int ret; - EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != - (iter->btree_id == BTREE_ID_EXTENTS)); - EBUG_ON(iter->flags & BTREE_ITER_SLOTS); - bch2_btree_iter_verify_locks(iter); + bch2_btree_iter_checks(iter, BTREE_ITER_KEYS); if (iter->uptodate == BTREE_ITER_UPTODATE) { struct bkey_packed *k = @@ -1324,10 +1331,7 @@ struct bkey_s_c bch2_btree_iter_next(struct btree_iter *iter) struct bkey_packed *p; struct bkey_s_c k; - EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != - (iter->btree_id == BTREE_ID_EXTENTS)); - EBUG_ON(iter->flags & BTREE_ITER_SLOTS); - bch2_btree_iter_verify_locks(iter); + bch2_btree_iter_checks(iter, BTREE_ITER_KEYS); if (unlikely(iter->uptodate != BTREE_ITER_UPTODATE)) { k = bch2_btree_iter_peek(iter); @@ -1421,10 +1425,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) struct btree_iter_level *l = &iter->l[0]; int ret; - EBUG_ON(!!(iter->flags & BTREE_ITER_IS_EXTENTS) != - (iter->btree_id == BTREE_ID_EXTENTS)); - EBUG_ON(!(iter->flags & BTREE_ITER_SLOTS)); - bch2_btree_iter_verify_locks(iter); + bch2_btree_iter_checks(iter, BTREE_ITER_SLOTS); if (iter->uptodate == BTREE_ITER_UPTODATE) { struct bkey_s_c ret = { .k = &iter->k }; @@ -1451,10 +1452,7 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) struct bkey_s_c bch2_btree_iter_next_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)); - bch2_btree_iter_verify_locks(iter); + bch2_btree_iter_checks(iter, BTREE_ITER_SLOTS); iter->pos = btree_type_successor(iter->btree_id, iter->k.p); diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index 99e51b27675d..5b536d678262 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -207,7 +207,8 @@ static inline void bch2_btree_iter_cond_resched(struct btree_iter *iter) #define __for_each_btree_node(_iter, _c, _btree_id, _start, \ _locks_want, _depth, _flags, _b) \ for (__bch2_btree_iter_init((_iter), (_c), (_btree_id), _start, \ - _locks_want, _depth, _flags), \ + _locks_want, _depth, \ + _flags|BTREE_ITER_NODES), \ _b = bch2_btree_iter_peek_node(_iter); \ (_b); \ (_b) = bch2_btree_iter_next_node(_iter, _depth)) diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index aed8d69347a5..f153e3fcbdd0 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -182,19 +182,26 @@ struct btree_node_iter { } data[MAX_BSETS]; }; -#define BTREE_ITER_SLOTS (1 << 0) -#define BTREE_ITER_INTENT (1 << 1) -#define BTREE_ITER_PREFETCH (1 << 2) +enum btree_iter_type { + BTREE_ITER_KEYS, + BTREE_ITER_SLOTS, + BTREE_ITER_NODES, +}; + +#define BTREE_ITER_TYPE ((1 << 2) - 1) + +#define BTREE_ITER_INTENT (1 << 2) +#define BTREE_ITER_PREFETCH (1 << 3) /* * Used in bch2_btree_iter_traverse(), to indicate whether we're searching for * @pos or the first key strictly greater than @pos */ -#define BTREE_ITER_IS_EXTENTS (1 << 3) +#define BTREE_ITER_IS_EXTENTS (1 << 4) /* * indicates we need to call bch2_btree_iter_traverse() to revalidate iterator: */ -#define BTREE_ITER_AT_END_OF_LEAF (1 << 4) -#define BTREE_ITER_ERROR (1 << 5) +#define BTREE_ITER_AT_END_OF_LEAF (1 << 5) +#define BTREE_ITER_ERROR (1 << 6) enum btree_iter_uptodate { BTREE_ITER_UPTODATE = 0, diff --git a/fs/bcachefs/journal_seq_blacklist.c b/fs/bcachefs/journal_seq_blacklist.c index 567289e22ca0..dd0e8d2fce99 100644 --- a/fs/bcachefs/journal_seq_blacklist.c +++ b/fs/bcachefs/journal_seq_blacklist.c @@ -72,7 +72,8 @@ static void journal_seq_blacklist_flush(struct journal *j, n = bl->entries[i]; mutex_unlock(&j->blacklist_lock); - __bch2_btree_iter_init(&iter, c, n.btree_id, n.pos, 0, 0, 0); + __bch2_btree_iter_init(&iter, c, n.btree_id, n.pos, + 0, 0, BTREE_ITER_NODES); b = bch2_btree_iter_peek_node(&iter); |