lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 235/340] blk-settings: align max_sectors on "logical_block_size" boundary
    Date
    From: Mikulas Patocka <mpatocka@redhat.com>

    commit 97f433c3601a24d3513d06f575a389a2ca4e11e4 upstream.

    We get I/O errors when we run md-raid1 on the top of dm-integrity on the
    top of ramdisk.
    device-mapper: integrity: Bio not aligned on 8 sectors: 0xff00, 0xff
    device-mapper: integrity: Bio not aligned on 8 sectors: 0xff00, 0xff
    device-mapper: integrity: Bio not aligned on 8 sectors: 0xffff, 0x1
    device-mapper: integrity: Bio not aligned on 8 sectors: 0xffff, 0x1
    device-mapper: integrity: Bio not aligned on 8 sectors: 0x8048, 0xff
    device-mapper: integrity: Bio not aligned on 8 sectors: 0x8147, 0xff
    device-mapper: integrity: Bio not aligned on 8 sectors: 0x8246, 0xff
    device-mapper: integrity: Bio not aligned on 8 sectors: 0x8345, 0xbb

    The ramdisk device has logical_block_size 512 and max_sectors 255. The
    dm-integrity device uses logical_block_size 4096 and it doesn't affect the
    "max_sectors" value - thus, it inherits 255 from the ramdisk. So, we have
    a device with max_sectors not aligned on logical_block_size.

    The md-raid device sees that the underlying leg has max_sectors 255 and it
    will split the bios on 255-sector boundary, making the bios unaligned on
    logical_block_size.

    In order to fix the bug, we round down max_sectors to logical_block_size.

    Cc: stable@vger.kernel.org
    Reviewed-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    block/blk-settings.c | 12 ++++++++++++
    1 file changed, 12 insertions(+)

    --- a/block/blk-settings.c
    +++ b/block/blk-settings.c
    @@ -473,6 +473,14 @@ void blk_queue_stack_limits(struct reque
    }
    EXPORT_SYMBOL(blk_queue_stack_limits);

    +static unsigned int blk_round_down_sectors(unsigned int sectors, unsigned int lbs)
    +{
    + sectors = round_down(sectors, lbs >> SECTOR_SHIFT);
    + if (sectors < PAGE_SIZE >> SECTOR_SHIFT)
    + sectors = PAGE_SIZE >> SECTOR_SHIFT;
    + return sectors;
    +}
    +
    /**
    * blk_stack_limits - adjust queue_limits for stacked devices
    * @t: the stacking driver limits (top device)
    @@ -586,6 +594,10 @@ int blk_stack_limits(struct queue_limits
    ret = -1;
    }

    + t->max_sectors = blk_round_down_sectors(t->max_sectors, t->logical_block_size);
    + t->max_hw_sectors = blk_round_down_sectors(t->max_hw_sectors, t->logical_block_size);
    + t->max_dev_sectors = blk_round_down_sectors(t->max_dev_sectors, t->logical_block_size);
    +
    /* Discard alignment and granularity */
    if (b->discard_granularity) {
    alignment = queue_limit_discard_alignment(b, start);

    \
     
     \ /
      Last update: 2021-03-02 00:10    [W:4.101 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site