block: simplify blk_recalc_rq_segments [Linux 5.3]

This Linux kernel change "block: simplify blk_recalc_rq_segments" is included in the Linux 5.3 release. This change is authored by Christoph Hellwig <hch [at] lst.de> on Thu Jun 6 12:29:02 2019 +0200. The commit for this change in Linux stable tree is e9cd19c (patch).

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>

There are 27 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 block/blk-core.c  |  4 ++--
 block/blk-merge.c | 21 ++++++---------------
 block/blk.h       |  2 +-
 3 files changed, 9 insertions(+), 18 deletions(-)

diff --git a/block/blk-core.c b/block/blk-core.c
index ef998a7..ccba87b 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -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;
diff --git a/block/blk-merge.c b/block/blk-merge.c
index 72b4fd8..2ea21ff 100644
--- a/block/blk-merge.c
+++ b/block/blk-merge.c
@@ -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)
 {
diff --git a/block/blk.h b/block/blk.h
index a1d33cb..c62e801 100644
--- a/block/blk.h
+++ b/block/blk.h
@@ -211,7 +211,7 @@ int ll_front_merge_fn(struct request *req,  struct bio *bio,
 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);

Leave a Reply

Your email address will not be published. Required fields are marked *