From 44c70f8215cc87fa55a949df2e771ff2cb2da1ed Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Thu, 15 Apr 2021 17:13:13 +0800 Subject: [PATCH] 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 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7379 Reviewed-by: Jim Harris Reviewed-by: Karol Latecki Reviewed-by: Tomasz Zawadzki Tested-by: SPDK CI Jenkins --- lib/scsi/scsi_pr.c | 8 +++++++- test/unit/lib/scsi/scsi_pr.c/scsi_pr_ut.c | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/scsi/scsi_pr.c b/lib/scsi/scsi_pr.c index ac752648f..0c009d18d 100644 --- a/lib/scsi/scsi_pr.c +++ b/lib/scsi/scsi_pr.c @@ -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)); diff --git a/test/unit/lib/scsi/scsi_pr.c/scsi_pr_ut.c b/test/unit/lib/scsi/scsi_pr.c/scsi_pr_ut.c index f8fdf6590..41d84684d 100644 --- a/test/unit/lib/scsi/scsi_pr.c/scsi_pr_ut.c +++ b/test/unit/lib/scsi/scsi_pr.c/scsi_pr_ut.c @@ -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;