Commit 44c70f82 authored by Changpeng Liu's avatar Changpeng Liu Committed by Jim Harris
Browse files

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: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/7379


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarKarol Latecki <karol.latecki@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent ba9853b9
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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));
+5 −0
Original line number Diff line number Diff line
@@ -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;