summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-06-30 21:44:05 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-06-30 23:55:25 -0400
commit3cd2bfa830a546ea5fd594f977fb077fa385f9d3 (patch)
treea4de5c8e614d2f1cb18384ff534da38c9c698136
parent3db5dd5b30a216eca9dd149940a7da478277c0f5 (diff)
bcachefs: BTREE_ITER_TYPE
also factor out bch2_btree_iter_checks()
-rw-r--r--fs/bcachefs/btree_io.c2
-rw-r--r--fs/bcachefs/btree_iter.c38
-rw-r--r--fs/bcachefs/btree_iter.h3
-rw-r--r--fs/bcachefs/btree_types.h19
-rw-r--r--fs/bcachefs/journal_seq_blacklist.c3
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);