lkml.org 
[lkml]   [2020]   [Sep]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 099/214] block: respect queue limit of max discard segment
    Date
    From: Ming Lei <ming.lei@redhat.com>

    [ Upstream commit 943b40c832beb71115e38a1c4d99b640b5342738 ]

    When queue_max_discard_segments(q) is 1, blk_discard_mergable() will
    return false for discard request, then normal request merge is applied.
    However, only queue_max_segments() is checked, so max discard segment
    limit isn't respected.

    Check max discard segment limit in the request merge code for fixing
    the issue.

    Discard request failure of virtio_blk is fixed.

    Fixes: 69840466086d ("block: fix the DISCARD request merge")
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Cc: Stefano Garzarella <sgarzare@redhat.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/blk-merge.c | 11 +++++++++--
    1 file changed, 9 insertions(+), 2 deletions(-)

    diff --git a/block/blk-merge.c b/block/blk-merge.c
    index 93cff719b0661..c874931bae6b5 100644
    --- a/block/blk-merge.c
    +++ b/block/blk-merge.c
    @@ -553,10 +553,17 @@ int blk_rq_map_sg(struct request_queue *q, struct request *rq,
    }
    EXPORT_SYMBOL(blk_rq_map_sg);

    +static inline unsigned int blk_rq_get_max_segments(struct request *rq)
    +{
    + if (req_op(rq) == REQ_OP_DISCARD)
    + return queue_max_discard_segments(rq->q);
    + return queue_max_segments(rq->q);
    +}
    +
    static inline int ll_new_hw_segment(struct request *req, struct bio *bio,
    unsigned int nr_phys_segs)
    {
    - if (req->nr_phys_segments + nr_phys_segs > queue_max_segments(req->q))
    + if (req->nr_phys_segments + nr_phys_segs > blk_rq_get_max_segments(req))
    goto no_merge;

    if (blk_integrity_merge_bio(req->q, req, bio) == false)
    @@ -640,7 +647,7 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
    return 0;

    total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;
    - if (total_phys_segments > queue_max_segments(q))
    + if (total_phys_segments > blk_rq_get_max_segments(req))
    return 0;

    if (blk_integrity_merge_rq(q, req, next) == false)
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-09-01 18:30    [W:4.030 / U:0.156 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site