Commit e9cd19c0 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

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: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 14ccb66b
...@@ -1152,7 +1152,7 @@ static int blk_cloned_rq_check_limits(struct request_queue *q, ...@@ -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 * Recalculate it to check the request correctly on this queue's
* limitation. * limitation.
*/ */
blk_recalc_rq_segments(rq); rq->nr_phys_segments = blk_recalc_rq_segments(rq);
if (rq->nr_phys_segments > queue_max_segments(q)) { if (rq->nr_phys_segments > queue_max_segments(q)) {
printk(KERN_ERR "%s: over max segments limit. (%hu > %hu)\n", printk(KERN_ERR "%s: over max segments limit. (%hu > %hu)\n",
__func__, rq->nr_phys_segments, queue_max_segments(q)); __func__, rq->nr_phys_segments, queue_max_segments(q));
...@@ -1421,7 +1421,7 @@ bool blk_update_request(struct request *req, blk_status_t error, ...@@ -1421,7 +1421,7 @@ bool blk_update_request(struct request *req, blk_status_t error,
} }
/* recalculate the number of segments */ /* recalculate the number of segments */
blk_recalc_rq_segments(req); req->nr_phys_segments = blk_recalc_rq_segments(req);
} }
return true; return true;
......
...@@ -310,17 +310,16 @@ void blk_queue_split(struct request_queue *q, struct bio **bio) ...@@ -310,17 +310,16 @@ void blk_queue_split(struct request_queue *q, struct bio **bio)
} }
EXPORT_SYMBOL(blk_queue_split); EXPORT_SYMBOL(blk_queue_split);
static unsigned int __blk_recalc_rq_segments(struct request_queue *q, unsigned int blk_recalc_rq_segments(struct request *rq)
struct bio *bio)
{ {
unsigned int nr_phys_segs = 0; unsigned int nr_phys_segs = 0;
struct bvec_iter iter; struct req_iterator iter;
struct bio_vec bv; struct bio_vec bv;
if (!bio) if (!rq->bio)
return 0; return 0;
switch (bio_op(bio)) { switch (bio_op(rq->bio)) {
case REQ_OP_DISCARD: case REQ_OP_DISCARD:
case REQ_OP_SECURE_ERASE: case REQ_OP_SECURE_ERASE:
case REQ_OP_WRITE_ZEROES: case REQ_OP_WRITE_ZEROES:
...@@ -329,19 +328,11 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, ...@@ -329,19 +328,11 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q,
return 1; return 1;
} }
for_each_bio(bio) { rq_for_each_bvec(bv, rq, iter)
bio_for_each_bvec(bv, bio, iter) bvec_split_segs(rq->q, &bv, &nr_phys_segs, NULL, UINT_MAX);
bvec_split_segs(q, &bv, &nr_phys_segs, NULL, UINT_MAX);
}
return nr_phys_segs; 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, static inline struct scatterlist *blk_next_sg(struct scatterlist **sg,
struct scatterlist *sglist) struct scatterlist *sglist)
{ {
......
...@@ -211,7 +211,7 @@ struct request *attempt_back_merge(struct request_queue *q, struct request *rq); ...@@ -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); struct request *attempt_front_merge(struct request_queue *q, struct request *rq);
int blk_attempt_req_merge(struct request_queue *q, struct request *rq, int blk_attempt_req_merge(struct request_queue *q, struct request *rq,
struct request *next); 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); void blk_rq_set_mixed_merge(struct request *rq);
bool blk_rq_merge_ok(struct request *rq, struct bio *bio); bool blk_rq_merge_ok(struct request *rq, struct bio *bio);
enum elv_merge blk_try_merge(struct request *rq, struct bio *bio); enum elv_merge blk_try_merge(struct request *rq, struct bio *bio);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment