lkml.org 
[lkml]   [2020]   [Jul]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 01/10] block: introduce blk_is_valid_logical_block_size
    Date
    Kernel block layer has never supported logical block
    sizes less that SECTOR_SIZE nor larger that PAGE_SIZE.

    Some drivers have runtime configurable block size,
    so it makes sense to have common helper for that.

    Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com>
    ---
    block/blk-settings.c | 18 ++++++++++++++++++
    include/linux/blkdev.h | 1 +
    2 files changed, 19 insertions(+)

    diff --git a/block/blk-settings.c b/block/blk-settings.c
    index 9a2c23cd97007..3c4ef0d00c2bc 100644
    --- a/block/blk-settings.c
    +++ b/block/blk-settings.c
    @@ -311,6 +311,21 @@ void blk_queue_max_segment_size(struct request_queue *q, unsigned int max_size)
    }
    EXPORT_SYMBOL(blk_queue_max_segment_size);

    +
    +/**
    + * blk_check_logical_block_size - check if logical block size is supported
    + * by the kernel
    + * @size: the logical block size, in bytes
    + *
    + * Description:
    + * This function checks if the block layers supports given block size
    + **/
    +bool blk_is_valid_logical_block_size(unsigned int size)
    +{
    + return size >= SECTOR_SIZE && size <= PAGE_SIZE && !is_power_of_2(size);
    +}
    +EXPORT_SYMBOL(blk_is_valid_logical_block_size);
    +
    /**
    * blk_queue_logical_block_size - set logical block size for the queue
    * @q: the request queue for the device
    @@ -323,6 +338,8 @@ EXPORT_SYMBOL(blk_queue_max_segment_size);
    **/
    void blk_queue_logical_block_size(struct request_queue *q, unsigned int size)
    {
    + WARN_ON(!blk_is_valid_logical_block_size(size));
    +
    q->limits.logical_block_size = size;

    if (q->limits.physical_block_size < size)
    @@ -330,6 +347,7 @@ void blk_queue_logical_block_size(struct request_queue *q, unsigned int size)

    if (q->limits.io_min < q->limits.physical_block_size)
    q->limits.io_min = q->limits.physical_block_size;
    +
    }
    EXPORT_SYMBOL(blk_queue_logical_block_size);

    diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
    index 57241417ff2f8..2ed3151397e41 100644
    --- a/include/linux/blkdev.h
    +++ b/include/linux/blkdev.h
    @@ -1099,6 +1099,7 @@ extern void blk_queue_max_write_same_sectors(struct request_queue *q,
    unsigned int max_write_same_sectors);
    extern void blk_queue_max_write_zeroes_sectors(struct request_queue *q,
    unsigned int max_write_same_sectors);
    +extern bool blk_is_valid_logical_block_size(unsigned int size);
    extern void blk_queue_logical_block_size(struct request_queue *, unsigned int);
    extern void blk_queue_max_zone_append_sectors(struct request_queue *q,
    unsigned int max_zone_append_sectors);
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-07-21 12:54    [W:4.372 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site