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

scsi: check read/write LBA even for subtasks



Simplify the logic in spdk_bdev_scsi_read_write_lba_check() to do the
LBA bounds check for both parent tasks and subtasks.

This will allow the parent/subtask relationship to be fully moved to
iSCSI in a follow-up patch.

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


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 60f1d526
Loading
Loading
Loading
Loading
+10 −29
Original line number Diff line number Diff line
@@ -1294,16 +1294,10 @@ spdk_bdev_scsi_task_complete_mgmt(struct spdk_bdev_io *bdev_io, bool success,
}

static int
spdk_bdev_scsi_read_write_lba_check(struct spdk_scsi_task *primary,
				    struct spdk_scsi_task *task,
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 (!primary) {
		/*
		 * Indicates this task is a primary task, we check whether the LBA and
		 * range is valid. If such info of primary is valid, all subtasks' are valid.
		 */
	if (lba >= bdev_num_blocks || cmd_num_blocks > bdev_num_blocks ||
	    lba > (bdev_num_blocks - cmd_num_blocks)) {
		SPDK_DEBUGLOG(SPDK_LOG_SCSI, "end of media\n");
@@ -1313,19 +1307,6 @@ spdk_bdev_scsi_read_write_lba_check(struct spdk_scsi_task *primary,
					  SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
		return -1;
	}
	} else {
		/*
		 * Indicates this task is a subtask, we do not need to check the LBA range.
		 * Need to check condition of primary task.
		 */
		if (primary->status == SPDK_SCSI_STATUS_CHECK_CONDITION) {
			memcpy(task->sense_data, primary->sense_data,
			       primary->sense_data_len);
			task->status = SPDK_SCSI_STATUS_CHECK_CONDITION;
			task->sense_data_len = primary->sense_data_len;
			return -1;
		}
	}

	return 0;
}
@@ -1476,7 +1457,7 @@ 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,
	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 */
		return SPDK_SCSI_TASK_COMPLETE;