@@ -16,23 +16,17 @@ static bool blk_map_iter_next(struct request *req, struct blk_dma_iter *iter,
1616 unsigned int max_size ;
1717 struct bio_vec bv ;
1818
19- if (req -> rq_flags & RQF_SPECIAL_PAYLOAD ) {
20- if (!iter -> bio )
21- return false;
22- vec -> paddr = bvec_phys (& req -> special_vec );
23- vec -> len = req -> special_vec .bv_len ;
24- iter -> bio = NULL ;
25- return true;
26- }
27-
2819 if (!iter -> iter .bi_size )
2920 return false;
3021
31- bv = mp_bvec_iter_bvec (iter -> bio -> bi_io_vec , iter -> iter );
22+ bv = mp_bvec_iter_bvec (iter -> bvec , iter -> iter );
3223 vec -> paddr = bvec_phys (& bv );
3324 max_size = get_max_segment_size (& req -> q -> limits , vec -> paddr , UINT_MAX );
3425 bv .bv_len = min (bv .bv_len , max_size );
35- bio_advance_iter_single (iter -> bio , & iter -> iter , bv .bv_len );
26+ bvec_iter_advance_single (iter -> bvec , & iter -> iter , bv .bv_len );
27+
28+ if (req -> rq_flags & RQF_SPECIAL_PAYLOAD )
29+ return true;
3630
3731 /*
3832 * If we are entirely done with this bi_io_vec entry, check if the next
@@ -47,15 +41,16 @@ static bool blk_map_iter_next(struct request *req, struct blk_dma_iter *iter,
4741 break ;
4842 iter -> bio = iter -> bio -> bi_next ;
4943 iter -> iter = iter -> bio -> bi_iter ;
44+ iter -> bvec = iter -> bio -> bi_io_vec ;
5045 }
5146
52- next = mp_bvec_iter_bvec (iter -> bio -> bi_io_vec , iter -> iter );
47+ next = mp_bvec_iter_bvec (iter -> bvec , iter -> iter );
5348 if (bv .bv_len + next .bv_len > max_size ||
5449 !biovec_phys_mergeable (req -> q , & bv , & next ))
5550 break ;
5651
5752 bv .bv_len += next .bv_len ;
58- bio_advance_iter_single (iter -> bio , & iter -> iter , next .bv_len );
53+ bvec_iter_advance_single (iter -> bvec , & iter -> iter , next .bv_len );
5954 }
6055
6156 vec -> len = bv .bv_len ;
@@ -158,6 +153,11 @@ bool blk_rq_dma_map_iter_start(struct request *req, struct device *dma_dev,
158153 memset (& iter -> p2pdma , 0 , sizeof (iter -> p2pdma ));
159154 iter -> status = BLK_STS_OK ;
160155
156+ if (req -> rq_flags & RQF_SPECIAL_PAYLOAD )
157+ iter -> bvec = & req -> special_vec ;
158+ else
159+ iter -> bvec = req -> bio -> bi_io_vec ;
160+
161161 /*
162162 * Grab the first segment ASAP because we'll need it to check for P2P
163163 * transfers.
@@ -253,8 +253,10 @@ int __blk_rq_map_sg(struct request *rq, struct scatterlist *sglist,
253253 int nsegs = 0 ;
254254
255255 /* the internal flush request may not have bio attached */
256- if (iter .bio )
256+ if (iter .bio ) {
257257 iter .iter = iter .bio -> bi_iter ;
258+ iter .bvec = iter .bio -> bi_io_vec ;
259+ }
258260
259261 while (blk_map_iter_next (rq , & iter , & vec )) {
260262 * last_sg = blk_next_sg (last_sg , sglist );
0 commit comments