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

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
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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;
+6 −15
Original line number Diff line number Diff line
@@ -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)
{
+1 −1
Original line number Diff line number Diff line
@@ -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);