Commit 2c01ded3 authored by zhenwei pi's avatar zhenwei pi Committed by Tomasz Zawadzki
Browse files

scsi: Add SPDK_SCSI_TASK_FUNC_TARGET_RESET



SCSI/iSCSI triggers bdev_scsi_reset() in two reasons:
- mgmt command from initiator side
- target side cleanup

For example, once we hit the following logs:
nvme_ctrlr.c:1639:nvme_ctrlr_disconnect: *NOTICE*: [0000:b2:00.0] resetting controller
bdev_nvme.c:2027:_bdev_nvme_reset_ctrlr_complete: *NOTICE*: Resetting controller successful.

We need to know why the bdev/nvme resets, rather than a single
SPDK_SCSI_TASK_FUNC_LUN_RESET reason, separate it into two to
distinguish the root cause of the lower layer bdev reset.

Change-Id: I087add31c31e46780c6e7c60cc8af14290e84636
Signed-off-by: default avatarzhenwei pi <pizhenwei@bytedance.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20361


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent 8976b47d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ enum spdk_scsi_task_func {
	SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET,
	SPDK_SCSI_TASK_FUNC_CLEAR_TASK_SET,
	SPDK_SCSI_TASK_FUNC_LUN_RESET,
	SPDK_SCSI_TASK_FUNC_TARGET_RESET,
};

/*
+1 −1
Original line number Diff line number Diff line
@@ -1213,7 +1213,7 @@ iscsi_tgt_node_cleanup_luns(struct spdk_iscsi_conn *conn,
		task->scsi.initiator_port = conn->initiator_port;
		task->scsi.lun = lun;

		iscsi_op_abort_task_set(task, SPDK_SCSI_TASK_FUNC_LUN_RESET);
		iscsi_op_abort_task_set(task, SPDK_SCSI_TASK_FUNC_TARGET_RESET);
	}

	return 0;
+17 −13
Original line number Diff line number Diff line
@@ -118,6 +118,14 @@ static void
_scsi_lun_execute_mgmt_task(struct spdk_scsi_lun *lun)
{
	struct spdk_scsi_task *task;
	static const char *spdk_scsi_task_names[] = {
		"abort task",
		"abort task set",
		"clear task set",
		"lun reset",
		"target reset"
	};
	const char *scsi_tn = "unknown task";

	if (!TAILQ_EMPTY(&lun->mgmt_tasks)) {
		return;
@@ -139,33 +147,29 @@ _scsi_lun_execute_mgmt_task(struct spdk_scsi_lun *lun)
		return;
	}

	switch (task->function) {
	case SPDK_SCSI_TASK_FUNC_ABORT_TASK:
		task->response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
		SPDK_ERRLOG("ABORT_TASK failed\n");
		break;

	case SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET:
		task->response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
		SPDK_ERRLOG("ABORT_TASK_SET failed\n");
		break;
	if (task->function <= SPDK_COUNTOF(spdk_scsi_task_names)) {
		scsi_tn = spdk_scsi_task_names[task->function];
	}

	switch (task->function) {
	case SPDK_SCSI_TASK_FUNC_LUN_RESET:
	case SPDK_SCSI_TASK_FUNC_TARGET_RESET:
		bdev_scsi_reset(task);
		return;

	case SPDK_SCSI_TASK_FUNC_ABORT_TASK:
	case SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET:
	default:
		SPDK_ERRLOG("Unknown Task Management Function!\n");
		/*
		 * Task management functions other than those above should never
		 * reach this point having been filtered by the frontend. Reject
		 * the task as being unsupported.
		 */
		SPDK_ERRLOG("%s not supported\n", scsi_tn);
		task->response = SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED;
		scsi_lun_complete_mgmt_task(lun, task);
		break;
	}

	scsi_lun_complete_mgmt_task(lun, task);
}

void
+27 −1
Original line number Diff line number Diff line
@@ -241,6 +241,31 @@ lun_task_mgmt_execute_lun_reset(void)
	CU_ASSERT_EQUAL(g_task_count, 0);
}

static void
lun_task_mgmt_execute_target_reset(void)
{
	struct spdk_scsi_lun *lun;
	struct spdk_scsi_task mgmt_task = { 0 };
	struct spdk_scsi_dev dev = { 0 };

	lun = lun_construct();
	lun->dev = &dev;

	ut_init_task(&mgmt_task);
	mgmt_task.lun = lun;
	mgmt_task.function = SPDK_SCSI_TASK_FUNC_TARGET_RESET;

	scsi_lun_execute_mgmt_task(lun, &mgmt_task);

	/* Returns success */
	CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD);
	CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);

	lun_destruct(lun);

	CU_ASSERT_EQUAL(g_task_count, 0);
}

static void
lun_task_mgmt_execute_invalid_case(void)
{
@@ -252,7 +277,7 @@ lun_task_mgmt_execute_invalid_case(void)
	lun->dev = &dev;

	ut_init_task(&mgmt_task);
	mgmt_task.function = 5;
	mgmt_task.function = 6;

	/* Pass an invalid value to the switch statement */
	scsi_lun_execute_mgmt_task(lun, &mgmt_task);
@@ -731,6 +756,7 @@ main(int argc, char **argv)
	CU_ADD_TEST(suite, lun_task_mgmt_execute_abort_task_not_supported);
	CU_ADD_TEST(suite, lun_task_mgmt_execute_abort_task_all_not_supported);
	CU_ADD_TEST(suite, lun_task_mgmt_execute_lun_reset);
	CU_ADD_TEST(suite, lun_task_mgmt_execute_target_reset);
	CU_ADD_TEST(suite, lun_task_mgmt_execute_invalid_case);
	CU_ADD_TEST(suite, lun_append_task_null_lun_task_cdb_spc_inquiry);
	CU_ADD_TEST(suite, lun_append_task_null_lun_alloc_len_lt_4096);