summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-25 17:06:42 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-03-27 23:44:53 -0400
commit09b9b26179af8b4802d65a3df3217eb51d806eb2 (patch)
tree21edccdf2ed433dc0acf8046baacd18180a37885
parent8498b80bf28eb70d29683bd3e18618ec1dc71101 (diff)
bcachefs: Btree iterators now always have a btree_trans
-rw-r--r--fs/bcachefs/btree_iter.c36
-rw-r--r--fs/bcachefs/btree_iter.h21
-rw-r--r--fs/bcachefs/btree_types.h3
3 files changed, 26 insertions, 34 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 41d9341d0e0b..f8003723251e 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -77,7 +77,6 @@ void bch2_btree_node_unlock_write(struct btree *b, struct btree_iter *iter)
void __bch2_btree_node_lock_write(struct btree *b, struct btree_iter *iter)
{
- struct bch_fs *c = iter->c;
struct btree_iter *linked;
unsigned readers = 0;
@@ -96,7 +95,7 @@ void __bch2_btree_node_lock_write(struct btree *b, struct btree_iter *iter)
*/
atomic64_sub(__SIX_VAL(read_lock, readers),
&b->lock.state.counter);
- btree_node_lock_type(c, b, SIX_LOCK_write);
+ btree_node_lock_type(iter->trans->c, b, SIX_LOCK_write);
atomic64_add(__SIX_VAL(read_lock, readers),
&b->lock.state.counter);
}
@@ -198,7 +197,6 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
enum six_lock_type type,
bool may_drop_locks)
{
- struct bch_fs *c = iter->c;
struct btree_iter *linked;
bool ret = true;
@@ -253,7 +251,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
}
if (ret)
- __btree_node_lock_type(c, b, type);
+ __btree_node_lock_type(iter->trans->c, b, type);
else
trans_restart();
@@ -643,8 +641,8 @@ static inline struct bkey_s_c __btree_iter_unpack(struct btree_iter *iter,
ret = bkey_disassemble(l->b, k, u);
- if (debug_check_bkeys(iter->c))
- bch2_bkey_debugcheck(iter->c, l->b, ret);
+ if (debug_check_bkeys(iter->trans->c))
+ bch2_bkey_debugcheck(iter->trans->c, l->b, ret);
return ret;
}
@@ -833,7 +831,7 @@ void bch2_btree_iter_reinit_node(struct btree_iter *iter, struct btree *b)
static inline int btree_iter_lock_root(struct btree_iter *iter,
unsigned depth_want)
{
- struct bch_fs *c = iter->c;
+ struct bch_fs *c = iter->trans->c;
struct btree *b;
enum six_lock_type lock_type;
unsigned i;
@@ -881,11 +879,12 @@ static inline int btree_iter_lock_root(struct btree_iter *iter,
noinline
static void btree_iter_prefetch(struct btree_iter *iter)
{
+ struct bch_fs *c = iter->trans->c;
struct btree_iter_level *l = &iter->l[iter->level];
struct btree_node_iter node_iter = l->iter;
struct bkey_packed *k;
BKEY_PADDED(k) tmp;
- unsigned nr = test_bit(BCH_FS_STARTED, &iter->c->flags)
+ unsigned nr = test_bit(BCH_FS_STARTED, &c->flags)
? (iter->level > 1 ? 0 : 2)
: (iter->level > 1 ? 1 : 16);
bool was_locked = btree_node_locked(iter, iter->level);
@@ -900,8 +899,7 @@ static void btree_iter_prefetch(struct btree_iter *iter)
break;
bch2_bkey_unpack(l->b, &tmp.k, k);
- bch2_btree_node_prefetch(iter->c, iter, &tmp.k,
- iter->level - 1);
+ bch2_btree_node_prefetch(c, iter, &tmp.k, iter->level - 1);
}
if (!was_locked)
@@ -910,6 +908,7 @@ static void btree_iter_prefetch(struct btree_iter *iter)
static inline int btree_iter_down(struct btree_iter *iter)
{
+ struct bch_fs *c = iter->trans->c;
struct btree_iter_level *l = &iter->l[iter->level];
struct btree *b;
unsigned level = iter->level - 1;
@@ -921,7 +920,7 @@ static inline int btree_iter_down(struct btree_iter *iter)
bch2_bkey_unpack(l->b, &tmp.k,
bch2_btree_node_iter_peek(&l->iter, l->b));
- b = bch2_btree_node_get(iter->c, iter, &tmp.k, level, lock_type, true);
+ b = bch2_btree_node_get(c, iter, &tmp.k, level, lock_type, true);
if (unlikely(IS_ERR(b)))
return PTR_ERR(b);
@@ -945,7 +944,7 @@ int __must_check __bch2_btree_iter_traverse(struct btree_iter *);
static int btree_iter_traverse_error(struct btree_iter *iter, int ret)
{
- struct bch_fs *c = iter->c;
+ struct bch_fs *c = iter->trans->c;
struct btree_iter *linked, *sorted_iters, **i;
retry_all:
bch2_btree_iter_unlock(iter);
@@ -1274,9 +1273,9 @@ static inline struct bkey_s_c btree_iter_peek_uptodate(struct btree_iter *iter)
__bch2_btree_node_iter_peek_all(&l->iter, l->b));
}
- if (debug_check_bkeys(iter->c) &&
+ if (debug_check_bkeys(iter->trans->c) &&
!bkey_deleted(ret.k))
- bch2_bkey_debugcheck(iter->c, l->b, ret);
+ bch2_bkey_debugcheck(iter->trans->c, l->b, ret);
return ret;
}
@@ -1581,17 +1580,18 @@ struct bkey_s_c bch2_btree_iter_next_slot(struct btree_iter *iter)
return __bch2_btree_iter_peek_slot(iter);
}
-static inline void bch2_btree_iter_init(struct btree_iter *iter,
- struct bch_fs *c, enum btree_id btree_id,
+static inline void bch2_btree_iter_init(struct btree_trans *trans,
+ struct btree_iter *iter, enum btree_id btree_id,
struct bpos pos, unsigned flags)
{
+ struct bch_fs *c = trans->c;
unsigned i;
if (btree_id == BTREE_ID_EXTENTS &&
!(flags & BTREE_ITER_NODES))
flags |= BTREE_ITER_IS_EXTENTS;
- iter->c = c;
+ iter->trans = trans;
iter->pos = pos;
bkey_init(&iter->k);
iter->k.p = pos;
@@ -1827,7 +1827,7 @@ got_slot:
iter = &trans->iters[idx];
iter->id = iter_id;
- bch2_btree_iter_init(iter, trans->c, btree_id, pos, flags);
+ bch2_btree_iter_init(trans, iter, btree_id, pos, flags);
} else {
iter = &trans->iters[idx];
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h
index 54778b36e990..8d8eda0afa6e 100644
--- a/fs/bcachefs/btree_iter.h
+++ b/fs/bcachefs/btree_iter.h
@@ -194,17 +194,19 @@ static inline int btree_iter_cmp(const struct btree_iter *l,
return __btree_iter_cmp(l->btree_id, l->pos, r);
}
+int bch2_trans_unlock(struct btree_trans *);
+
/*
* Unlocks before scheduling
* Note: does not revalidate iterator
*/
-static inline void bch2_btree_iter_cond_resched(struct btree_iter *iter)
+static inline void bch2_trans_cond_resched(struct btree_trans *trans)
{
if (need_resched()) {
- bch2_btree_iter_unlock(iter);
+ bch2_trans_unlock(trans);
schedule();
} else if (race_fault()) {
- bch2_btree_iter_unlock(iter);
+ bch2_trans_unlock(trans);
}
}
@@ -232,7 +234,7 @@ static inline struct bkey_s_c __bch2_btree_iter_peek(struct btree_iter *iter,
static inline struct bkey_s_c __bch2_btree_iter_next(struct btree_iter *iter,
unsigned flags)
{
- bch2_btree_iter_cond_resched(iter);
+ bch2_trans_cond_resched(iter->trans);
return flags & BTREE_ITER_SLOTS
? bch2_btree_iter_next_slot(iter)
@@ -308,20 +310,9 @@ static inline void bch2_trans_begin_updates(struct btree_trans *trans)
}
void *bch2_trans_kmalloc(struct btree_trans *, size_t);
-int bch2_trans_unlock(struct btree_trans *);
void bch2_trans_init(struct btree_trans *, struct bch_fs *);
int bch2_trans_exit(struct btree_trans *);
-static inline void bch2_trans_cond_resched(struct btree_trans *trans)
-{
- if (need_resched()) {
- bch2_trans_unlock(trans);
- schedule();
- } else if (race_fault()) {
- bch2_trans_unlock(trans);
- }
-}
-
#ifdef TRACE_TRANSACTION_RESTARTS
#define bch2_trans_begin(_trans) \
do { \
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index e8158b127e31..441233218205 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -10,6 +10,7 @@
struct open_bucket;
struct btree_update;
+struct btree_trans;
#define MAX_BSETS 3U
@@ -208,7 +209,7 @@ enum btree_iter_uptodate {
* @nodes_intent_locked - bitmask indicating which locks are intent locks
*/
struct btree_iter {
- struct bch_fs *c;
+ struct btree_trans *trans;
struct bpos pos;
u8 flags;