diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-05-15 09:53:27 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2020-06-09 19:26:51 -0400 |
commit | cac7ff11afe00046358cdb378567b1873660067c (patch) | |
tree | 4f05b3bc115cdafe7d204b08cfbe03f8170cba27 /fs/bcachefs/btree_iter.h | |
parent | 2337ab767ff8476886d4eea350d075e024fb4a40 (diff) |
bcachefs: Ensure bch2_btree_iter_next() always advances
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/btree_iter.h')
-rw-r--r-- | fs/bcachefs/btree_iter.h | 11 |
1 files changed, 5 insertions, 6 deletions
diff --git a/fs/bcachefs/btree_iter.h b/fs/bcachefs/btree_iter.h index b21ca4180caa..5fd274f40016 100644 --- a/fs/bcachefs/btree_iter.h +++ b/fs/bcachefs/btree_iter.h @@ -195,13 +195,14 @@ static inline int btree_iter_cmp(const struct btree_iter *l, * Unlocks before scheduling * Note: does not revalidate iterator */ -static inline void bch2_trans_cond_resched(struct btree_trans *trans) +static inline int bch2_trans_cond_resched(struct btree_trans *trans) { - if (need_resched()) { + if (need_resched() || race_fault()) { bch2_trans_unlock(trans); schedule(); - } else if (race_fault()) { - bch2_trans_unlock(trans); + return bch2_trans_relock(trans) ? 0 : -EINTR; + } else { + return 0; } } @@ -229,8 +230,6 @@ 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_trans_cond_resched(iter->trans); - return flags & BTREE_ITER_SLOTS ? bch2_btree_iter_next_slot(iter) : bch2_btree_iter_next(iter); |