summaryrefslogtreecommitdiff
path: root/drivers/s390/block/dasd.c
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2024-02-28 16:37:41 +0300
committerJens Axboe <axboe@kernel.dk>2024-03-06 18:27:00 +0300
commit0127a47f58c6bb7b54386960ee66864b937269eb (patch)
tree4a6ea92c3bb2bb92e52e0dd067ae97f8893cc1db /drivers/s390/block/dasd.c
parent41463f2dfde2824a817789d635be8111cff463f5 (diff)
downloadlinux-0127a47f58c6bb7b54386960ee66864b937269eb.tar.xz
dasd: move queue setup to common code
Most of the code in setup_blk_queue is shared between all disciplines. Move it to common code and leave a method to query the maximum number of transferable blocks, and a flag to indicate discard support. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Stefan Haberland <sth@linux.ibm.com> Link: https://lore.kernel.org/r/20240228133742.806274-3-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/s390/block/dasd.c')
-rw-r--r--drivers/s390/block/dasd.c29
1 files changed, 27 insertions, 2 deletions
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c
index e754e4f81b2d..bdeab447adfc 100644
--- a/drivers/s390/block/dasd.c
+++ b/drivers/s390/block/dasd.c
@@ -308,6 +308,7 @@ static int dasd_state_basic_to_known(struct dasd_device *device)
static int dasd_state_basic_to_ready(struct dasd_device *device)
{
struct dasd_block *block = device->block;
+ struct request_queue *q;
int rc = 0;
/* make disk known with correct capacity */
@@ -327,8 +328,32 @@ static int dasd_state_basic_to_ready(struct dasd_device *device)
goto out;
}
- if (device->discipline->setup_blk_queue)
- device->discipline->setup_blk_queue(block);
+ q = block->gdp->queue;
+ blk_queue_flag_set(QUEUE_FLAG_NONROT, q);
+ q->limits.max_dev_sectors = device->discipline->max_sectors(block);
+ blk_queue_max_hw_sectors(q, q->limits.max_dev_sectors);
+ blk_queue_logical_block_size(q, block->bp_block);
+ blk_queue_max_segments(q, USHRT_MAX);
+
+ /* With page sized segments each segment can be translated into one idaw/tidaw */
+ blk_queue_max_segment_size(q, PAGE_SIZE);
+ blk_queue_segment_boundary(q, PAGE_SIZE - 1);
+ blk_queue_dma_alignment(q, PAGE_SIZE - 1);
+
+ if (device->discipline->has_discard) {
+ unsigned int max_bytes, max_discard_sectors;
+
+ q->limits.discard_granularity = block->bp_block;
+
+ /* Calculate max_discard_sectors and make it PAGE aligned */
+ max_bytes = USHRT_MAX * block->bp_block;
+ max_bytes = ALIGN_DOWN(max_bytes, PAGE_SIZE);
+ max_discard_sectors = max_bytes / block->bp_block;
+
+ blk_queue_max_discard_sectors(q, max_discard_sectors);
+ blk_queue_max_write_zeroes_sectors(q, max_discard_sectors);
+ }
+
set_capacity(block->gdp, block->blocks << block->s2b_shift);
device->state = DASD_STATE_READY;