Commit de5ffac4 authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

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: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 103351be
Loading
Loading
Loading
Loading
+6 −17
Original line number Diff line number Diff line
@@ -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 {