From adc8da4aac6f6586171a6f4da28242d4aa6474b8 Mon Sep 17 00:00:00 2001 From: Shuhei Matsumoto Date: Fri, 1 Mar 2019 16:01:56 +0900 Subject: [PATCH] scsi: Use data block size not including metadata instead of block size SPDK iSCSI and SCSI target don't expose any metadata and DIF settings to the corresponding iSCSI and SCSI initiator. Even when SPDK iSCSI and SCSI target allocate any bdev formatted with DIF, SCSI commands sent from iSCSI and SCSI initiator don't have any metadata and DIF information. For that case, iSCSI target inserts and strips DIF on behalf of iSCSI and SCSI initiator. Hence SPDK SCSI target has to use data block size not including metadata to process SCSI commands correctly. This patch replaces spdk_bdev_get_block_size by spdk_bdev_get_data_block_size in necessary places. Change-Id: I264c8e532d1d1b016f6d8774c8ec03389528044f Signed-off-by: Shuhei Matsumoto Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/445083 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Ben Walker --- lib/scsi/scsi_bdev.c | 10 +++++----- test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index 2d3680385..b21fd4285 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -541,7 +541,7 @@ spdk_bdev_scsi_inquiry(struct spdk_bdev *bdev, struct spdk_scsi_task *task, } case SPDK_SPC_VPD_BLOCK_LIMITS: { - uint32_t block_size = spdk_bdev_get_block_size(bdev); + uint32_t block_size = spdk_bdev_get_data_block_size(bdev); /* PAGE LENGTH */ memset(&data[4], 0, 60); @@ -1103,7 +1103,7 @@ spdk_bdev_scsi_mode_sense(struct spdk_bdev *bdev, int md, int page, int subpage, uint8_t *data, struct spdk_scsi_task *task) { uint64_t num_blocks = spdk_bdev_get_num_blocks(bdev); - uint32_t block_size = spdk_bdev_get_block_size(bdev); + uint32_t block_size = spdk_bdev_get_data_block_size(bdev); uint8_t *hdr, *bdesc, *pages; int hlen; int blen; @@ -1417,7 +1417,7 @@ spdk_bdev_scsi_readwrite(struct spdk_scsi_task *task, return SPDK_SCSI_TASK_COMPLETE; } - block_size = spdk_bdev_get_block_size(bdev); + block_size = spdk_bdev_get_data_block_size(bdev); /* Transfer Length is limited to the Block Limits VPD page Maximum Transfer Length */ max_xfer_len = SPDK_WORK_BLOCK_SIZE / block_size; @@ -1708,7 +1708,7 @@ spdk_bdev_scsi_process_block(struct spdk_scsi_task *task) } else { to_be32(buffer, num_blocks - 1); } - to_be32(&buffer[4], spdk_bdev_get_block_size(bdev)); + to_be32(&buffer[4], spdk_bdev_get_data_block_size(bdev)); len = spdk_min(task->length, sizeof(buffer)); if (spdk_scsi_task_scatter_data(task, buffer, len) < 0) { @@ -1726,7 +1726,7 @@ spdk_bdev_scsi_process_block(struct spdk_scsi_task *task) uint8_t buffer[32] = {0}; to_be64(&buffer[0], spdk_bdev_get_num_blocks(bdev) - 1); - to_be32(&buffer[8], spdk_bdev_get_block_size(bdev)); + to_be32(&buffer[8], spdk_bdev_get_data_block_size(bdev)); /* * Set the TPE bit to 1 to indicate thin provisioning. * The position of TPE bit is the 7th bit in 14th byte diff --git a/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c b/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c index 36492763a..5d44910de 100644 --- a/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c +++ b/test/unit/lib/scsi/scsi_bdev.c/scsi_bdev_ut.c @@ -72,6 +72,9 @@ DEFINE_STUB(spdk_bdev_get_name, const char *, DEFINE_STUB(spdk_bdev_get_block_size, uint32_t, (const struct spdk_bdev *bdev), 512); +DEFINE_STUB(spdk_bdev_get_data_block_size, uint32_t, + (const struct spdk_bdev *bdev), 512); + uint64_t spdk_bdev_get_num_blocks(const struct spdk_bdev *bdev) {