diff options
Diffstat (limited to 'include/linux/bio.h')
-rw-r--r-- | include/linux/bio.h | 35 |
1 files changed, 6 insertions, 29 deletions
diff --git a/include/linux/bio.h b/include/linux/bio.h index 206e5baa..0ad5a87d 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -113,40 +113,17 @@ static inline void *bio_data(struct bio *bio) #define __bio_kunmap_atomic(addr) kunmap_atomic(addr) -static inline struct bio_vec bio_iter_all_peek(const struct bio *bio, +static inline struct bio_vec *bio_next_segment(const struct bio *bio, struct bvec_iter_all *iter) { - if (WARN_ON(iter->idx >= bio->bi_vcnt)) - return (struct bio_vec) { NULL }; + if (iter->idx >= bio->bi_vcnt) + return NULL; - return bvec_iter_all_peek(bio->bi_io_vec, iter); + return &bio->bi_io_vec[iter->idx]; } -static inline void bio_iter_all_advance(const struct bio *bio, - struct bvec_iter_all *iter, - unsigned bytes) -{ - bvec_iter_all_advance(bio->bi_io_vec, iter, bytes); - - WARN_ON(iter->idx > bio->bi_vcnt || - (iter->idx == bio->bi_vcnt && iter->done)); -} - -#define bio_for_each_segment_all_continue(bvl, bio, iter) \ - for (; \ - iter.idx < bio->bi_vcnt && \ - ((bvl = bio_iter_all_peek(bio, &iter)), true); \ - bio_iter_all_advance((bio), &iter, bvl.bv_len)) - -/* - * drivers should _never_ use the all version - the bio may have been split - * before it got to the driver and the driver won't own all of it - */ -#define bio_for_each_segment_all(bvl, bio, iter) \ - for (bvec_iter_all_init(&iter); \ - iter.idx < (bio)->bi_vcnt && \ - ((bvl = bio_iter_all_peek((bio), &iter)), true); \ - bio_iter_all_advance((bio), &iter, bvl.bv_len)) +#define bio_for_each_segment_all(bvl, bio, iter) \ + for ((iter).idx = 0; (bvl = bio_next_segment((bio), &(iter))); (iter).idx++) static inline void bio_advance_iter(struct bio *bio, struct bvec_iter *iter, unsigned bytes) |