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: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-on: https://review.gerrithub.io/393696 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com> Reviewed-by: <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
60f1d52605
commit
5e0ac51043
@ -1294,37 +1294,18 @@ 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");
|
||||
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;
|
||||
}
|
||||
} 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;
|
||||
}
|
||||
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");
|
||||
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;
|
||||
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user