lkml.org 
[lkml]   [2018]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 015/350] block: make sure discard bio is aligned with logical block size
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ming Lei <ming.lei@redhat.com>

    commit 1adfc5e4136f5967d591c399aff95b3b035f16b7 upstream.

    Obviously the created discard bio has to be aligned with logical block size.

    This patch introduces the helper of bio_allowed_max_sectors() for
    this purpose.

    Cc: stable@vger.kernel.org
    Cc: Mike Snitzer <snitzer@redhat.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Xiao Ni <xni@redhat.com>
    Cc: Mariusz Dabrowski <mariusz.dabrowski@intel.com>
    Fixes: 744889b7cbb56a6 ("block: don't deal with discard limit in blkdev_issue_discard()")
    Fixes: a22c4d7e34402cc ("block: re-add discard_granularity and alignment checks")
    Reported-by: Rui Salvaterra <rsalvaterra@gmail.com>
    Tested-by: Rui Salvaterra <rsalvaterra@gmail.com>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    block/blk-lib.c | 3 +--
    block/blk-merge.c | 3 ++-
    block/blk.h | 10 ++++++++++
    3 files changed, 13 insertions(+), 3 deletions(-)

    --- a/block/blk-lib.c
    +++ b/block/blk-lib.c
    @@ -58,8 +58,7 @@ int __blkdev_issue_discard(struct block_

    if (!req_sects)
    goto fail;
    - if (req_sects > UINT_MAX >> 9)
    - req_sects = UINT_MAX >> 9;
    + req_sects = min(req_sects, bio_allowed_max_sectors(q));

    end_sect = sector + req_sects;

    --- a/block/blk-merge.c
    +++ b/block/blk-merge.c
    @@ -27,7 +27,8 @@ static struct bio *blk_bio_discard_split
    /* Zero-sector (unknown) and one-sector granularities are the same. */
    granularity = max(q->limits.discard_granularity >> 9, 1U);

    - max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9);
    + max_discard_sectors = min(q->limits.max_discard_sectors,
    + bio_allowed_max_sectors(q));
    max_discard_sectors -= max_discard_sectors % granularity;

    if (unlikely(!max_discard_sectors)) {
    --- a/block/blk.h
    +++ b/block/blk.h
    @@ -327,6 +327,16 @@ static inline unsigned long blk_rq_deadl
    }

    /*
    + * The max size one bio can handle is UINT_MAX becasue bvec_iter.bi_size
    + * is defined as 'unsigned int', meantime it has to aligned to with logical
    + * block size which is the minimum accepted unit by hardware.
    + */
    +static inline unsigned int bio_allowed_max_sectors(struct request_queue *q)
    +{
    + return round_down(UINT_MAX, queue_logical_block_size(q)) >> 9;
    +}
    +
    +/*
    * Internal io_context interface
    */
    void get_io_context(struct io_context *ioc);

    \
     
     \ /
      Last update: 2018-11-12 00:42    [W:4.162 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site