History

block: allow for_each_bvec to support zero len bvec

Block layer usually doesn't support or allow zero-length bvec. Since commit 1bdc76aea115 ("iov_iter: use bvec iterator to implement iterate_bvec()"), iterate_bvec() switches to bvec iterator. However, Al mentioned that 'Zero-length segments are not disallowed' in iov_iter. Fixes for_each_bvec() so that it can move on after seeing one zero length bvec.

Ming Lei committed 6 years ago

Commit 7e249691 parent e11d80a1 file · +8 −1Browse files

Showing the changes to include/linux (1 of 1 file). Show all

Unified · Split

include/linux/bvec.h+8−1
@@ -117,11 +117,18 @@ static inline bool bvec_iter_advance(const struct bio_vec *bv, · 116 unmodified lines
117 return true;117 return true;
118}118}
119 119
120static inline void bvec_iter_skip_zero_bvec(struct bvec_iter *iter)
121{
122 iter->bi_bvec_done = 0;
123 iter->bi_idx++;
124}
125
120#define for_each_bvec(bvl, bio_vec, iter, start) \126#define for_each_bvec(bvl, bio_vec, iter, start) \
121 for (iter = (start); \127 for (iter = (start); \
122 (iter).bi_size && \128 (iter).bi_size && \
123 ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \129 ((bvl = bvec_iter_bvec((bio_vec), (iter))), 1); \
124 bvec_iter_advance((bio_vec), &(iter), (bvl).bv_len))130 (bvl).bv_len ? (void)bvec_iter_advance((bio_vec), &(iter), \
131 (bvl).bv_len) : bvec_iter_skip_zero_bvec(&(iter)))
125 132
126/* for iterating one bio from start to end */133/* for iterating one bio from start to end */
127#define BVEC_ITER_ALL_INIT (struct bvec_iter) \134#define BVEC_ITER_ALL_INIT (struct bvec_iter) \