From de5ffac4ecfe6c7125e35a50d79b85342a40a3c5 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Mon, 15 May 2017 11:18:33 -0700 Subject: [PATCH] scsi: factor out read/write LBA range check The SCSI read and write functions use the same LBA range check, so move it up to spdk_bdev_scsi_readwrite(). spdk_bdev_scsi_read() previously passed task->transfer_len / blen rather than xfer_len to the LBA range checking function, but this should actually be using the transfer length field from the CDB (which is the xfer_len parameter). Change-Id: I8285abf936a18a0baf7cc25709945637e4e6b87d Signed-off-by: Daniel Verkamp --- lib/scsi/scsi_bdev.c | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/lib/scsi/scsi_bdev.c b/lib/scsi/scsi_bdev.c index b33ff55f5..6ea453ee7 100644 --- a/lib/scsi/scsi_bdev.c +++ b/lib/scsi/scsi_bdev.c @@ -1295,21 +1295,12 @@ spdk_bdev_scsi_read(struct spdk_bdev *bdev, struct spdk_scsi_task *task, uint64_t lba, uint32_t len) { - uint64_t bdev_num_blocks; uint64_t blen; uint64_t offset; uint64_t nbytes; - int rc; - bdev_num_blocks = spdk_bdev_get_num_blocks(bdev); blen = spdk_bdev_get_block_size(bdev); - rc = spdk_bdev_scsi_read_write_lba_check(task->parent, task, lba, - task->transfer_len / blen, bdev_num_blocks); - if (rc < 0) { - return SPDK_SCSI_TASK_COMPLETE; - } - lba += (task->offset / blen); offset = lba * blen; nbytes = task->length; @@ -1340,11 +1331,9 @@ static int spdk_bdev_scsi_write(struct spdk_bdev *bdev, struct spdk_scsi_task *task, uint64_t lba, uint32_t len) { - uint64_t bdev_num_blocks; uint64_t blen; uint64_t offset; uint64_t nbytes; - int rc; struct spdk_scsi_task *primary = task->parent; if (len == 0) { @@ -1356,12 +1345,6 @@ spdk_bdev_scsi_write(struct spdk_bdev *bdev, return SPDK_SCSI_TASK_COMPLETE; } - bdev_num_blocks = spdk_bdev_get_num_blocks(bdev); - rc = spdk_bdev_scsi_read_write_lba_check(primary, task, lba, len, bdev_num_blocks); - if (rc < 0) { - return SPDK_SCSI_TASK_COMPLETE; - } - blen = spdk_bdev_get_block_size(bdev); offset = lba * blen; nbytes = ((uint64_t)len) * blen; @@ -1467,6 +1450,12 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev, return SPDK_SCSI_TASK_COMPLETE; } + if (spdk_bdev_scsi_read_write_lba_check(task->parent, task, lba, + xfer_len, spdk_bdev_get_num_blocks(bdev)) < 0) { + /* spdk_bdev_scsi_read_write_lba_check() already set the correct sense code */ + return SPDK_SCSI_TASK_COMPLETE; + } + if (is_read) { return spdk_bdev_scsi_read(bdev, task, lba, xfer_len); } else {