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:
parent
ba9853b9ba
commit
44c70f8215
@ -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));
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user