Commit a06daa1b authored by Daniel Verkamp's avatar Daniel Verkamp Committed by Jim Harris
Browse files

scsi: inline LBA check into readwrite function



spdk_bdev_scsi_read_write_lba_check() was only called from one spot, and
moving its code directly into the caller makes the code simpler to read
and more consistent, since now all of the sense code setup is directly
in spdk_bdev_scsi_readwrite() rather than being split across two
functions.

No functional change.

Change-Id: Ic6ee21b06c721a949579817f0339a4b047ffb2cc
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/393699


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatar <shuhei.matsumoto.xt@hitachi.com>
parent 9c47ef85
Loading
Loading
Loading
Loading
+8 −20
Original line number Diff line number Diff line
@@ -1293,23 +1293,6 @@ spdk_bdev_scsi_task_complete_mgmt(struct spdk_bdev_io *bdev_io, bool success,
	spdk_scsi_lun_complete_mgmt_task(task->lun, task);
}

static int
spdk_bdev_scsi_read_write_lba_check(struct spdk_scsi_task *task,
				    uint64_t lba, uint64_t cmd_num_blocks,
				    uint64_t bdev_num_blocks)
{
	if (bdev_num_blocks <= lba || bdev_num_blocks - lba < cmd_num_blocks) {
		SPDK_DEBUGLOG(SPDK_LOG_SCSI, "end of media\n");
		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
					  SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE,
					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
		return -1;
	}

	return 0;
}

static int
spdk_bdev_scsi_read(struct spdk_bdev *bdev,
		    struct spdk_scsi_task *task, uint64_t lba,
@@ -1442,6 +1425,7 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev,
			 struct spdk_scsi_task *task,
			 uint64_t lba, uint32_t xfer_len, bool is_read)
{
	uint64_t bdev_num_blocks;
	uint32_t max_xfer_len;

	task->data_transferred = 0;
@@ -1456,9 +1440,13 @@ spdk_bdev_scsi_readwrite(struct spdk_bdev *bdev,
		return SPDK_SCSI_TASK_COMPLETE;
	}

	if (spdk_bdev_scsi_read_write_lba_check(task, lba,
						xfer_len, spdk_bdev_get_num_blocks(bdev)) < 0) {
		/* spdk_bdev_scsi_read_write_lba_check() already set the correct sense code */
	bdev_num_blocks = spdk_bdev_get_num_blocks(bdev);
	if (bdev_num_blocks <= lba || bdev_num_blocks - lba < xfer_len) {
		SPDK_DEBUGLOG(SPDK_LOG_SCSI, "end of media\n");
		spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
					  SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
					  SPDK_SCSI_ASC_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE,
					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
		return SPDK_SCSI_TASK_COMPLETE;
	}