Add a module option 'rd_logical_blksize' to allow the user to change the logical sector size of the RAM disks. Signed-off-by: Hannes Reinecke <hare@xxxxxxx> --- drivers/block/brd.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/block/brd.c b/drivers/block/brd.c index 0c5f3dbbb77c..e2e364255902 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -45,6 +45,8 @@ struct brd_device { u64 brd_nr_folios; unsigned int brd_sector_shift; unsigned int brd_sector_size; + unsigned int brd_logical_sector_shift; + unsigned int brd_logical_sector_size; }; #define BRD_SECTOR_SHIFT(b) ((b)->brd_sector_shift - SECTOR_SHIFT) @@ -242,8 +244,8 @@ static void brd_submit_bio(struct bio *bio) int err; /* Don't support un-aligned buffer */ - WARN_ON_ONCE((iter.offset & (SECTOR_SIZE - 1)) || - (len & (SECTOR_SIZE - 1))); + WARN_ON_ONCE((iter.offset & (brd->brd_logical_sector_size - 1)) || + (len & (brd->brd_logical_sector_size - 1))); err = brd_do_folio(brd, iter.folio, len, iter.offset, bio->bi_opf, sector); @@ -285,6 +287,10 @@ static unsigned int rd_blksize = PAGE_SIZE; module_param(rd_blksize, uint, 0444); MODULE_PARM_DESC(rd_blksize, "Blocksize of each RAM disk in bytes."); +static unsigned int rd_logical_blksize = SECTOR_SIZE; +module_param(rd_logical_blksize, uint, 0444); +MODULE_PARM_DESC(rd_logical_blksize, "Logical blocksize of each RAM disk in bytes."); + MODULE_LICENSE("GPL"); MODULE_ALIAS_BLOCKDEV_MAJOR(RAMDISK_MAJOR); MODULE_ALIAS("rd"); @@ -342,6 +348,21 @@ static int brd_alloc(int i) brd->brd_sector_shift = ilog2(rd_blksize); brd->brd_sector_size = rd_blksize; + if (!is_power_of_2(rd_logical_blksize)) { + pr_err("rd_logical_blksize %d is not supported\n", + rd_logical_blksize); + err = -EINVAL; + goto out_free_dev; + } + if (rd_logical_blksize > rd_blksize) { + pr_err("rd_logical_blksize %d larger than rd_blksize %d\n", + rd_logical_blksize, rd_blksize); + err = -EINVAL; + goto out_free_dev; + } + brd->brd_logical_sector_shift = ilog2(rd_logical_blksize); + brd->brd_logical_sector_size = rd_logical_blksize; + xa_init(&brd->brd_folios); snprintf(buf, DISK_NAME_LEN, "ram%d", i); @@ -362,6 +383,7 @@ static int brd_alloc(int i) set_capacity(disk, rd_size * 2); blk_queue_physical_block_size(disk->queue, rd_blksize); + blk_queue_logical_block_size(disk->queue, rd_logical_blksize); blk_queue_max_hw_sectors(disk->queue, rd_max_sectors); /* Tell the block layer that this is not a rotational device */ -- 2.35.3