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.
Showing the changes to include/linux (1 of 1 file). Show all
Unified · Split
| @@ -117,11 +117,18 @@ static inline bool bvec_iter_advance(const struct bio_vec *bv, · 116 unmodified lines | ||
| 117 | 117 | return true; |
| 118 | 118 | } |
| 119 | 119 | |
| 120 | +static 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 | 126 | #define for_each_bvec(bvl, bio_vec, iter, start) \ |
| 121 | 127 | for (iter = (start); \ |
| 122 | 128 | (iter).bi_size && \ |
| 123 | 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 | 133 | /* for iterating one bio from start to end */ |
| 127 | 134 | #define BVEC_ITER_ALL_INIT (struct bvec_iter) \ |