1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2016 Intel Corporation.
38b0f2ad4SDaniel Verkamp * All rights reserved.
4d4789360SAlexey Marchuk * Copyright (c) 2021 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
58b0f2ad4SDaniel Verkamp */
68b0f2ad4SDaniel Verkamp
78b0f2ad4SDaniel Verkamp #include "spdk/stdinc.h"
88b0f2ad4SDaniel Verkamp
98b0f2ad4SDaniel Verkamp #include "CUnit/Basic.h"
10ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
118b0f2ad4SDaniel Verkamp
1236a8f750SDaniel Verkamp #include "spdk/util.h"
1336a8f750SDaniel Verkamp
14d998c1adSJim Harris #include "scsi/dev.c"
15d998c1adSJim Harris #include "scsi/port.c"
168b0f2ad4SDaniel Verkamp
17760c8defSShuhei Matsumoto #include "spdk_internal/mock.h"
18760c8defSShuhei Matsumoto
19f4b81843SNick Connolly DEFINE_STUB(spdk_scsi_lun_is_removing, bool,
20f4b81843SNick Connolly (const struct spdk_scsi_lun *lun), false);
21f4b81843SNick Connolly
22ab808d2bSShuhei Matsumoto static char *g_bdev_names[] = {
23ab808d2bSShuhei Matsumoto "malloc0",
24ab808d2bSShuhei Matsumoto "malloc1",
25f61d81e4SShuhei Matsumoto "malloc2",
26f61d81e4SShuhei Matsumoto "malloc4",
2736a8f750SDaniel Verkamp };
288b0f2ad4SDaniel Verkamp
291dc9a762SShuhei Matsumoto static struct spdk_scsi_port *g_initiator_port_with_pending_tasks = NULL;
301dc9a762SShuhei Matsumoto static struct spdk_scsi_port *g_initiator_port_with_pending_mgmt_tasks = NULL;
311dc9a762SShuhei Matsumoto
328b0f2ad4SDaniel Verkamp static struct spdk_scsi_task *
spdk_get_task(uint32_t * owner_task_ctr)338b0f2ad4SDaniel Verkamp spdk_get_task(uint32_t *owner_task_ctr)
348b0f2ad4SDaniel Verkamp {
358b0f2ad4SDaniel Verkamp struct spdk_scsi_task *task;
368b0f2ad4SDaniel Verkamp
378b0f2ad4SDaniel Verkamp task = calloc(1, sizeof(*task));
388b0f2ad4SDaniel Verkamp if (!task) {
398b0f2ad4SDaniel Verkamp return NULL;
408b0f2ad4SDaniel Verkamp }
418b0f2ad4SDaniel Verkamp
428b0f2ad4SDaniel Verkamp return task;
438b0f2ad4SDaniel Verkamp }
448b0f2ad4SDaniel Verkamp
458b0f2ad4SDaniel Verkamp void
spdk_scsi_task_put(struct spdk_scsi_task * task)468b0f2ad4SDaniel Verkamp spdk_scsi_task_put(struct spdk_scsi_task *task)
478b0f2ad4SDaniel Verkamp {
488b0f2ad4SDaniel Verkamp free(task);
498b0f2ad4SDaniel Verkamp }
508b0f2ad4SDaniel Verkamp
scsi_lun_construct(const char * bdev_name,void (* resize_cb)(const struct spdk_scsi_lun *,void *),void * resize_ctx,void (* hotremove_cb)(const struct spdk_scsi_lun *,void *),void * hotremove_ctx)51ab808d2bSShuhei Matsumoto struct spdk_scsi_lun *scsi_lun_construct(const char *bdev_name,
525029fe14SLi Feng void (*resize_cb)(const struct spdk_scsi_lun *, void *),
535029fe14SLi Feng void *resize_ctx,
5472343bcfSDariusz Stojaczyk void (*hotremove_cb)(const struct spdk_scsi_lun *, void *),
5572343bcfSDariusz Stojaczyk void *hotremove_ctx)
568b0f2ad4SDaniel Verkamp {
578b0f2ad4SDaniel Verkamp struct spdk_scsi_lun *lun;
58ab808d2bSShuhei Matsumoto size_t i;
59a7d816bfSDaniel Verkamp
60ab808d2bSShuhei Matsumoto for (i = 0; i < SPDK_COUNTOF(g_bdev_names); i++) {
61ab808d2bSShuhei Matsumoto if (strcmp(bdev_name, g_bdev_names[i]) == 0) {
62a7d816bfSDaniel Verkamp lun = calloc(1, sizeof(struct spdk_scsi_lun));
63a7d816bfSDaniel Verkamp SPDK_CU_ASSERT_FATAL(lun != NULL);
64583e9699SShuhei Matsumoto
658b0f2ad4SDaniel Verkamp return lun;
668b0f2ad4SDaniel Verkamp }
67ab808d2bSShuhei Matsumoto }
68ab808d2bSShuhei Matsumoto
69ab808d2bSShuhei Matsumoto return NULL;
70ab808d2bSShuhei Matsumoto }
718b0f2ad4SDaniel Verkamp
7285a61ea6SPawel Wodkowski void
scsi_lun_destruct(struct spdk_scsi_lun * lun)7318dec401SShuhei Matsumoto scsi_lun_destruct(struct spdk_scsi_lun *lun)
748b0f2ad4SDaniel Verkamp {
758b0f2ad4SDaniel Verkamp free(lun);
768b0f2ad4SDaniel Verkamp }
778b0f2ad4SDaniel Verkamp
7818dec401SShuhei Matsumoto DEFINE_STUB_V(scsi_lun_execute_mgmt_task,
79760c8defSShuhei Matsumoto (struct spdk_scsi_lun *lun, struct spdk_scsi_task *task));
806dd09113SShuhei Matsumoto
8118dec401SShuhei Matsumoto DEFINE_STUB_V(scsi_lun_execute_task,
82760c8defSShuhei Matsumoto (struct spdk_scsi_lun *lun, struct spdk_scsi_task *task));
83b409bf40SShuhei Matsumoto
8418dec401SShuhei Matsumoto DEFINE_STUB(scsi_lun_allocate_io_channel, int,
85760c8defSShuhei Matsumoto (struct spdk_scsi_lun *lun), 0);
868b0f2ad4SDaniel Verkamp
8718dec401SShuhei Matsumoto DEFINE_STUB_V(scsi_lun_free_io_channel, (struct spdk_scsi_lun *lun));
888b0f2ad4SDaniel Verkamp
891dc9a762SShuhei Matsumoto bool
scsi_lun_has_pending_mgmt_tasks(const struct spdk_scsi_lun * lun,const struct spdk_scsi_port * initiator_port)9018dec401SShuhei Matsumoto scsi_lun_has_pending_mgmt_tasks(const struct spdk_scsi_lun *lun,
911dc9a762SShuhei Matsumoto const struct spdk_scsi_port *initiator_port)
921dc9a762SShuhei Matsumoto {
931dc9a762SShuhei Matsumoto return (g_initiator_port_with_pending_mgmt_tasks == initiator_port);
941dc9a762SShuhei Matsumoto }
951dc9a762SShuhei Matsumoto
961dc9a762SShuhei Matsumoto bool
scsi_lun_has_pending_tasks(const struct spdk_scsi_lun * lun,const struct spdk_scsi_port * initiator_port)9718dec401SShuhei Matsumoto scsi_lun_has_pending_tasks(const struct spdk_scsi_lun *lun,
981dc9a762SShuhei Matsumoto const struct spdk_scsi_port *initiator_port)
991dc9a762SShuhei Matsumoto {
1001dc9a762SShuhei Matsumoto return (g_initiator_port_with_pending_tasks == initiator_port);
1011dc9a762SShuhei Matsumoto }
1028b0f2ad4SDaniel Verkamp
1038b0f2ad4SDaniel Verkamp static void
dev_destruct_null_dev(void)1048b0f2ad4SDaniel Verkamp dev_destruct_null_dev(void)
1058b0f2ad4SDaniel Verkamp {
1068b0f2ad4SDaniel Verkamp /* pass null for the dev */
10756d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(NULL, NULL, NULL);
1088b0f2ad4SDaniel Verkamp }
1098b0f2ad4SDaniel Verkamp
1108b0f2ad4SDaniel Verkamp static void
dev_destruct_zero_luns(void)1118b0f2ad4SDaniel Verkamp dev_destruct_zero_luns(void)
1128b0f2ad4SDaniel Verkamp {
11385a61ea6SPawel Wodkowski struct spdk_scsi_dev dev = { .is_allocated = 1 };
1148b0f2ad4SDaniel Verkamp
115fa15dc61SDariusz Stojaczyk /* No luns attached to the dev */
1168b0f2ad4SDaniel Verkamp
1178b0f2ad4SDaniel Verkamp /* free the dev */
11856d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(&dev, NULL, NULL);
1198b0f2ad4SDaniel Verkamp }
1208b0f2ad4SDaniel Verkamp
1218b0f2ad4SDaniel Verkamp static void
dev_destruct_null_lun(void)1228b0f2ad4SDaniel Verkamp dev_destruct_null_lun(void)
1238b0f2ad4SDaniel Verkamp {
12485a61ea6SPawel Wodkowski struct spdk_scsi_dev dev = { .is_allocated = 1 };
1258b0f2ad4SDaniel Verkamp
1268b0f2ad4SDaniel Verkamp /* pass null for the lun */
1274265fc50SShuhei Matsumoto TAILQ_INIT(&dev.luns);
1288b0f2ad4SDaniel Verkamp
1298b0f2ad4SDaniel Verkamp /* free the dev */
13056d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(&dev, NULL, NULL);
1318b0f2ad4SDaniel Verkamp }
1328b0f2ad4SDaniel Verkamp
1338b0f2ad4SDaniel Verkamp static void
dev_destruct_success(void)1348b0f2ad4SDaniel Verkamp dev_destruct_success(void)
1358b0f2ad4SDaniel Verkamp {
1364265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = {
1374265fc50SShuhei Matsumoto .is_allocated = 1,
1384265fc50SShuhei Matsumoto .luns = TAILQ_HEAD_INITIALIZER(dev.luns),
1394265fc50SShuhei Matsumoto };
140e3d083f8SJim Harris int rc;
1418b0f2ad4SDaniel Verkamp
1428b0f2ad4SDaniel Verkamp /* dev with a single lun */
143e3d083f8SJim Harris rc = spdk_scsi_dev_add_lun(&dev, "malloc0", 0, NULL, NULL);
144e3d083f8SJim Harris
145e3d083f8SJim Harris CU_ASSERT(rc == 0);
1468b0f2ad4SDaniel Verkamp
1478b0f2ad4SDaniel Verkamp /* free the dev */
14856d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(&dev, NULL, NULL);
1498b0f2ad4SDaniel Verkamp
1508b0f2ad4SDaniel Verkamp }
1518b0f2ad4SDaniel Verkamp
1528b0f2ad4SDaniel Verkamp static void
dev_construct_num_luns_zero(void)1538b0f2ad4SDaniel Verkamp dev_construct_num_luns_zero(void)
1548b0f2ad4SDaniel Verkamp {
1558b0f2ad4SDaniel Verkamp struct spdk_scsi_dev *dev;
156583e9699SShuhei Matsumoto const char *bdev_name_list[1] = {};
1578b0f2ad4SDaniel Verkamp int lun_id_list[1] = { 0 };
1588b0f2ad4SDaniel Verkamp
159583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 0,
16072343bcfSDariusz Stojaczyk SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
1618b0f2ad4SDaniel Verkamp
1628b0f2ad4SDaniel Verkamp /* dev should be null since we passed num_luns = 0 */
1638b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(dev == NULL);
1648b0f2ad4SDaniel Verkamp }
1658b0f2ad4SDaniel Verkamp
1668b0f2ad4SDaniel Verkamp static void
dev_construct_no_lun_zero(void)1678b0f2ad4SDaniel Verkamp dev_construct_no_lun_zero(void)
1688b0f2ad4SDaniel Verkamp {
1698b0f2ad4SDaniel Verkamp struct spdk_scsi_dev *dev;
170583e9699SShuhei Matsumoto const char *bdev_name_list[1] = {};
1718b0f2ad4SDaniel Verkamp int lun_id_list[1] = { 0 };
1728b0f2ad4SDaniel Verkamp
1738b0f2ad4SDaniel Verkamp lun_id_list[0] = 1;
1748b0f2ad4SDaniel Verkamp
175583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1,
17672343bcfSDariusz Stojaczyk SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
1778b0f2ad4SDaniel Verkamp
1788b0f2ad4SDaniel Verkamp /* dev should be null since no LUN0 was specified (lun_id_list[0] = 1) */
1798b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(dev == NULL);
1808b0f2ad4SDaniel Verkamp }
1818b0f2ad4SDaniel Verkamp
1828b0f2ad4SDaniel Verkamp static void
dev_construct_null_lun(void)1838b0f2ad4SDaniel Verkamp dev_construct_null_lun(void)
1848b0f2ad4SDaniel Verkamp {
1858b0f2ad4SDaniel Verkamp struct spdk_scsi_dev *dev;
186583e9699SShuhei Matsumoto const char *bdev_name_list[1] = {};
1878b0f2ad4SDaniel Verkamp int lun_id_list[1] = { 0 };
1888b0f2ad4SDaniel Verkamp
189583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1,
19072343bcfSDariusz Stojaczyk SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
1918b0f2ad4SDaniel Verkamp
1928b0f2ad4SDaniel Verkamp /* dev should be null since no LUN0 was specified (lun_list[0] = NULL) */
1938b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(dev == NULL);
1948b0f2ad4SDaniel Verkamp }
1958b0f2ad4SDaniel Verkamp
1968b0f2ad4SDaniel Verkamp static void
dev_construct_name_too_long(void)197af9c9a41SDaniel Verkamp dev_construct_name_too_long(void)
198af9c9a41SDaniel Verkamp {
199af9c9a41SDaniel Verkamp struct spdk_scsi_dev *dev;
200af9c9a41SDaniel Verkamp const char *bdev_name_list[1] = {"malloc0"};
201af9c9a41SDaniel Verkamp int lun_id_list[1] = { 0 };
202af9c9a41SDaniel Verkamp char name[SPDK_SCSI_DEV_MAX_NAME + 1 + 1];
203af9c9a41SDaniel Verkamp
204af9c9a41SDaniel Verkamp /* Try to construct a dev with a name that is one byte longer than allowed. */
205af9c9a41SDaniel Verkamp memset(name, 'x', sizeof(name) - 1);
206af9c9a41SDaniel Verkamp name[sizeof(name) - 1] = '\0';
207af9c9a41SDaniel Verkamp
208af9c9a41SDaniel Verkamp dev = spdk_scsi_dev_construct(name, bdev_name_list, lun_id_list, 1,
209af9c9a41SDaniel Verkamp SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
210af9c9a41SDaniel Verkamp
211af9c9a41SDaniel Verkamp CU_ASSERT(dev == NULL);
212af9c9a41SDaniel Verkamp }
213af9c9a41SDaniel Verkamp
214af9c9a41SDaniel Verkamp static void
dev_construct_success(void)2158b0f2ad4SDaniel Verkamp dev_construct_success(void)
2168b0f2ad4SDaniel Verkamp {
2178b0f2ad4SDaniel Verkamp struct spdk_scsi_dev *dev;
218583e9699SShuhei Matsumoto const char *bdev_name_list[1] = {"malloc0"};
2198b0f2ad4SDaniel Verkamp int lun_id_list[1] = { 0 };
2208b0f2ad4SDaniel Verkamp
221583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1,
22272343bcfSDariusz Stojaczyk SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
2238b0f2ad4SDaniel Verkamp
2248b0f2ad4SDaniel Verkamp /* Successfully constructs and returns a dev */
2258b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(dev != NULL);
2268b0f2ad4SDaniel Verkamp
2278b0f2ad4SDaniel Verkamp /* free the dev */
22856d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(dev, NULL, NULL);
2298b0f2ad4SDaniel Verkamp }
2308b0f2ad4SDaniel Verkamp
2318b0f2ad4SDaniel Verkamp static void
dev_construct_success_lun_zero_not_first(void)23236a8f750SDaniel Verkamp dev_construct_success_lun_zero_not_first(void)
23336a8f750SDaniel Verkamp {
23436a8f750SDaniel Verkamp struct spdk_scsi_dev *dev;
235583e9699SShuhei Matsumoto const char *bdev_name_list[2] = {"malloc1", "malloc0"};
23636a8f750SDaniel Verkamp int lun_id_list[2] = { 1, 0 };
23736a8f750SDaniel Verkamp
238583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 2,
23936a8f750SDaniel Verkamp SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
24036a8f750SDaniel Verkamp
24136a8f750SDaniel Verkamp /* Successfully constructs and returns a dev */
24236a8f750SDaniel Verkamp CU_ASSERT_TRUE(dev != NULL);
24336a8f750SDaniel Verkamp
24436a8f750SDaniel Verkamp /* free the dev */
24556d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(dev, NULL, NULL);
2468b0f2ad4SDaniel Verkamp }
2478b0f2ad4SDaniel Verkamp
2488b0f2ad4SDaniel Verkamp static void
dev_queue_mgmt_task_success(void)2498b0f2ad4SDaniel Verkamp dev_queue_mgmt_task_success(void)
2508b0f2ad4SDaniel Verkamp {
2518b0f2ad4SDaniel Verkamp struct spdk_scsi_dev *dev;
252583e9699SShuhei Matsumoto const char *bdev_name_list[1] = {"malloc0"};
2538b0f2ad4SDaniel Verkamp int lun_id_list[1] = { 0 };
2548b0f2ad4SDaniel Verkamp struct spdk_scsi_task *task;
2558b0f2ad4SDaniel Verkamp
256583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1,
25772343bcfSDariusz Stojaczyk SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
2588b0f2ad4SDaniel Verkamp
2598b0f2ad4SDaniel Verkamp /* Successfully constructs and returns a dev */
2608b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(dev != NULL);
2618b0f2ad4SDaniel Verkamp
2628b0f2ad4SDaniel Verkamp task = spdk_get_task(NULL);
2638b0f2ad4SDaniel Verkamp
264728972cdSShuhei Matsumoto task->function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
265728972cdSShuhei Matsumoto spdk_scsi_dev_queue_mgmt_task(dev, task);
2668b0f2ad4SDaniel Verkamp
2678b0f2ad4SDaniel Verkamp spdk_scsi_task_put(task);
2688b0f2ad4SDaniel Verkamp
26956d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(dev, NULL, NULL);
2708b0f2ad4SDaniel Verkamp }
2718b0f2ad4SDaniel Verkamp
2728b0f2ad4SDaniel Verkamp static void
dev_queue_task_success(void)2738b0f2ad4SDaniel Verkamp dev_queue_task_success(void)
2748b0f2ad4SDaniel Verkamp {
2758b0f2ad4SDaniel Verkamp struct spdk_scsi_dev *dev;
276583e9699SShuhei Matsumoto const char *bdev_name_list[1] = {"malloc0"};
2778b0f2ad4SDaniel Verkamp int lun_id_list[1] = { 0 };
2788b0f2ad4SDaniel Verkamp struct spdk_scsi_task *task;
2798b0f2ad4SDaniel Verkamp
280583e9699SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 1,
28172343bcfSDariusz Stojaczyk SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
2828b0f2ad4SDaniel Verkamp
2838b0f2ad4SDaniel Verkamp /* Successfully constructs and returns a dev */
2848b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(dev != NULL);
2858b0f2ad4SDaniel Verkamp
2868b0f2ad4SDaniel Verkamp task = spdk_get_task(NULL);
2878b0f2ad4SDaniel Verkamp
2888b0f2ad4SDaniel Verkamp spdk_scsi_dev_queue_task(dev, task);
2898b0f2ad4SDaniel Verkamp
2908b0f2ad4SDaniel Verkamp spdk_scsi_task_put(task);
2918b0f2ad4SDaniel Verkamp
29256d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(dev, NULL, NULL);
2938b0f2ad4SDaniel Verkamp }
2948b0f2ad4SDaniel Verkamp
2958b0f2ad4SDaniel Verkamp static void
dev_stop_success(void)2968b0f2ad4SDaniel Verkamp dev_stop_success(void)
2978b0f2ad4SDaniel Verkamp {
2988b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
2998b0f2ad4SDaniel Verkamp struct spdk_scsi_task *task;
3008b0f2ad4SDaniel Verkamp struct spdk_scsi_task *task_mgmt;
3018b0f2ad4SDaniel Verkamp
3028b0f2ad4SDaniel Verkamp task = spdk_get_task(NULL);
3038b0f2ad4SDaniel Verkamp
3048b0f2ad4SDaniel Verkamp spdk_scsi_dev_queue_task(&dev, task);
3058b0f2ad4SDaniel Verkamp
3068b0f2ad4SDaniel Verkamp task_mgmt = spdk_get_task(NULL);
3078b0f2ad4SDaniel Verkamp
3088b0f2ad4SDaniel Verkamp /* Enqueue the tasks into dev->task_mgmt_submit_queue */
309728972cdSShuhei Matsumoto task->function = SPDK_SCSI_TASK_FUNC_LUN_RESET;
310728972cdSShuhei Matsumoto spdk_scsi_dev_queue_mgmt_task(&dev, task_mgmt);
3118b0f2ad4SDaniel Verkamp
3128b0f2ad4SDaniel Verkamp spdk_scsi_task_put(task);
3138b0f2ad4SDaniel Verkamp spdk_scsi_task_put(task_mgmt);
3148b0f2ad4SDaniel Verkamp }
3158b0f2ad4SDaniel Verkamp
3168b0f2ad4SDaniel Verkamp static void
dev_add_port_max_ports(void)3178b0f2ad4SDaniel Verkamp dev_add_port_max_ports(void)
3188b0f2ad4SDaniel Verkamp {
3198b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
3208b0f2ad4SDaniel Verkamp const char *name;
3218b0f2ad4SDaniel Verkamp int id, rc;
3228b0f2ad4SDaniel Verkamp
3238b0f2ad4SDaniel Verkamp /* dev is set to SPDK_SCSI_DEV_MAX_PORTS */
3248b0f2ad4SDaniel Verkamp dev.num_ports = SPDK_SCSI_DEV_MAX_PORTS;
3258b0f2ad4SDaniel Verkamp name = "Name of Port";
3268b0f2ad4SDaniel Verkamp id = 1;
3278b0f2ad4SDaniel Verkamp
3288b0f2ad4SDaniel Verkamp rc = spdk_scsi_dev_add_port(&dev, id, name);
3298b0f2ad4SDaniel Verkamp
3308b0f2ad4SDaniel Verkamp /* returns -1; since the dev already has maximum
3318b0f2ad4SDaniel Verkamp * number of ports (SPDK_SCSI_DEV_MAX_PORTS) */
3328b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(rc < 0);
3338b0f2ad4SDaniel Verkamp }
3348b0f2ad4SDaniel Verkamp
3358b0f2ad4SDaniel Verkamp static void
dev_add_port_construct_failure1(void)33675af8a10SShuhei Matsumoto dev_add_port_construct_failure1(void)
3378b0f2ad4SDaniel Verkamp {
3388b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
3398b0f2ad4SDaniel Verkamp const int port_name_length = SPDK_SCSI_PORT_MAX_NAME_LENGTH + 2;
3408b0f2ad4SDaniel Verkamp char name[port_name_length];
34175af8a10SShuhei Matsumoto uint64_t id;
34275af8a10SShuhei Matsumoto int rc;
3438b0f2ad4SDaniel Verkamp
3448b0f2ad4SDaniel Verkamp dev.num_ports = 1;
3458b0f2ad4SDaniel Verkamp /* Set the name such that the length exceeds SPDK_SCSI_PORT_MAX_NAME_LENGTH
3468b0f2ad4SDaniel Verkamp * SPDK_SCSI_PORT_MAX_NAME_LENGTH = 256 */
3478b0f2ad4SDaniel Verkamp memset(name, 'a', port_name_length - 1);
3488b0f2ad4SDaniel Verkamp name[port_name_length - 1] = '\0';
3498b0f2ad4SDaniel Verkamp id = 1;
3508b0f2ad4SDaniel Verkamp
3518b0f2ad4SDaniel Verkamp rc = spdk_scsi_dev_add_port(&dev, id, name);
3528b0f2ad4SDaniel Verkamp
3538b0f2ad4SDaniel Verkamp /* returns -1; since the length of the name exceeds
3548b0f2ad4SDaniel Verkamp * SPDK_SCSI_PORT_MAX_NAME_LENGTH */
3558b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(rc < 0);
3568b0f2ad4SDaniel Verkamp }
3578b0f2ad4SDaniel Verkamp
3588b0f2ad4SDaniel Verkamp static void
dev_add_port_construct_failure2(void)35975af8a10SShuhei Matsumoto dev_add_port_construct_failure2(void)
36075af8a10SShuhei Matsumoto {
36175af8a10SShuhei Matsumoto struct spdk_scsi_dev dev = { 0 };
36275af8a10SShuhei Matsumoto const char *name;
36375af8a10SShuhei Matsumoto uint64_t id;
36475af8a10SShuhei Matsumoto int rc;
36575af8a10SShuhei Matsumoto
36675af8a10SShuhei Matsumoto dev.num_ports = 1;
36775af8a10SShuhei Matsumoto name = "Name of Port";
36875af8a10SShuhei Matsumoto id = 1;
36975af8a10SShuhei Matsumoto
37075af8a10SShuhei Matsumoto /* Initialize port[0] to be valid and its index is set to 1 */
37175af8a10SShuhei Matsumoto dev.port[0].id = id;
37275af8a10SShuhei Matsumoto dev.port[0].is_used = 1;
37375af8a10SShuhei Matsumoto
37475af8a10SShuhei Matsumoto rc = spdk_scsi_dev_add_port(&dev, id, name);
37575af8a10SShuhei Matsumoto
37675af8a10SShuhei Matsumoto /* returns -1; since the dev already has a port whose index to be 1 */
37775af8a10SShuhei Matsumoto CU_ASSERT_TRUE(rc < 0);
37875af8a10SShuhei Matsumoto }
37975af8a10SShuhei Matsumoto
38075af8a10SShuhei Matsumoto static void
dev_add_port_success1(void)38175af8a10SShuhei Matsumoto dev_add_port_success1(void)
3828b0f2ad4SDaniel Verkamp {
3838b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
3848b0f2ad4SDaniel Verkamp const char *name;
3858b0f2ad4SDaniel Verkamp int id, rc;
3868b0f2ad4SDaniel Verkamp
3878b0f2ad4SDaniel Verkamp dev.num_ports = 1;
3888b0f2ad4SDaniel Verkamp name = "Name of Port";
3898b0f2ad4SDaniel Verkamp id = 1;
3908b0f2ad4SDaniel Verkamp
3918b0f2ad4SDaniel Verkamp rc = spdk_scsi_dev_add_port(&dev, id, name);
3928b0f2ad4SDaniel Verkamp
3938b0f2ad4SDaniel Verkamp /* successfully adds a port */
3948b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
3958b0f2ad4SDaniel Verkamp /* Assert num_ports has been incremented to 2 */
3968b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(dev.num_ports, 2);
3978b0f2ad4SDaniel Verkamp }
3988b0f2ad4SDaniel Verkamp
3998b0f2ad4SDaniel Verkamp static void
dev_add_port_success2(void)40075af8a10SShuhei Matsumoto dev_add_port_success2(void)
40175af8a10SShuhei Matsumoto {
40275af8a10SShuhei Matsumoto struct spdk_scsi_dev dev = { 0 };
40375af8a10SShuhei Matsumoto const char *name;
40475af8a10SShuhei Matsumoto uint64_t id;
40575af8a10SShuhei Matsumoto int rc;
40675af8a10SShuhei Matsumoto
40775af8a10SShuhei Matsumoto dev.num_ports = 1;
40875af8a10SShuhei Matsumoto name = "Name of Port";
40975af8a10SShuhei Matsumoto id = 1;
41075af8a10SShuhei Matsumoto /* set id of invalid port[0] to 1. This must be ignored */
41175af8a10SShuhei Matsumoto dev.port[0].id = id;
41275af8a10SShuhei Matsumoto dev.port[0].is_used = 0;
41375af8a10SShuhei Matsumoto
41475af8a10SShuhei Matsumoto rc = spdk_scsi_dev_add_port(&dev, id, name);
41575af8a10SShuhei Matsumoto
41675af8a10SShuhei Matsumoto /* successfully adds a port */
41775af8a10SShuhei Matsumoto CU_ASSERT_EQUAL(rc, 0);
41875af8a10SShuhei Matsumoto /* Assert num_ports has been incremented to 1 */
41975af8a10SShuhei Matsumoto CU_ASSERT_EQUAL(dev.num_ports, 2);
42075af8a10SShuhei Matsumoto }
42175af8a10SShuhei Matsumoto
42275af8a10SShuhei Matsumoto static void
dev_add_port_success3(void)42375af8a10SShuhei Matsumoto dev_add_port_success3(void)
42475af8a10SShuhei Matsumoto {
42575af8a10SShuhei Matsumoto struct spdk_scsi_dev dev = { 0 };
42675af8a10SShuhei Matsumoto const char *name;
42775af8a10SShuhei Matsumoto uint64_t add_id;
42875af8a10SShuhei Matsumoto int rc;
42975af8a10SShuhei Matsumoto
43075af8a10SShuhei Matsumoto dev.num_ports = 1;
43175af8a10SShuhei Matsumoto name = "Name of Port";
43275af8a10SShuhei Matsumoto dev.port[0].id = 1;
43375af8a10SShuhei Matsumoto dev.port[0].is_used = 1;
43475af8a10SShuhei Matsumoto add_id = 2;
43575af8a10SShuhei Matsumoto
43675af8a10SShuhei Matsumoto /* Add a port with id = 2 */
43775af8a10SShuhei Matsumoto rc = spdk_scsi_dev_add_port(&dev, add_id, name);
43875af8a10SShuhei Matsumoto
43975af8a10SShuhei Matsumoto /* successfully adds a port */
44075af8a10SShuhei Matsumoto CU_ASSERT_EQUAL(rc, 0);
44175af8a10SShuhei Matsumoto /* Assert num_ports has been incremented to 2 */
44275af8a10SShuhei Matsumoto CU_ASSERT_EQUAL(dev.num_ports, 2);
44375af8a10SShuhei Matsumoto }
44475af8a10SShuhei Matsumoto
44575af8a10SShuhei Matsumoto static void
dev_find_port_by_id_num_ports_zero(void)4468b0f2ad4SDaniel Verkamp dev_find_port_by_id_num_ports_zero(void)
4478b0f2ad4SDaniel Verkamp {
4488b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
4498b0f2ad4SDaniel Verkamp struct spdk_scsi_port *rp_port;
4508b0f2ad4SDaniel Verkamp uint64_t id;
4518b0f2ad4SDaniel Verkamp
4528b0f2ad4SDaniel Verkamp dev.num_ports = 0;
4538b0f2ad4SDaniel Verkamp id = 1;
4548b0f2ad4SDaniel Verkamp
4558b0f2ad4SDaniel Verkamp rp_port = spdk_scsi_dev_find_port_by_id(&dev, id);
4568b0f2ad4SDaniel Verkamp
4578b0f2ad4SDaniel Verkamp /* returns null; since dev's num_ports is 0 */
4588b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(rp_port == NULL);
4598b0f2ad4SDaniel Verkamp }
4608b0f2ad4SDaniel Verkamp
4618b0f2ad4SDaniel Verkamp static void
dev_find_port_by_id_id_not_found_failure(void)4628b0f2ad4SDaniel Verkamp dev_find_port_by_id_id_not_found_failure(void)
4638b0f2ad4SDaniel Verkamp {
4648b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
4658b0f2ad4SDaniel Verkamp struct spdk_scsi_port *rp_port;
4668b0f2ad4SDaniel Verkamp const char *name;
4678b0f2ad4SDaniel Verkamp int rc;
4688b0f2ad4SDaniel Verkamp uint64_t id, find_id;
4698b0f2ad4SDaniel Verkamp
4708b0f2ad4SDaniel Verkamp id = 1;
4718b0f2ad4SDaniel Verkamp dev.num_ports = 1;
4728b0f2ad4SDaniel Verkamp name = "Name of Port";
4738b0f2ad4SDaniel Verkamp find_id = 2;
4748b0f2ad4SDaniel Verkamp
4758b0f2ad4SDaniel Verkamp /* Add a port with id = 1 */
4768b0f2ad4SDaniel Verkamp rc = spdk_scsi_dev_add_port(&dev, id, name);
4778b0f2ad4SDaniel Verkamp
4788b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
4798b0f2ad4SDaniel Verkamp
4808b0f2ad4SDaniel Verkamp /* Find port with id = 2 */
4818b0f2ad4SDaniel Verkamp rp_port = spdk_scsi_dev_find_port_by_id(&dev, find_id);
4828b0f2ad4SDaniel Verkamp
4838b0f2ad4SDaniel Verkamp /* returns null; failed to find port specified by id = 2 */
4848b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(rp_port == NULL);
4858b0f2ad4SDaniel Verkamp }
4868b0f2ad4SDaniel Verkamp
4878b0f2ad4SDaniel Verkamp static void
dev_find_port_by_id_success(void)4888b0f2ad4SDaniel Verkamp dev_find_port_by_id_success(void)
4898b0f2ad4SDaniel Verkamp {
4908b0f2ad4SDaniel Verkamp struct spdk_scsi_dev dev = { 0 };
4918b0f2ad4SDaniel Verkamp struct spdk_scsi_port *rp_port;
4928b0f2ad4SDaniel Verkamp const char *name;
4938b0f2ad4SDaniel Verkamp int rc;
4948b0f2ad4SDaniel Verkamp uint64_t id;
4958b0f2ad4SDaniel Verkamp
4968b0f2ad4SDaniel Verkamp id = 1;
4978b0f2ad4SDaniel Verkamp dev.num_ports = 1;
4988b0f2ad4SDaniel Verkamp name = "Name of Port";
4998b0f2ad4SDaniel Verkamp
5008b0f2ad4SDaniel Verkamp /* Add a port */
5018b0f2ad4SDaniel Verkamp rc = spdk_scsi_dev_add_port(&dev, id, name);
5028b0f2ad4SDaniel Verkamp
5038b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(rc, 0);
5048b0f2ad4SDaniel Verkamp
5058b0f2ad4SDaniel Verkamp /* Find port by the same id as the one added above */
5068b0f2ad4SDaniel Verkamp rp_port = spdk_scsi_dev_find_port_by_id(&dev, id);
5078b0f2ad4SDaniel Verkamp
5088b0f2ad4SDaniel Verkamp /* Successfully found port specified by id */
5098b0f2ad4SDaniel Verkamp CU_ASSERT_TRUE(rp_port != NULL);
5108b0f2ad4SDaniel Verkamp if (rp_port != NULL) {
5118b0f2ad4SDaniel Verkamp /* Assert the found port's id and name are same as
5128b0f2ad4SDaniel Verkamp * the port added. */
5138b0f2ad4SDaniel Verkamp CU_ASSERT_EQUAL(rp_port->id, 1);
5148b0f2ad4SDaniel Verkamp CU_ASSERT_STRING_EQUAL(rp_port->name, "Name of Port");
5158b0f2ad4SDaniel Verkamp }
5168b0f2ad4SDaniel Verkamp }
5178b0f2ad4SDaniel Verkamp
5183b3c6002SShuhei Matsumoto static void
dev_add_lun_bdev_not_found(void)5193b3c6002SShuhei Matsumoto dev_add_lun_bdev_not_found(void)
5203b3c6002SShuhei Matsumoto {
5213b3c6002SShuhei Matsumoto int rc;
5224265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = { .luns = TAILQ_HEAD_INITIALIZER(dev.luns), };
5233b3c6002SShuhei Matsumoto
524f61d81e4SShuhei Matsumoto rc = spdk_scsi_dev_add_lun(&dev, "malloc3", 0, NULL, NULL);
5253b3c6002SShuhei Matsumoto
5264265fc50SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&dev.luns));
5273b3c6002SShuhei Matsumoto CU_ASSERT_NOT_EQUAL(rc, 0);
5283b3c6002SShuhei Matsumoto }
5293b3c6002SShuhei Matsumoto
5303b3c6002SShuhei Matsumoto static void
dev_add_lun_no_free_lun_id(void)5313b3c6002SShuhei Matsumoto dev_add_lun_no_free_lun_id(void)
5323b3c6002SShuhei Matsumoto {
5333b3c6002SShuhei Matsumoto int rc;
5343b3c6002SShuhei Matsumoto int i;
5354265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = { .luns = TAILQ_HEAD_INITIALIZER(dev.luns), };
5365e877275SShuhei Matsumoto struct spdk_scsi_lun *lun;
5375e877275SShuhei Matsumoto
5385e877275SShuhei Matsumoto lun = calloc(SPDK_SCSI_DEV_MAX_LUN, sizeof(*lun));
5395e877275SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(lun != NULL);
5403b3c6002SShuhei Matsumoto
5413b3c6002SShuhei Matsumoto for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) {
5424265fc50SShuhei Matsumoto lun[i].id = i;
5434265fc50SShuhei Matsumoto TAILQ_INSERT_TAIL(&dev.luns, &lun[i], tailq);
5443b3c6002SShuhei Matsumoto }
5453b3c6002SShuhei Matsumoto
5463b3c6002SShuhei Matsumoto rc = spdk_scsi_dev_add_lun(&dev, "malloc0", -1, NULL, NULL);
5473b3c6002SShuhei Matsumoto
5483b3c6002SShuhei Matsumoto CU_ASSERT_NOT_EQUAL(rc, 0);
5495e877275SShuhei Matsumoto
5505e877275SShuhei Matsumoto free(lun);
5513b3c6002SShuhei Matsumoto }
5523b3c6002SShuhei Matsumoto
5533b3c6002SShuhei Matsumoto static void
dev_add_lun_success1(void)5543b3c6002SShuhei Matsumoto dev_add_lun_success1(void)
5553b3c6002SShuhei Matsumoto {
5563b3c6002SShuhei Matsumoto int rc;
5574265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = { .luns = TAILQ_HEAD_INITIALIZER(dev.luns), };
5583b3c6002SShuhei Matsumoto
5593b3c6002SShuhei Matsumoto rc = spdk_scsi_dev_add_lun(&dev, "malloc0", -1, NULL, NULL);
5603b3c6002SShuhei Matsumoto
5613b3c6002SShuhei Matsumoto CU_ASSERT_EQUAL(rc, 0);
5623b3c6002SShuhei Matsumoto
56356d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(&dev, NULL, NULL);
5643b3c6002SShuhei Matsumoto }
5653b3c6002SShuhei Matsumoto
5663b3c6002SShuhei Matsumoto static void
dev_add_lun_success2(void)5673b3c6002SShuhei Matsumoto dev_add_lun_success2(void)
5683b3c6002SShuhei Matsumoto {
5693b3c6002SShuhei Matsumoto int rc;
5704265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = { .luns = TAILQ_HEAD_INITIALIZER(dev.luns), };
5713b3c6002SShuhei Matsumoto
5723b3c6002SShuhei Matsumoto rc = spdk_scsi_dev_add_lun(&dev, "malloc0", 0, NULL, NULL);
5733b3c6002SShuhei Matsumoto
5743b3c6002SShuhei Matsumoto CU_ASSERT_EQUAL(rc, 0);
5753b3c6002SShuhei Matsumoto
57656d8b785SShuhei Matsumoto spdk_scsi_dev_destruct(&dev, NULL, NULL);
5773b3c6002SShuhei Matsumoto }
5783b3c6002SShuhei Matsumoto
5791dc9a762SShuhei Matsumoto static void
dev_check_pending_tasks(void)5801dc9a762SShuhei Matsumoto dev_check_pending_tasks(void)
5811dc9a762SShuhei Matsumoto {
5824265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = { .luns = TAILQ_HEAD_INITIALIZER(dev.luns), };
5834265fc50SShuhei Matsumoto struct spdk_scsi_lun lun = { .id = SPDK_SCSI_DEV_MAX_LUN - 1, };
5841dc9a762SShuhei Matsumoto struct spdk_scsi_port initiator_port = {};
5851dc9a762SShuhei Matsumoto
5861dc9a762SShuhei Matsumoto g_initiator_port_with_pending_tasks = NULL;
5871dc9a762SShuhei Matsumoto g_initiator_port_with_pending_mgmt_tasks = NULL;
5881dc9a762SShuhei Matsumoto
5891dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == false);
5901dc9a762SShuhei Matsumoto
5914265fc50SShuhei Matsumoto TAILQ_INSERT_TAIL(&dev.luns, &lun, tailq);
5921dc9a762SShuhei Matsumoto
5931dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == true);
5941dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, &initiator_port) == false);
5951dc9a762SShuhei Matsumoto
5961dc9a762SShuhei Matsumoto g_initiator_port_with_pending_tasks = &initiator_port;
5971dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == true);
5981dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, &initiator_port) == true);
5991dc9a762SShuhei Matsumoto
6001dc9a762SShuhei Matsumoto g_initiator_port_with_pending_tasks = NULL;
6011dc9a762SShuhei Matsumoto g_initiator_port_with_pending_mgmt_tasks = &initiator_port;
6021dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, NULL) == true);
6031dc9a762SShuhei Matsumoto CU_ASSERT(spdk_scsi_dev_has_pending_tasks(&dev, &initiator_port) == true);
6041dc9a762SShuhei Matsumoto }
6051dc9a762SShuhei Matsumoto
606f61d81e4SShuhei Matsumoto static void
dev_iterate_luns(void)607f61d81e4SShuhei Matsumoto dev_iterate_luns(void)
608f61d81e4SShuhei Matsumoto {
609f61d81e4SShuhei Matsumoto struct spdk_scsi_dev *dev;
610f61d81e4SShuhei Matsumoto struct spdk_scsi_lun *lun;
611f61d81e4SShuhei Matsumoto const char *bdev_name_list[3] = {"malloc0", "malloc2", "malloc4"};
612f61d81e4SShuhei Matsumoto int lun_id_list[3] = {0, 2, 4};
613f61d81e4SShuhei Matsumoto
614f61d81e4SShuhei Matsumoto dev = spdk_scsi_dev_construct("Name", bdev_name_list, lun_id_list, 3,
615f61d81e4SShuhei Matsumoto SPDK_SPC_PROTOCOL_IDENTIFIER_ISCSI, NULL, NULL);
616f61d81e4SShuhei Matsumoto
617f61d81e4SShuhei Matsumoto /* Successfully constructs and returns a dev */
618f61d81e4SShuhei Matsumoto CU_ASSERT_TRUE(dev != NULL);
619f61d81e4SShuhei Matsumoto
620f61d81e4SShuhei Matsumoto lun = spdk_scsi_dev_get_first_lun(dev);
621f61d81e4SShuhei Matsumoto CU_ASSERT(lun != NULL);
622f61d81e4SShuhei Matsumoto CU_ASSERT(lun->id == 0);
623f61d81e4SShuhei Matsumoto lun = spdk_scsi_dev_get_next_lun(lun);
624f61d81e4SShuhei Matsumoto CU_ASSERT(lun != NULL);
625f61d81e4SShuhei Matsumoto CU_ASSERT(lun->id == 2);
626f61d81e4SShuhei Matsumoto lun = spdk_scsi_dev_get_next_lun(lun);
627f61d81e4SShuhei Matsumoto CU_ASSERT(lun != NULL);
628f61d81e4SShuhei Matsumoto CU_ASSERT(lun->id == 4);
629f61d81e4SShuhei Matsumoto lun = spdk_scsi_dev_get_next_lun(lun);
630f61d81e4SShuhei Matsumoto CU_ASSERT(lun == NULL);
631f61d81e4SShuhei Matsumoto
632f61d81e4SShuhei Matsumoto /* free the dev */
633f61d81e4SShuhei Matsumoto spdk_scsi_dev_destruct(dev, NULL, NULL);
634f61d81e4SShuhei Matsumoto }
635f61d81e4SShuhei Matsumoto
6364265fc50SShuhei Matsumoto static void
dev_find_free_lun(void)6374265fc50SShuhei Matsumoto dev_find_free_lun(void)
6384265fc50SShuhei Matsumoto {
6394265fc50SShuhei Matsumoto struct spdk_scsi_dev dev = { .luns = TAILQ_HEAD_INITIALIZER(dev.luns), };
64015535803SJim Harris struct spdk_scsi_lun *lun, *prev_lun = NULL;
6414265fc50SShuhei Matsumoto int i, rc;
6424265fc50SShuhei Matsumoto
6434265fc50SShuhei Matsumoto lun = calloc(SPDK_SCSI_DEV_MAX_LUN, sizeof(*lun));
6444265fc50SShuhei Matsumoto SPDK_CU_ASSERT_FATAL(lun != NULL);
6454265fc50SShuhei Matsumoto
6464265fc50SShuhei Matsumoto for (i = 0; i < SPDK_SCSI_DEV_MAX_LUN; i++) {
6474265fc50SShuhei Matsumoto lun[i].id = i;
6484265fc50SShuhei Matsumoto }
6494265fc50SShuhei Matsumoto
6504265fc50SShuhei Matsumoto /* LUN ID 0, 1, 15, 16, 17, SPDK_SCSI_DEV_MAX_LUN - 2, and SPDK_SCSI_DEV_MAX_LUN - 1
6514265fc50SShuhei Matsumoto * are free first. LUNs are required to be sorted by LUN ID.
6524265fc50SShuhei Matsumoto */
6534265fc50SShuhei Matsumoto for (i = 2; i < 15; i++) {
6544265fc50SShuhei Matsumoto TAILQ_INSERT_TAIL(&dev.luns, &lun[i], tailq);
6554265fc50SShuhei Matsumoto }
6564265fc50SShuhei Matsumoto
6574265fc50SShuhei Matsumoto for (i = 18; i < SPDK_SCSI_DEV_MAX_LUN - 2; i++) {
6584265fc50SShuhei Matsumoto TAILQ_INSERT_TAIL(&dev.luns, &lun[i], tailq);
6594265fc50SShuhei Matsumoto }
6604265fc50SShuhei Matsumoto
6614265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
6624265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
6634265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == NULL);
6644265fc50SShuhei Matsumoto
6654265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 0, &prev_lun);
6664265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
6674265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == NULL);
6684265fc50SShuhei Matsumoto
6694265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 1, &prev_lun);
6704265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
6714265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == NULL);
6724265fc50SShuhei Matsumoto
6734265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 2, &prev_lun);
6744265fc50SShuhei Matsumoto CU_ASSERT(rc == -EEXIST);
6754265fc50SShuhei Matsumoto
6764265fc50SShuhei Matsumoto TAILQ_INSERT_HEAD(&dev.luns, &lun[0], tailq);
6774265fc50SShuhei Matsumoto
6784265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 0, &prev_lun);
6794265fc50SShuhei Matsumoto CU_ASSERT(rc == -EEXIST);
6804265fc50SShuhei Matsumoto
6814265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
6824265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
6834265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[0]);
6844265fc50SShuhei Matsumoto prev_lun = NULL;
6854265fc50SShuhei Matsumoto
6864265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 1, &prev_lun);
6874265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
6884265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[0]);
6894265fc50SShuhei Matsumoto prev_lun = NULL;
6904265fc50SShuhei Matsumoto
6914265fc50SShuhei Matsumoto TAILQ_INSERT_AFTER(&dev.luns, &lun[0], &lun[1], tailq);
6924265fc50SShuhei Matsumoto
6934265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 1, &prev_lun);
6944265fc50SShuhei Matsumoto CU_ASSERT(rc == -EEXIST);
6954265fc50SShuhei Matsumoto
6964265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
6974265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
6984265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[14]);
6994265fc50SShuhei Matsumoto prev_lun = NULL;
7004265fc50SShuhei Matsumoto
7014265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 15, &prev_lun);
7024265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7034265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[14]);
7044265fc50SShuhei Matsumoto prev_lun = NULL;
7054265fc50SShuhei Matsumoto
7064265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 16, &prev_lun);
7074265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7084265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[14]);
7094265fc50SShuhei Matsumoto prev_lun = NULL;
7104265fc50SShuhei Matsumoto
7114265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 17, &prev_lun);
7124265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7134265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[14]);
7144265fc50SShuhei Matsumoto prev_lun = NULL;
7154265fc50SShuhei Matsumoto
7164265fc50SShuhei Matsumoto TAILQ_INSERT_AFTER(&dev.luns, &lun[14], &lun[15], tailq);
7174265fc50SShuhei Matsumoto TAILQ_INSERT_AFTER(&dev.luns, &lun[15], &lun[16], tailq);
7184265fc50SShuhei Matsumoto TAILQ_INSERT_AFTER(&dev.luns, &lun[16], &lun[17], tailq);
7194265fc50SShuhei Matsumoto
7204265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 15, &prev_lun);
7214265fc50SShuhei Matsumoto CU_ASSERT(rc == -EEXIST);
7224265fc50SShuhei Matsumoto
7234265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 16, &prev_lun);
7244265fc50SShuhei Matsumoto CU_ASSERT(rc == -EEXIST);
7254265fc50SShuhei Matsumoto
7264265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 17, &prev_lun);
7274265fc50SShuhei Matsumoto CU_ASSERT(rc == -EEXIST);
7284265fc50SShuhei Matsumoto
7294265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
7304265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7314265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[SPDK_SCSI_DEV_MAX_LUN - 3]);
7324265fc50SShuhei Matsumoto prev_lun = NULL;
7334265fc50SShuhei Matsumoto
7344265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, SPDK_SCSI_DEV_MAX_LUN - 2, &prev_lun);
7354265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7364265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[SPDK_SCSI_DEV_MAX_LUN - 3]);
7374265fc50SShuhei Matsumoto prev_lun = NULL;
7384265fc50SShuhei Matsumoto
7394265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, SPDK_SCSI_DEV_MAX_LUN - 1, &prev_lun);
7404265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7414265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[SPDK_SCSI_DEV_MAX_LUN - 3]);
7424265fc50SShuhei Matsumoto prev_lun = NULL;
7434265fc50SShuhei Matsumoto
7444265fc50SShuhei Matsumoto TAILQ_INSERT_AFTER(&dev.luns, &lun[SPDK_SCSI_DEV_MAX_LUN - 3],
7454265fc50SShuhei Matsumoto &lun[SPDK_SCSI_DEV_MAX_LUN - 1], tailq);
7464265fc50SShuhei Matsumoto
7474265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
7484265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7494265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[SPDK_SCSI_DEV_MAX_LUN - 3]);
7504265fc50SShuhei Matsumoto prev_lun = NULL;
7514265fc50SShuhei Matsumoto
7524265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, SPDK_SCSI_DEV_MAX_LUN - 2, &prev_lun);
7534265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7544265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[SPDK_SCSI_DEV_MAX_LUN - 3]);
7554265fc50SShuhei Matsumoto prev_lun = NULL;
7564265fc50SShuhei Matsumoto
7574265fc50SShuhei Matsumoto TAILQ_INSERT_AFTER(&dev.luns, &lun[SPDK_SCSI_DEV_MAX_LUN - 3],
7584265fc50SShuhei Matsumoto &lun[SPDK_SCSI_DEV_MAX_LUN - 2], tailq);
7594265fc50SShuhei Matsumoto
7604265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
7614265fc50SShuhei Matsumoto CU_ASSERT(rc == -ENOSPC);
7624265fc50SShuhei Matsumoto
7634265fc50SShuhei Matsumoto /* LUN ID 20 and 21 were freed. */
7644265fc50SShuhei Matsumoto TAILQ_REMOVE(&dev.luns, &lun[20], tailq);
7654265fc50SShuhei Matsumoto TAILQ_REMOVE(&dev.luns, &lun[21], tailq);
7664265fc50SShuhei Matsumoto
7674265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, -1, &prev_lun);
7684265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7694265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[19]);
7704265fc50SShuhei Matsumoto prev_lun = NULL;
7714265fc50SShuhei Matsumoto
7724265fc50SShuhei Matsumoto rc = scsi_dev_find_free_lun(&dev, 21, &prev_lun);
7734265fc50SShuhei Matsumoto CU_ASSERT(rc == 0);
7744265fc50SShuhei Matsumoto CU_ASSERT(prev_lun == &lun[19]);
7754265fc50SShuhei Matsumoto prev_lun = NULL;
7764265fc50SShuhei Matsumoto
7774265fc50SShuhei Matsumoto free(lun);
7784265fc50SShuhei Matsumoto }
7794265fc50SShuhei Matsumoto
7808b0f2ad4SDaniel Verkamp int
main(int argc,char ** argv)7818b0f2ad4SDaniel Verkamp main(int argc, char **argv)
7828b0f2ad4SDaniel Verkamp {
7838b0f2ad4SDaniel Verkamp CU_pSuite suite = NULL;
7848b0f2ad4SDaniel Verkamp unsigned int num_failures;
7858b0f2ad4SDaniel Verkamp
78678b696bcSVitaliy Mysak CU_initialize_registry();
7878b0f2ad4SDaniel Verkamp
788583e9699SShuhei Matsumoto suite = CU_add_suite("dev_suite", NULL, NULL);
7898b0f2ad4SDaniel Verkamp
790dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_destruct_null_dev);
791dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_destruct_zero_luns);
792dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_destruct_null_lun);
793dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_destruct_success);
794dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_construct_num_luns_zero);
795dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_construct_no_lun_zero);
796dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_construct_null_lun);
797dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_construct_name_too_long);
798dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_construct_success);
799dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_construct_success_lun_zero_not_first);
800dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_queue_mgmt_task_success);
801dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_queue_task_success);
802dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_stop_success);
803dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_port_max_ports);
804dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_port_construct_failure1);
805dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_port_construct_failure2);
806dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_port_success1);
807dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_port_success2);
808dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_port_success3);
809dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_find_port_by_id_num_ports_zero);
810dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_find_port_by_id_id_not_found_failure);
811dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_find_port_by_id_success);
812dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_lun_bdev_not_found);
813dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_lun_no_free_lun_id);
814dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_lun_success1);
815dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_add_lun_success2);
816dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, dev_check_pending_tasks);
817f61d81e4SShuhei Matsumoto CU_ADD_TEST(suite, dev_iterate_luns);
8184265fc50SShuhei Matsumoto CU_ADD_TEST(suite, dev_find_free_lun);
8198b0f2ad4SDaniel Verkamp
820*ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
8218b0f2ad4SDaniel Verkamp CU_cleanup_registry();
8228b0f2ad4SDaniel Verkamp
8238b0f2ad4SDaniel Verkamp return num_failures;
8248b0f2ad4SDaniel Verkamp }
825