scsi: return scsi error status for invalid SCSI CDB

We can return error status when processing RELEASE2 without
a reservation, also add a UT to cover this case.

Fix issue #1898.

Change-Id: I56ffa8eabfc0409307500f8740cb627aab9d2f0b
Signed-off-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7379
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Karol Latecki <karol.latecki@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
This commit is contained in:
Changpeng Liu 2021-04-15 17:13:13 +08:00 committed by Jim Harris
parent ba9853b9ba
commit 44c70f8215
2 changed files with 12 additions and 1 deletions

View File

@ -1027,7 +1027,13 @@ scsi2_release(struct spdk_scsi_task *task)
return ret;
}
assert(lun->reservation.flags & SCSI_SPC2_RESERVE);
if (!(lun->reservation.flags & SCSI_SPC2_RESERVE)) {
spdk_scsi_task_set_status(task, SPDK_SCSI_STATUS_CHECK_CONDITION,
SPDK_SCSI_SENSE_ILLEGAL_REQUEST,
SPDK_SCSI_ASC_INVALID_FIELD_IN_CDB,
SPDK_SCSI_ASCQ_CAUSE_NOT_REPORTABLE);
return -EINVAL;
}
memset(&lun->reservation, 0, sizeof(struct spdk_scsi_pr_reservation));
memset(&lun->scsi2_holder, 0, sizeof(struct spdk_scsi_pr_registrant));

View File

@ -245,6 +245,11 @@ test_reservation_reserve(void)
task.target_port = &g_t_port_0;
ut_init_reservation_test();
/* Test Case: call Release without a reservation */
rc = scsi2_release(&task);
CU_ASSERT(rc == -EINVAL);
CU_ASSERT(task.status == SPDK_SCSI_STATUS_CHECK_CONDITION);
test_build_registrants();
gen = g_lun.pr_generation;