1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2016 Intel Corporation.
38b0f2ad4SDaniel Verkamp * All rights reserved.
48b0f2ad4SDaniel Verkamp */
58b0f2ad4SDaniel Verkamp
68b0f2ad4SDaniel Verkamp #include "spdk/stdinc.h"
78b0f2ad4SDaniel Verkamp
8ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
98b0f2ad4SDaniel Verkamp
10d998c1adSJim Harris #include "scsi/task.c"
11d998c1adSJim Harris #include "scsi/lun.c"
128b0f2ad4SDaniel Verkamp
13d3828a23SDaniel Verkamp #include "spdk_internal/mock.h"
147d468452SJim Harris /* These unit tests aren't multithreads, but we need to allocate threads since
157d468452SJim Harris * the lun.c code will register pollers.
167d468452SJim Harris */
177d468452SJim Harris #include "common/lib/ut_multithread.c"
18d3828a23SDaniel Verkamp
198b0f2ad4SDaniel Verkamp /* Unit test bdev mockup */
208b0f2ad4SDaniel Verkamp struct spdk_bdev {
218b0f2ad4SDaniel Verkamp int x;
228b0f2ad4SDaniel Verkamp };
238b0f2ad4SDaniel Verkamp
242172c432STomasz Zawadzki SPDK_LOG_REGISTER_COMPONENT(scsi)
258b0f2ad4SDaniel Verkamp
268b0f2ad4SDaniel Verkamp static bool g_lun_execute_fail = false;
278b0f2ad4SDaniel Verkamp static int g_lun_execute_status = SPDK_SCSI_TASK_PENDING;
288b0f2ad4SDaniel Verkamp static uint32_t g_task_count = 0;
298b0f2ad4SDaniel Verkamp
30f4b81843SNick Connolly DEFINE_STUB(bdev_scsi_get_dif_ctx, bool,
31f4b81843SNick Connolly (struct spdk_bdev *bdev, struct spdk_scsi_task *task,
32f4b81843SNick Connolly struct spdk_dif_ctx *dif_ctx), false);
33f4b81843SNick Connolly
348b0f2ad4SDaniel Verkamp static void
spdk_lun_ut_cpl_task(struct spdk_scsi_task * task)3541852055SBen Walker spdk_lun_ut_cpl_task(struct spdk_scsi_task *task)
3641852055SBen Walker {
37f9958316SDaniel Verkamp SPDK_CU_ASSERT_FATAL(g_task_count > 0);
38f9958316SDaniel Verkamp g_task_count--;
3941852055SBen Walker }
4041852055SBen Walker
4141852055SBen Walker static void
spdk_lun_ut_free_task(struct spdk_scsi_task * task)428b0f2ad4SDaniel Verkamp spdk_lun_ut_free_task(struct spdk_scsi_task *task)
438b0f2ad4SDaniel Verkamp {
448b0f2ad4SDaniel Verkamp }
458b0f2ad4SDaniel Verkamp
46f9958316SDaniel Verkamp static void
ut_init_task(struct spdk_scsi_task * task)47f9958316SDaniel Verkamp ut_init_task(struct spdk_scsi_task *task)
488b0f2ad4SDaniel Verkamp {
49f9958316SDaniel Verkamp memset(task, 0, sizeof(*task));
5041852055SBen Walker spdk_scsi_task_construct(task, spdk_lun_ut_cpl_task,
51e45437abSDaniel Verkamp spdk_lun_ut_free_task);
528b0f2ad4SDaniel Verkamp g_task_count++;
538b0f2ad4SDaniel Verkamp }
548b0f2ad4SDaniel Verkamp
55ddc63f07SJim Harris void
spdk_bdev_free_io(struct spdk_bdev_io * bdev_io)568b0f2ad4SDaniel Verkamp spdk_bdev_free_io(struct spdk_bdev_io *bdev_io)
578b0f2ad4SDaniel Verkamp {
588b0f2ad4SDaniel Verkamp CU_ASSERT(0);
598b0f2ad4SDaniel Verkamp }
608b0f2ad4SDaniel Verkamp
615029fe14SLi Feng DEFINE_STUB(spdk_bdev_open_ext, int,
625029fe14SLi Feng (const char *bdev_name, bool write, spdk_bdev_event_cb_t event_cb,
635029fe14SLi Feng void *event_ctx, struct spdk_bdev_desc **desc),
645029fe14SLi Feng 0);
655029fe14SLi Feng
66760c8defSShuhei Matsumoto DEFINE_STUB_V(spdk_bdev_close, (struct spdk_bdev_desc *desc));
678b0f2ad4SDaniel Verkamp
68760c8defSShuhei Matsumoto DEFINE_STUB(spdk_bdev_get_name, const char *,
69760c8defSShuhei Matsumoto (const struct spdk_bdev *bdev), "test");
708b0f2ad4SDaniel Verkamp
71ab808d2bSShuhei Matsumoto DEFINE_STUB(spdk_bdev_desc_get_bdev, struct spdk_bdev *,
72ab808d2bSShuhei Matsumoto (struct spdk_bdev_desc *bdev_desc), NULL);
73ab808d2bSShuhei Matsumoto
74760c8defSShuhei Matsumoto DEFINE_STUB_V(spdk_scsi_dev_queue_mgmt_task,
75760c8defSShuhei Matsumoto (struct spdk_scsi_dev *dev, struct spdk_scsi_task *task));
768b0f2ad4SDaniel Verkamp
77760c8defSShuhei Matsumoto DEFINE_STUB_V(spdk_scsi_dev_delete_lun,
78760c8defSShuhei Matsumoto (struct spdk_scsi_dev *dev, struct spdk_scsi_lun *lun));
798b0f2ad4SDaniel Verkamp
8018dec401SShuhei Matsumoto DEFINE_STUB(scsi_pr_check, int, (struct spdk_scsi_task *task), 0);
816b6a3ff9SChangpeng Liu DEFINE_STUB(scsi2_reserve_check, int, (struct spdk_scsi_task *task), 0);
828c0c8e53SChangpeng Liu
83d7a7ef61STomasz Zawadzki void
bdev_scsi_reset(struct spdk_scsi_task * task)8418dec401SShuhei Matsumoto bdev_scsi_reset(struct spdk_scsi_task *task)
858b0f2ad4SDaniel Verkamp {
866dd09113SShuhei Matsumoto task->status = SPDK_SCSI_STATUS_GOOD;
876dd09113SShuhei Matsumoto task->response = SPDK_SCSI_TASK_MGMT_RESP_SUCCESS;
886dd09113SShuhei Matsumoto
8918dec401SShuhei Matsumoto scsi_lun_complete_reset_task(task->lun, task);
908b0f2ad4SDaniel Verkamp }
918b0f2ad4SDaniel Verkamp
928b0f2ad4SDaniel Verkamp int
bdev_scsi_execute(struct spdk_scsi_task * task)9318dec401SShuhei Matsumoto bdev_scsi_execute(struct spdk_scsi_task *task)
948b0f2ad4SDaniel Verkamp {
9559970a89SDaniel Verkamp if (g_lun_execute_fail) {
968b0f2ad4SDaniel Verkamp return -EINVAL;
9759970a89SDaniel Verkamp } else {
988b0f2ad4SDaniel Verkamp task->status = SPDK_SCSI_STATUS_GOOD;
998b0f2ad4SDaniel Verkamp
10059970a89SDaniel Verkamp if (g_lun_execute_status == SPDK_SCSI_TASK_PENDING) {
1018b0f2ad4SDaniel Verkamp return g_lun_execute_status;
10259970a89SDaniel Verkamp } else if (g_lun_execute_status == SPDK_SCSI_TASK_COMPLETE) {
1038b0f2ad4SDaniel Verkamp return g_lun_execute_status;
10459970a89SDaniel Verkamp } else {
1058b0f2ad4SDaniel Verkamp return 0;
1068b0f2ad4SDaniel Verkamp }
1078b0f2ad4SDaniel Verkamp }
10859970a89SDaniel Verkamp }
1098b0f2ad4SDaniel Verkamp
110760c8defSShuhei Matsumoto DEFINE_STUB(spdk_bdev_get_io_channel, struct spdk_io_channel *,
111760c8defSShuhei Matsumoto (struct spdk_bdev_desc *desc), NULL);
1128b0f2ad4SDaniel Verkamp
1138dd1cd21SBen Walker static struct spdk_scsi_lun *
lun_construct(void)1148dd1cd21SBen Walker lun_construct(void)
1158b0f2ad4SDaniel Verkamp {
1168b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
1178b0f2ad4SDaniel Verkamp
118ab808d2bSShuhei Matsumoto lun = scsi_lun_construct("ut_bdev", NULL, NULL, NULL, NULL);
1198b0f2ad4SDaniel Verkamp
1208b0f2ad4SDaniel Verkamp SPDK_CU_ASSERT_FATAL(lun != NULL);
1218b0f2ad4SDaniel Verkamp return lun;
1228b0f2ad4SDaniel Verkamp }
1238b0f2ad4SDaniel Verkamp
1248b0f2ad4SDaniel Verkamp static void
lun_destruct(struct spdk_scsi_lun * lun)1258b0f2ad4SDaniel Verkamp lun_destruct(struct spdk_scsi_lun *lun)
1268b0f2ad4SDaniel Verkamp {
12785a61ea6SPawel Wodkowski /* LUN will defer its removal if there are any unfinished tasks */
12885a61ea6SPawel Wodkowski SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&lun->tasks));
12985a61ea6SPawel Wodkowski
13018dec401SShuhei Matsumoto scsi_lun_destruct(lun);
1318b0f2ad4SDaniel Verkamp }
1328b0f2ad4SDaniel Verkamp
1338b0f2ad4SDaniel Verkamp static void
lun_task_mgmt_execute_abort_task_not_supported(void)1348b0f2ad4SDaniel Verkamp lun_task_mgmt_execute_abort_task_not_supported(void)
1358b0f2ad4SDaniel Verkamp {
1368b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
137f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
138f9958316SDaniel Verkamp struct spdk_scsi_task mgmt_task = { 0 };
1398b0f2ad4SDaniel Verkamp struct spdk_scsi_port initiator_port = { 0 };
1408b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
1418b0f2ad4SDaniel Verkamp uint8_t cdb[6] = { 0 };
1428b0f2ad4SDaniel Verkamp
1438b0f2ad4SDaniel Verkamp lun = lun_construct();
1448b0f2ad4SDaniel Verkamp lun->dev = &dev;
1458b0f2ad4SDaniel Verkamp
146f9958316SDaniel Verkamp ut_init_task(&mgmt_task);
147f9958316SDaniel Verkamp mgmt_task.lun = lun;
148f9958316SDaniel Verkamp mgmt_task.initiator_port = &initiator_port;
149b6092319SShuhei Matsumoto mgmt_task.function = SPDK_SCSI_TASK_FUNC_ABORT_TASK;
1508b0f2ad4SDaniel Verkamp
1518b0f2ad4SDaniel Verkamp /* Params to add regular task to the lun->tasks */
152f9958316SDaniel Verkamp ut_init_task(&task);
153f9958316SDaniel Verkamp task.lun = lun;
154f9958316SDaniel Verkamp task.cdb = cdb;
1558b0f2ad4SDaniel Verkamp
15618dec401SShuhei Matsumoto scsi_lun_execute_task(lun, &task);
1578b0f2ad4SDaniel Verkamp
1588b0f2ad4SDaniel Verkamp /* task should now be on the tasks list */
1598b0f2ad4SDaniel Verkamp CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
1608b0f2ad4SDaniel Verkamp
16118dec401SShuhei Matsumoto scsi_lun_execute_mgmt_task(lun, &mgmt_task);
1628b0f2ad4SDaniel Verkamp
1636dd09113SShuhei Matsumoto /* task abort is not supported */
164f9958316SDaniel Verkamp CU_ASSERT(mgmt_task.response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
1658b0f2ad4SDaniel Verkamp
166f9958316SDaniel Verkamp /* task is still on the tasks list */
167f9958316SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 1);
16885a61ea6SPawel Wodkowski
16918dec401SShuhei Matsumoto scsi_lun_complete_task(lun, &task);
17085a61ea6SPawel Wodkowski CU_ASSERT_EQUAL(g_task_count, 0);
17185a61ea6SPawel Wodkowski
17285a61ea6SPawel Wodkowski lun_destruct(lun);
1738b0f2ad4SDaniel Verkamp }
1748b0f2ad4SDaniel Verkamp
1758b0f2ad4SDaniel Verkamp static void
lun_task_mgmt_execute_abort_task_all_not_supported(void)1768b0f2ad4SDaniel Verkamp lun_task_mgmt_execute_abort_task_all_not_supported(void)
1778b0f2ad4SDaniel Verkamp {
1788b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
179f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
180f9958316SDaniel Verkamp struct spdk_scsi_task mgmt_task = { 0 };
1818b0f2ad4SDaniel Verkamp struct spdk_scsi_port initiator_port = { 0 };
1828b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
1838b0f2ad4SDaniel Verkamp uint8_t cdb[6] = { 0 };
1848b0f2ad4SDaniel Verkamp
1858b0f2ad4SDaniel Verkamp lun = lun_construct();
1868b0f2ad4SDaniel Verkamp lun->dev = &dev;
1878b0f2ad4SDaniel Verkamp
188f9958316SDaniel Verkamp ut_init_task(&mgmt_task);
189f9958316SDaniel Verkamp mgmt_task.lun = lun;
190f9958316SDaniel Verkamp mgmt_task.initiator_port = &initiator_port;
191b6092319SShuhei Matsumoto mgmt_task.function = SPDK_SCSI_TASK_FUNC_ABORT_TASK_SET;
1928b0f2ad4SDaniel Verkamp
1938b0f2ad4SDaniel Verkamp /* Params to add regular task to the lun->tasks */
194f9958316SDaniel Verkamp ut_init_task(&task);
195f9958316SDaniel Verkamp task.initiator_port = &initiator_port;
196f9958316SDaniel Verkamp task.lun = lun;
197f9958316SDaniel Verkamp task.cdb = cdb;
1988b0f2ad4SDaniel Verkamp
19918dec401SShuhei Matsumoto scsi_lun_execute_task(lun, &task);
2008b0f2ad4SDaniel Verkamp
2018b0f2ad4SDaniel Verkamp /* task should now be on the tasks list */
2028b0f2ad4SDaniel Verkamp CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
2038b0f2ad4SDaniel Verkamp
20418dec401SShuhei Matsumoto scsi_lun_execute_mgmt_task(lun, &mgmt_task);
2058b0f2ad4SDaniel Verkamp
2066dd09113SShuhei Matsumoto /* task abort is not supported */
207f9958316SDaniel Verkamp CU_ASSERT(mgmt_task.response == SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
2088b0f2ad4SDaniel Verkamp
209f9958316SDaniel Verkamp /* task is still on the tasks list */
210f9958316SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 1);
21185a61ea6SPawel Wodkowski
21218dec401SShuhei Matsumoto scsi_lun_complete_task(lun, &task);
21385a61ea6SPawel Wodkowski
21485a61ea6SPawel Wodkowski CU_ASSERT_EQUAL(g_task_count, 0);
21585a61ea6SPawel Wodkowski
21685a61ea6SPawel Wodkowski lun_destruct(lun);
2178b0f2ad4SDaniel Verkamp }
2188b0f2ad4SDaniel Verkamp
2198b0f2ad4SDaniel Verkamp static void
lun_task_mgmt_execute_lun_reset(void)2208b0f2ad4SDaniel Verkamp lun_task_mgmt_execute_lun_reset(void)
2218b0f2ad4SDaniel Verkamp {
2228b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
223f9958316SDaniel Verkamp struct spdk_scsi_task mgmt_task = { 0 };
2248b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
2258b0f2ad4SDaniel Verkamp
2268b0f2ad4SDaniel Verkamp lun = lun_construct();
2278b0f2ad4SDaniel Verkamp lun->dev = &dev;
2288b0f2ad4SDaniel Verkamp
229f9958316SDaniel Verkamp ut_init_task(&mgmt_task);
230f9958316SDaniel Verkamp mgmt_task.lun = lun;
231b6092319SShuhei Matsumoto mgmt_task.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
2328b0f2ad4SDaniel Verkamp
23318dec401SShuhei Matsumoto scsi_lun_execute_mgmt_task(lun, &mgmt_task);
2348b0f2ad4SDaniel Verkamp
2358b0f2ad4SDaniel Verkamp /* Returns success */
2366dd09113SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD);
2376dd09113SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
2388b0f2ad4SDaniel Verkamp
2398b0f2ad4SDaniel Verkamp lun_destruct(lun);
2408b0f2ad4SDaniel Verkamp
2416dd09113SShuhei Matsumoto CU_ASSERT_EQUAL(g_task_count, 0);
2428b0f2ad4SDaniel Verkamp }
2438b0f2ad4SDaniel Verkamp
2448b0f2ad4SDaniel Verkamp static void
lun_task_mgmt_execute_target_reset(void)245*2c01ded3Szhenwei pi lun_task_mgmt_execute_target_reset(void)
246*2c01ded3Szhenwei pi {
247*2c01ded3Szhenwei pi struct spdk_scsi_lun *lun;
248*2c01ded3Szhenwei pi struct spdk_scsi_task mgmt_task = { 0 };
249*2c01ded3Szhenwei pi struct spdk_scsi_dev dev = { 0 };
250*2c01ded3Szhenwei pi
251*2c01ded3Szhenwei pi lun = lun_construct();
252*2c01ded3Szhenwei pi lun->dev = &dev;
253*2c01ded3Szhenwei pi
254*2c01ded3Szhenwei pi ut_init_task(&mgmt_task);
255*2c01ded3Szhenwei pi mgmt_task.lun = lun;
256*2c01ded3Szhenwei pi mgmt_task.function = SPDK_SCSI_TASK_FUNC_TARGET_RESET;
257*2c01ded3Szhenwei pi
258*2c01ded3Szhenwei pi scsi_lun_execute_mgmt_task(lun, &mgmt_task);
259*2c01ded3Szhenwei pi
260*2c01ded3Szhenwei pi /* Returns success */
261*2c01ded3Szhenwei pi CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD);
262*2c01ded3Szhenwei pi CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
263*2c01ded3Szhenwei pi
264*2c01ded3Szhenwei pi lun_destruct(lun);
265*2c01ded3Szhenwei pi
266*2c01ded3Szhenwei pi CU_ASSERT_EQUAL(g_task_count, 0);
267*2c01ded3Szhenwei pi }
268*2c01ded3Szhenwei pi
269*2c01ded3Szhenwei pi static void
lun_task_mgmt_execute_invalid_case(void)2708b0f2ad4SDaniel Verkamp lun_task_mgmt_execute_invalid_case(void)
2718b0f2ad4SDaniel Verkamp {
2728b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
273f9958316SDaniel Verkamp struct spdk_scsi_task mgmt_task = { 0 };
2748b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
2758b0f2ad4SDaniel Verkamp
2768b0f2ad4SDaniel Verkamp lun = lun_construct();
2778b0f2ad4SDaniel Verkamp lun->dev = &dev;
2788b0f2ad4SDaniel Verkamp
279f9958316SDaniel Verkamp ut_init_task(&mgmt_task);
280*2c01ded3Szhenwei pi mgmt_task.function = 6;
281b6092319SShuhei Matsumoto
2828b0f2ad4SDaniel Verkamp /* Pass an invalid value to the switch statement */
28318dec401SShuhei Matsumoto scsi_lun_execute_mgmt_task(lun, &mgmt_task);
2848b0f2ad4SDaniel Verkamp
2856dd09113SShuhei Matsumoto /* function code is invalid */
2866dd09113SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_REJECT_FUNC_NOT_SUPPORTED);
2878b0f2ad4SDaniel Verkamp
2888b0f2ad4SDaniel Verkamp lun_destruct(lun);
2898b0f2ad4SDaniel Verkamp
2908b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 0);
2918b0f2ad4SDaniel Verkamp }
2928b0f2ad4SDaniel Verkamp
2938b0f2ad4SDaniel Verkamp static void
lun_append_task_null_lun_task_cdb_spc_inquiry(void)2948b0f2ad4SDaniel Verkamp lun_append_task_null_lun_task_cdb_spc_inquiry(void)
2958b0f2ad4SDaniel Verkamp {
296f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
2978b0f2ad4SDaniel Verkamp uint8_t cdb[6] = { 0 };
2988b0f2ad4SDaniel Verkamp
299f9958316SDaniel Verkamp ut_init_task(&task);
300f9958316SDaniel Verkamp task.cdb = cdb;
301f9958316SDaniel Verkamp task.cdb[0] = SPDK_SPC_INQUIRY;
3028b0f2ad4SDaniel Verkamp /* alloc_len >= 4096 */
303f9958316SDaniel Verkamp task.cdb[3] = 0xFF;
304f9958316SDaniel Verkamp task.cdb[4] = 0xFF;
305f9958316SDaniel Verkamp task.lun = NULL;
3068b0f2ad4SDaniel Verkamp
307f9958316SDaniel Verkamp spdk_scsi_task_process_null_lun(&task);
3088b0f2ad4SDaniel Verkamp
309f9958316SDaniel Verkamp CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
3108b0f2ad4SDaniel Verkamp
311f2554ee9SShuhei Matsumoto spdk_scsi_task_put(&task);
3128b0f2ad4SDaniel Verkamp
313f9958316SDaniel Verkamp /* spdk_scsi_task_process_null_lun() does not call cpl_fn */
314f9958316SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 1);
315f9958316SDaniel Verkamp g_task_count = 0;
3168b0f2ad4SDaniel Verkamp }
3178b0f2ad4SDaniel Verkamp
3188b0f2ad4SDaniel Verkamp static void
lun_append_task_null_lun_alloc_len_lt_4096(void)3198b0f2ad4SDaniel Verkamp lun_append_task_null_lun_alloc_len_lt_4096(void)
3208b0f2ad4SDaniel Verkamp {
321f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
3228b0f2ad4SDaniel Verkamp uint8_t cdb[6] = { 0 };
3238b0f2ad4SDaniel Verkamp
324f9958316SDaniel Verkamp ut_init_task(&task);
325f9958316SDaniel Verkamp task.cdb = cdb;
326f9958316SDaniel Verkamp task.cdb[0] = SPDK_SPC_INQUIRY;
3278b0f2ad4SDaniel Verkamp /* alloc_len < 4096 */
328f9958316SDaniel Verkamp task.cdb[3] = 0;
329f9958316SDaniel Verkamp task.cdb[4] = 0;
3308b0f2ad4SDaniel Verkamp /* alloc_len is set to a minimal value of 4096
3318b0f2ad4SDaniel Verkamp * Hence, buf of size 4096 is allocated */
332f9958316SDaniel Verkamp spdk_scsi_task_process_null_lun(&task);
3338b0f2ad4SDaniel Verkamp
334f9958316SDaniel Verkamp CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_GOOD);
3358b0f2ad4SDaniel Verkamp
336f2554ee9SShuhei Matsumoto spdk_scsi_task_put(&task);
337f2554ee9SShuhei Matsumoto
338f9958316SDaniel Verkamp /* spdk_scsi_task_process_null_lun() does not call cpl_fn */
339f9958316SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 1);
340f9958316SDaniel Verkamp g_task_count = 0;
3418b0f2ad4SDaniel Verkamp }
3428b0f2ad4SDaniel Verkamp
3438b0f2ad4SDaniel Verkamp static void
lun_append_task_null_lun_not_supported(void)3448b0f2ad4SDaniel Verkamp lun_append_task_null_lun_not_supported(void)
3458b0f2ad4SDaniel Verkamp {
346f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
3478b0f2ad4SDaniel Verkamp uint8_t cdb[6] = { 0 };
3488b0f2ad4SDaniel Verkamp
349f9958316SDaniel Verkamp ut_init_task(&task);
350f9958316SDaniel Verkamp task.cdb = cdb;
351f9958316SDaniel Verkamp task.lun = NULL;
3528b0f2ad4SDaniel Verkamp
353f9958316SDaniel Verkamp spdk_scsi_task_process_null_lun(&task);
3548b0f2ad4SDaniel Verkamp
355f9958316SDaniel Verkamp CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
3568b0f2ad4SDaniel Verkamp /* LUN not supported; task's data transferred should be 0 */
357f9958316SDaniel Verkamp CU_ASSERT_EQUAL(task.data_transferred, 0);
3588b0f2ad4SDaniel Verkamp
359f9958316SDaniel Verkamp /* spdk_scsi_task_process_null_lun() does not call cpl_fn */
360f9958316SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 1);
361f9958316SDaniel Verkamp g_task_count = 0;
3628b0f2ad4SDaniel Verkamp }
3638b0f2ad4SDaniel Verkamp
3648b0f2ad4SDaniel Verkamp static void
lun_execute_scsi_task_pending(void)3658b0f2ad4SDaniel Verkamp lun_execute_scsi_task_pending(void)
3668b0f2ad4SDaniel Verkamp {
3678b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
368f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
3698b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
3708b0f2ad4SDaniel Verkamp
3718b0f2ad4SDaniel Verkamp lun = lun_construct();
3728b0f2ad4SDaniel Verkamp
373f9958316SDaniel Verkamp ut_init_task(&task);
374f9958316SDaniel Verkamp task.lun = lun;
3758b0f2ad4SDaniel Verkamp lun->dev = &dev;
3768b0f2ad4SDaniel Verkamp
3778b0f2ad4SDaniel Verkamp g_lun_execute_fail = false;
3788b0f2ad4SDaniel Verkamp g_lun_execute_status = SPDK_SCSI_TASK_PENDING;
3798b0f2ad4SDaniel Verkamp
3803ef8dc10SDariusz Stojaczyk /* the tasks list should still be empty since it has not been
3818b0f2ad4SDaniel Verkamp executed yet
3828b0f2ad4SDaniel Verkamp */
3838b0f2ad4SDaniel Verkamp CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
3848b0f2ad4SDaniel Verkamp
38518dec401SShuhei Matsumoto scsi_lun_execute_task(lun, &task);
3868b0f2ad4SDaniel Verkamp
3878b0f2ad4SDaniel Verkamp /* Assert the task has been successfully added to the tasks queue */
3888b0f2ad4SDaniel Verkamp CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
3898b0f2ad4SDaniel Verkamp
390f9958316SDaniel Verkamp /* task is still on the tasks list */
391f9958316SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 1);
39285a61ea6SPawel Wodkowski
39385a61ea6SPawel Wodkowski /* Need to complete task so LUN might be removed right now */
39418dec401SShuhei Matsumoto scsi_lun_complete_task(lun, &task);
39585a61ea6SPawel Wodkowski
39685a61ea6SPawel Wodkowski CU_ASSERT_EQUAL(g_task_count, 0);
39785a61ea6SPawel Wodkowski
39885a61ea6SPawel Wodkowski lun_destruct(lun);
3998b0f2ad4SDaniel Verkamp }
4008b0f2ad4SDaniel Verkamp
4018b0f2ad4SDaniel Verkamp static void
lun_execute_scsi_task_complete(void)4028b0f2ad4SDaniel Verkamp lun_execute_scsi_task_complete(void)
4038b0f2ad4SDaniel Verkamp {
4048b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
405f9958316SDaniel Verkamp struct spdk_scsi_task task = { 0 };
4068b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
4078b0f2ad4SDaniel Verkamp
4088b0f2ad4SDaniel Verkamp lun = lun_construct();
4098b0f2ad4SDaniel Verkamp
410f9958316SDaniel Verkamp ut_init_task(&task);
411f9958316SDaniel Verkamp task.lun = lun;
4128b0f2ad4SDaniel Verkamp lun->dev = &dev;
4138b0f2ad4SDaniel Verkamp
4148b0f2ad4SDaniel Verkamp g_lun_execute_fail = false;
4158b0f2ad4SDaniel Verkamp g_lun_execute_status = SPDK_SCSI_TASK_COMPLETE;
4168b0f2ad4SDaniel Verkamp
4173ef8dc10SDariusz Stojaczyk /* the tasks list should still be empty since it has not been
4188b0f2ad4SDaniel Verkamp executed yet
4198b0f2ad4SDaniel Verkamp */
4208b0f2ad4SDaniel Verkamp CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
4218b0f2ad4SDaniel Verkamp
42218dec401SShuhei Matsumoto scsi_lun_execute_task(lun, &task);
4238b0f2ad4SDaniel Verkamp
4248b0f2ad4SDaniel Verkamp /* Assert the task has not been added to the tasks queue */
4258b0f2ad4SDaniel Verkamp CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
4268b0f2ad4SDaniel Verkamp
4278b0f2ad4SDaniel Verkamp lun_destruct(lun);
4288b0f2ad4SDaniel Verkamp
4298b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 0);
4308b0f2ad4SDaniel Verkamp }
4318b0f2ad4SDaniel Verkamp
4328b0f2ad4SDaniel Verkamp static void
lun_execute_scsi_task_resize(void)4336b7e9d0aSGangCao lun_execute_scsi_task_resize(void)
4346b7e9d0aSGangCao {
4356b7e9d0aSGangCao struct spdk_scsi_lun *lun;
4366b7e9d0aSGangCao struct spdk_scsi_task task = { 0 };
4376b7e9d0aSGangCao struct spdk_scsi_dev dev = { 0 };
4386b7e9d0aSGangCao uint8_t cdb = SPDK_SBC_READ_16;
4396b7e9d0aSGangCao
4406b7e9d0aSGangCao lun = lun_construct();
4416b7e9d0aSGangCao
4426b7e9d0aSGangCao ut_init_task(&task);
4436b7e9d0aSGangCao task.lun = lun;
4446b7e9d0aSGangCao task.cdb = &cdb;
4456b7e9d0aSGangCao lun->dev = &dev;
4466b7e9d0aSGangCao lun->resizing = true;
4476b7e9d0aSGangCao
4486b7e9d0aSGangCao /* the tasks list should still be empty since it has not been
4496b7e9d0aSGangCao executed yet
4506b7e9d0aSGangCao */
4516b7e9d0aSGangCao CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
4526b7e9d0aSGangCao
4536b7e9d0aSGangCao scsi_lun_execute_task(lun, &task);
4546b7e9d0aSGangCao CU_ASSERT_EQUAL(task.status, SPDK_SCSI_STATUS_CHECK_CONDITION);
4556b7e9d0aSGangCao /* SENSE KEY */
4566b7e9d0aSGangCao CU_ASSERT_EQUAL(task.sense_data[2], SPDK_SCSI_SENSE_UNIT_ATTENTION);
4576b7e9d0aSGangCao /* SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED: 0x2a09 */
4586b7e9d0aSGangCao CU_ASSERT_EQUAL(task.sense_data[12], SPDK_SCSI_ASC_CAPACITY_DATA_HAS_CHANGED);
4596b7e9d0aSGangCao CU_ASSERT_EQUAL(task.sense_data[13], SPDK_SCSI_ASCQ_CAPACITY_DATA_HAS_CHANGED);
4606b7e9d0aSGangCao CU_ASSERT(lun->resizing == false);
4616b7e9d0aSGangCao
4626b7e9d0aSGangCao /* Assert the task has not been added to the tasks queue */
4636b7e9d0aSGangCao CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
4646b7e9d0aSGangCao
4656b7e9d0aSGangCao lun_destruct(lun);
4666b7e9d0aSGangCao
4676b7e9d0aSGangCao CU_ASSERT_EQUAL(g_task_count, 0);
4686b7e9d0aSGangCao }
4696b7e9d0aSGangCao
4706b7e9d0aSGangCao static void
lun_destruct_success(void)4718b0f2ad4SDaniel Verkamp lun_destruct_success(void)
4728b0f2ad4SDaniel Verkamp {
4738b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
4748b0f2ad4SDaniel Verkamp
4758b0f2ad4SDaniel Verkamp lun = lun_construct();
4768b0f2ad4SDaniel Verkamp
47718dec401SShuhei Matsumoto scsi_lun_destruct(lun);
4788b0f2ad4SDaniel Verkamp
4798b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 0);
4808b0f2ad4SDaniel Verkamp }
4818b0f2ad4SDaniel Verkamp
4828b0f2ad4SDaniel Verkamp static void
lun_construct_null_ctx(void)4838b0f2ad4SDaniel Verkamp lun_construct_null_ctx(void)
4848b0f2ad4SDaniel Verkamp {
4858b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
4868b0f2ad4SDaniel Verkamp
4875029fe14SLi Feng lun = scsi_lun_construct(NULL, NULL, NULL, NULL, NULL);
4888b0f2ad4SDaniel Verkamp
4898b0f2ad4SDaniel Verkamp /* lun should be NULL since we passed NULL for the ctx pointer. */
4908b0f2ad4SDaniel Verkamp CU_ASSERT(lun == NULL);
4918b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 0);
4928b0f2ad4SDaniel Verkamp }
4938b0f2ad4SDaniel Verkamp
4948b0f2ad4SDaniel Verkamp static void
lun_construct_success(void)4958b0f2ad4SDaniel Verkamp lun_construct_success(void)
4968b0f2ad4SDaniel Verkamp {
4978b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun = lun_construct();
4988b0f2ad4SDaniel Verkamp
4998b0f2ad4SDaniel Verkamp lun_destruct(lun);
5008b0f2ad4SDaniel Verkamp
5018b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(g_task_count, 0);
5028b0f2ad4SDaniel Verkamp }
5038b0f2ad4SDaniel Verkamp
50412e00e52SShuhei Matsumoto static void
lun_reset_task_wait_scsi_task_complete(void)50512e00e52SShuhei Matsumoto lun_reset_task_wait_scsi_task_complete(void)
50612e00e52SShuhei Matsumoto {
50712e00e52SShuhei Matsumoto struct spdk_scsi_lun *lun;
50812e00e52SShuhei Matsumoto struct spdk_scsi_task task = { 0 };
50912e00e52SShuhei Matsumoto struct spdk_scsi_task mgmt_task = { 0 };
51012e00e52SShuhei Matsumoto struct spdk_scsi_dev dev = { 0 };
51112e00e52SShuhei Matsumoto
51212e00e52SShuhei Matsumoto lun = lun_construct();
51312e00e52SShuhei Matsumoto lun->dev = &dev;
51412e00e52SShuhei Matsumoto
51512e00e52SShuhei Matsumoto ut_init_task(&task);
51612e00e52SShuhei Matsumoto task.lun = lun;
51712e00e52SShuhei Matsumoto
51812e00e52SShuhei Matsumoto g_lun_execute_fail = false;
51912e00e52SShuhei Matsumoto g_lun_execute_status = SPDK_SCSI_TASK_PENDING;
52012e00e52SShuhei Matsumoto
52112e00e52SShuhei Matsumoto ut_init_task(&mgmt_task);
52212e00e52SShuhei Matsumoto mgmt_task.lun = lun;
52312e00e52SShuhei Matsumoto mgmt_task.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
52412e00e52SShuhei Matsumoto
52512e00e52SShuhei Matsumoto /* Execute the task but it is still in the task list. */
52618dec401SShuhei Matsumoto scsi_lun_execute_task(lun, &task);
52712e00e52SShuhei Matsumoto
52812e00e52SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->pending_tasks));
52912e00e52SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->tasks));
53012e00e52SShuhei Matsumoto
53112e00e52SShuhei Matsumoto /* Execute the reset task */
53218dec401SShuhei Matsumoto scsi_lun_execute_mgmt_task(lun, &mgmt_task);
53312e00e52SShuhei Matsumoto
534799e0a84SShuhei Matsumoto /* The reset task should be on the submitted mgmt task list and
53512e00e52SShuhei Matsumoto * a poller is created because the task prior to the reset task is pending.
53612e00e52SShuhei Matsumoto */
53712e00e52SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->mgmt_tasks));
53812e00e52SShuhei Matsumoto CU_ASSERT(lun->reset_poller != NULL);
53912e00e52SShuhei Matsumoto
54012e00e52SShuhei Matsumoto /* Execute the poller to check if the task prior to the reset task complete. */
5410ed66e7eSShuhei Matsumoto scsi_lun_reset_check_outstanding_tasks(&mgmt_task);
54212e00e52SShuhei Matsumoto
54312e00e52SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->mgmt_tasks));
54412e00e52SShuhei Matsumoto CU_ASSERT(lun->reset_poller != NULL);
54512e00e52SShuhei Matsumoto
54612e00e52SShuhei Matsumoto /* Complete the task. */
54718dec401SShuhei Matsumoto scsi_lun_complete_task(lun, &task);
54812e00e52SShuhei Matsumoto
54912e00e52SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
55012e00e52SShuhei Matsumoto
55112e00e52SShuhei Matsumoto /* Execute the poller to check if the task prior to the reset task complete. */
5520ed66e7eSShuhei Matsumoto scsi_lun_reset_check_outstanding_tasks(&mgmt_task);
55312e00e52SShuhei Matsumoto
55412e00e52SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->mgmt_tasks));
55512e00e52SShuhei Matsumoto CU_ASSERT(lun->reset_poller == NULL);
55612e00e52SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD);
55712e00e52SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
55812e00e52SShuhei Matsumoto
55912e00e52SShuhei Matsumoto lun_destruct(lun);
56012e00e52SShuhei Matsumoto
56112e00e52SShuhei Matsumoto CU_ASSERT_EQUAL(g_task_count, 0);
56212e00e52SShuhei Matsumoto }
56312e00e52SShuhei Matsumoto
56412e00e52SShuhei Matsumoto static void
lun_reset_task_suspend_scsi_task(void)56512e00e52SShuhei Matsumoto lun_reset_task_suspend_scsi_task(void)
56612e00e52SShuhei Matsumoto {
56712e00e52SShuhei Matsumoto struct spdk_scsi_lun *lun;
56812e00e52SShuhei Matsumoto struct spdk_scsi_task task = { 0 };
56912e00e52SShuhei Matsumoto struct spdk_scsi_task mgmt_task = { 0 };
57012e00e52SShuhei Matsumoto struct spdk_scsi_dev dev = { 0 };
57112e00e52SShuhei Matsumoto
57212e00e52SShuhei Matsumoto lun = lun_construct();
57312e00e52SShuhei Matsumoto lun->dev = &dev;
57412e00e52SShuhei Matsumoto
57512e00e52SShuhei Matsumoto ut_init_task(&task);
57612e00e52SShuhei Matsumoto task.lun = lun;
57712e00e52SShuhei Matsumoto
57812e00e52SShuhei Matsumoto g_lun_execute_fail = false;
57912e00e52SShuhei Matsumoto g_lun_execute_status = SPDK_SCSI_TASK_COMPLETE;
58012e00e52SShuhei Matsumoto
58112e00e52SShuhei Matsumoto ut_init_task(&mgmt_task);
58212e00e52SShuhei Matsumoto mgmt_task.lun = lun;
58312e00e52SShuhei Matsumoto mgmt_task.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
58412e00e52SShuhei Matsumoto
58512e00e52SShuhei Matsumoto /* Append a reset task to the pending mgmt task list. */
586799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &mgmt_task);
58712e00e52SShuhei Matsumoto
58812e00e52SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->pending_mgmt_tasks));
58912e00e52SShuhei Matsumoto
590799e0a84SShuhei Matsumoto /* Execute the task but it is on the pending task list. */
59118dec401SShuhei Matsumoto scsi_lun_execute_task(lun, &task);
59212e00e52SShuhei Matsumoto
59312e00e52SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->pending_tasks));
59412e00e52SShuhei Matsumoto
59512e00e52SShuhei Matsumoto /* Execute the reset task. The task will be executed then. */
59618dec401SShuhei Matsumoto _scsi_lun_execute_mgmt_task(lun);
59712e00e52SShuhei Matsumoto
59812e00e52SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->mgmt_tasks));
59912e00e52SShuhei Matsumoto CU_ASSERT(lun->reset_poller == NULL);
60012e00e52SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.status, SPDK_SCSI_STATUS_GOOD);
60112e00e52SShuhei Matsumoto CU_ASSERT_EQUAL(mgmt_task.response, SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
60212e00e52SShuhei Matsumoto
60312e00e52SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->pending_tasks));
60412e00e52SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->tasks));
60512e00e52SShuhei Matsumoto
60612e00e52SShuhei Matsumoto lun_destruct(lun);
60712e00e52SShuhei Matsumoto
60812e00e52SShuhei Matsumoto CU_ASSERT_EQUAL(g_task_count, 0);
60912e00e52SShuhei Matsumoto }
61012e00e52SShuhei Matsumoto
611f9583f2cSShuhei Matsumoto static void
lun_check_pending_tasks_only_for_specific_initiator(void)612f9583f2cSShuhei Matsumoto lun_check_pending_tasks_only_for_specific_initiator(void)
613f9583f2cSShuhei Matsumoto {
614f9583f2cSShuhei Matsumoto struct spdk_scsi_lun *lun;
615f9583f2cSShuhei Matsumoto struct spdk_scsi_task task1 = {};
616f9583f2cSShuhei Matsumoto struct spdk_scsi_task task2 = {};
617f9583f2cSShuhei Matsumoto struct spdk_scsi_port initiator_port1 = {};
618f9583f2cSShuhei Matsumoto struct spdk_scsi_port initiator_port2 = {};
619f9583f2cSShuhei Matsumoto struct spdk_scsi_port initiator_port3 = {};
620f9583f2cSShuhei Matsumoto
621ab808d2bSShuhei Matsumoto lun = scsi_lun_construct("ut_bdev", NULL, NULL, NULL, NULL);
622f9583f2cSShuhei Matsumoto
623f9583f2cSShuhei Matsumoto task1.initiator_port = &initiator_port1;
624f9583f2cSShuhei Matsumoto task2.initiator_port = &initiator_port2;
625f9583f2cSShuhei Matsumoto
626f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->tasks, &task1, scsi_link);
627f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->tasks, &task2, scsi_link);
628f9583f2cSShuhei Matsumoto CU_ASSERT(scsi_lun_has_outstanding_tasks(lun) == true);
62918dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_tasks(lun) == false);
63018dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, NULL) == true);
63118dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, &initiator_port1) == true);
63218dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, &initiator_port2) == true);
63318dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, &initiator_port3) == false);
634f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->tasks, &task1, scsi_link);
635f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->tasks, &task2, scsi_link);
63618dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_tasks(lun) == false);
63718dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, NULL) == false);
638f9583f2cSShuhei Matsumoto
639f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->pending_tasks, &task1, scsi_link);
640f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->pending_tasks, &task2, scsi_link);
641f9583f2cSShuhei Matsumoto CU_ASSERT(scsi_lun_has_outstanding_tasks(lun) == false);
64218dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_tasks(lun) == true);
64318dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, NULL) == true);
64418dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, &initiator_port1) == true);
64518dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, &initiator_port2) == true);
64618dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, &initiator_port3) == false);
647f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->pending_tasks, &task1, scsi_link);
648f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->pending_tasks, &task2, scsi_link);
64918dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_tasks(lun) == false);
65018dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_tasks(lun, NULL) == false);
651f9583f2cSShuhei Matsumoto
652f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->mgmt_tasks, &task1, scsi_link);
653f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->mgmt_tasks, &task2, scsi_link);
6542144f0b4SShuhei Matsumoto CU_ASSERT(scsi_lun_has_outstanding_mgmt_tasks(lun) == true);
65518dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_mgmt_tasks(lun) == false);
65618dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, NULL) == true);
65718dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, &initiator_port1) == true);
65818dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, &initiator_port2) == true);
65918dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, &initiator_port3) == false);
660f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->mgmt_tasks, &task1, scsi_link);
661f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->mgmt_tasks, &task2, scsi_link);
66218dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_mgmt_tasks(lun) == false);
66318dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, NULL) == false);
664f9583f2cSShuhei Matsumoto
665f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->pending_mgmt_tasks, &task1, scsi_link);
666f9583f2cSShuhei Matsumoto TAILQ_INSERT_TAIL(&lun->pending_mgmt_tasks, &task2, scsi_link);
66718dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_mgmt_tasks(lun) == true);
66818dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, NULL) == true);
66918dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, &initiator_port1) == true);
67018dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, &initiator_port2) == true);
67118dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, &initiator_port3) == false);
672f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->pending_mgmt_tasks, &task1, scsi_link);
673f9583f2cSShuhei Matsumoto TAILQ_REMOVE(&lun->pending_mgmt_tasks, &task2, scsi_link);
67418dec401SShuhei Matsumoto CU_ASSERT(_scsi_lun_has_pending_mgmt_tasks(lun) == false);
67518dec401SShuhei Matsumoto CU_ASSERT(scsi_lun_has_pending_mgmt_tasks(lun, NULL) == false);
676f9583f2cSShuhei Matsumoto
677f9583f2cSShuhei Matsumoto scsi_lun_remove(lun);
678f9583f2cSShuhei Matsumoto }
679f9583f2cSShuhei Matsumoto
6808287ae78SShuhei Matsumoto static void
abort_pending_mgmt_tasks_when_lun_is_removed(void)6818287ae78SShuhei Matsumoto abort_pending_mgmt_tasks_when_lun_is_removed(void)
6828287ae78SShuhei Matsumoto {
6838287ae78SShuhei Matsumoto struct spdk_scsi_lun *lun;
6848287ae78SShuhei Matsumoto struct spdk_scsi_task task1, task2, task3;
6858287ae78SShuhei Matsumoto
686ab808d2bSShuhei Matsumoto lun = scsi_lun_construct("ut_bdev", NULL, NULL, NULL, NULL);
6878287ae78SShuhei Matsumoto
6888287ae78SShuhei Matsumoto /* Normal case */
6898287ae78SShuhei Matsumoto ut_init_task(&task1);
6908287ae78SShuhei Matsumoto ut_init_task(&task2);
6918287ae78SShuhei Matsumoto ut_init_task(&task3);
6928287ae78SShuhei Matsumoto task1.lun = lun;
6938287ae78SShuhei Matsumoto task2.lun = lun;
6948287ae78SShuhei Matsumoto task3.lun = lun;
6958287ae78SShuhei Matsumoto task1.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
6968287ae78SShuhei Matsumoto task2.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
6978287ae78SShuhei Matsumoto task3.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
6988287ae78SShuhei Matsumoto
6998287ae78SShuhei Matsumoto CU_ASSERT(g_task_count == 3);
7008287ae78SShuhei Matsumoto
701799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &task1);
702799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &task2);
703799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &task3);
7048287ae78SShuhei Matsumoto
7058287ae78SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->pending_mgmt_tasks));
7068287ae78SShuhei Matsumoto
70718dec401SShuhei Matsumoto _scsi_lun_execute_mgmt_task(lun);
7088287ae78SShuhei Matsumoto
7098287ae78SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->pending_mgmt_tasks));
7108287ae78SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->mgmt_tasks));
7118287ae78SShuhei Matsumoto CU_ASSERT(g_task_count == 0);
7128287ae78SShuhei Matsumoto CU_ASSERT(task1.response == SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
7138287ae78SShuhei Matsumoto CU_ASSERT(task2.response == SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
7148287ae78SShuhei Matsumoto CU_ASSERT(task3.response == SPDK_SCSI_TASK_MGMT_RESP_SUCCESS);
7158287ae78SShuhei Matsumoto
7168287ae78SShuhei Matsumoto /* LUN hotplug case */
7178287ae78SShuhei Matsumoto ut_init_task(&task1);
7188287ae78SShuhei Matsumoto ut_init_task(&task2);
7198287ae78SShuhei Matsumoto ut_init_task(&task3);
7208287ae78SShuhei Matsumoto task1.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
7218287ae78SShuhei Matsumoto task2.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
7228287ae78SShuhei Matsumoto task3.function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
7238287ae78SShuhei Matsumoto
7248287ae78SShuhei Matsumoto CU_ASSERT(g_task_count == 3);
7258287ae78SShuhei Matsumoto
726799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &task1);
727799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &task2);
728799e0a84SShuhei Matsumoto scsi_lun_append_mgmt_task(lun, &task3);
7298287ae78SShuhei Matsumoto
7308287ae78SShuhei Matsumoto CU_ASSERT(!TAILQ_EMPTY(&lun->pending_mgmt_tasks));
7318287ae78SShuhei Matsumoto
7328287ae78SShuhei Matsumoto lun->removed = true;
7338287ae78SShuhei Matsumoto
73418dec401SShuhei Matsumoto _scsi_lun_execute_mgmt_task(lun);
7358287ae78SShuhei Matsumoto
7368287ae78SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->pending_mgmt_tasks));
7378287ae78SShuhei Matsumoto CU_ASSERT(TAILQ_EMPTY(&lun->mgmt_tasks));
7388287ae78SShuhei Matsumoto CU_ASSERT(g_task_count == 0);
7398287ae78SShuhei Matsumoto CU_ASSERT(task1.response == SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN);
7408287ae78SShuhei Matsumoto CU_ASSERT(task2.response == SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN);
7418287ae78SShuhei Matsumoto CU_ASSERT(task3.response == SPDK_SCSI_TASK_MGMT_RESP_INVALID_LUN);
7428287ae78SShuhei Matsumoto
7438287ae78SShuhei Matsumoto scsi_lun_remove(lun);
7448287ae78SShuhei Matsumoto }
7458287ae78SShuhei Matsumoto
7468b0f2ad4SDaniel Verkamp int
main(int argc,char ** argv)7478b0f2ad4SDaniel Verkamp main(int argc, char **argv)
7488b0f2ad4SDaniel Verkamp {
7498b0f2ad4SDaniel Verkamp CU_pSuite suite = NULL;
7508b0f2ad4SDaniel Verkamp unsigned int num_failures;
7518b0f2ad4SDaniel Verkamp
75278b696bcSVitaliy Mysak CU_initialize_registry();
7538b0f2ad4SDaniel Verkamp
7548b0f2ad4SDaniel Verkamp suite = CU_add_suite("lun_suite", NULL, NULL);
7558b0f2ad4SDaniel Verkamp
756dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_task_mgmt_execute_abort_task_not_supported);
757dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_task_mgmt_execute_abort_task_all_not_supported);
758dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_task_mgmt_execute_lun_reset);
759*2c01ded3Szhenwei pi CU_ADD_TEST(suite, lun_task_mgmt_execute_target_reset);
760dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_task_mgmt_execute_invalid_case);
761dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_append_task_null_lun_task_cdb_spc_inquiry);
762dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_append_task_null_lun_alloc_len_lt_4096);
763dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_append_task_null_lun_not_supported);
764dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_execute_scsi_task_pending);
765dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_execute_scsi_task_complete);
7666b7e9d0aSGangCao CU_ADD_TEST(suite, lun_execute_scsi_task_resize);
767dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_destruct_success);
768dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_construct_null_ctx);
769dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_construct_success);
770dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_reset_task_wait_scsi_task_complete);
771dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_reset_task_suspend_scsi_task);
772dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, lun_check_pending_tasks_only_for_specific_initiator);
773dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, abort_pending_mgmt_tasks_when_lun_is_removed);
7748b0f2ad4SDaniel Verkamp
7757d468452SJim Harris allocate_threads(1);
7767d468452SJim Harris set_thread(0);
777ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
7787d468452SJim Harris free_threads();
7798b0f2ad4SDaniel Verkamp CU_cleanup_registry();
7808b0f2ad4SDaniel Verkamp return num_failures;
7818b0f2ad4SDaniel Verkamp }
782