block: simplify blk_recalc_rq_segments
Return the segement and let the callers assign them, which makes the code a littler more obvious. Also pass the request instead of q plus bio chain, allowing for the use of rq_for_each_bvec. Reviewed-by: Hannes Reinecke <hare@suse.com> Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
14ccb66b3f
commit
e9cd19c0c1
|
@ -1152,7 +1152,7 @@ static int blk_cloned_rq_check_limits(struct request_queue *q,
|
|||
* Recalculate it to check the request correctly on this queue's
|
||||
* limitation.
|
||||
*/
|
||||
blk_recalc_rq_segments(rq);
|
||||
rq->nr_phys_segments = blk_recalc_rq_segments(rq);
|
||||
if (rq->nr_phys_segments > queue_max_segments(q)) {
|
||||
printk(KERN_ERR "%s: over max segments limit. (%hu > %hu)\n",
|
||||
__func__, rq->nr_phys_segments, queue_max_segments(q));
|
||||
|
@ -1421,7 +1421,7 @@ bool blk_update_request(struct request *req, blk_status_t error,
|
|||
}
|
||||
|
||||
/* recalculate the number of segments */
|
||||
blk_recalc_rq_segments(req);
|
||||
req->nr_phys_segments = blk_recalc_rq_segments(req);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
@ -310,17 +310,16 @@ void blk_queue_split(struct request_queue *q, struct bio **bio)
|
|||
}
|
||||
EXPORT_SYMBOL(blk_queue_split);
|
||||
|
||||
static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
|
||||
struct bio *bio)
|
||||
unsigned int blk_recalc_rq_segments(struct request *rq)
|
||||
{
|
||||
unsigned int nr_phys_segs = 0;
|
||||
struct bvec_iter iter;
|
||||
struct req_iterator iter;
|
||||
struct bio_vec bv;
|
||||
|
||||
if (!bio)
|
||||
if (!rq->bio)
|
||||
return 0;
|
||||
|
||||
switch (bio_op(bio)) {
|
||||
switch (bio_op(rq->bio)) {
|
||||
case REQ_OP_DISCARD:
|
||||
case REQ_OP_SECURE_ERASE:
|
||||
case REQ_OP_WRITE_ZEROES:
|
||||
|
@ -329,19 +328,11 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
|
|||
return 1;
|
||||
}
|
||||
|
||||
for_each_bio(bio) {
|
||||
bio_for_each_bvec(bv, bio, iter)
|
||||
bvec_split_segs(q, &bv, &nr_phys_segs, NULL, UINT_MAX);
|
||||
}
|
||||
|
||||
rq_for_each_bvec(bv, rq, iter)
|
||||
bvec_split_segs(rq->q, &bv, &nr_phys_segs, NULL, UINT_MAX);
|
||||
return nr_phys_segs;
|
||||
}
|
||||
|
||||
void blk_recalc_rq_segments(struct request *rq)
|
||||
{
|
||||
rq->nr_phys_segments = __blk_recalc_rq_segments(rq->q, rq->bio);
|
||||
}
|
||||
|
||||
static inline struct scatterlist *blk_next_sg(struct scatterlist **sg,
|
||||
struct scatterlist *sglist)
|
||||
{
|
||||
|
|
|
@ -211,7 +211,7 @@ struct request *attempt_back_merge(struct request_queue *q, struct request *rq);
|
|||
struct request *attempt_front_merge(struct request_queue *q, struct request *rq);
|
||||
int blk_attempt_req_merge(struct request_queue *q, struct request *rq,
|
||||
struct request *next);
|
||||
void blk_recalc_rq_segments(struct request *rq);
|
||||
unsigned int blk_recalc_rq_segments(struct request *rq);
|
||||
void blk_rq_set_mixed_merge(struct request *rq);
|
||||
bool blk_rq_merge_ok(struct request *rq, struct bio *bio);
|
||||
enum elv_merge blk_try_merge(struct request *rq, struct bio *bio);
|
||||
|
|
Loading…
Reference in New Issue