1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2025 Oxide Computer Company
14 */
15
16 /*
17 * Variant of the bad-req.c tests that covers items that require namespace
18 * management support.
19 */
20
21 #include <err.h>
22 #include <umem.h>
23
24 #include "libnvme_test_common.h"
25
26 static bool
bad_ns_attach_req(nvme_ctrl_t * ctrl,nvme_ns_attach_req_t ** reqp,uint32_t sel,nvme_err_t exp_err,const char * desc)27 bad_ns_attach_req(nvme_ctrl_t *ctrl, nvme_ns_attach_req_t **reqp, uint32_t sel,
28 nvme_err_t exp_err, const char *desc)
29 {
30 if (nvme_ns_attach_req_init_by_sel(ctrl, sel, reqp)) {
31 warnx("TEST FAILED: nvme_ns_attach_req_init_by_sel() "
32 "erroneously passed despite %s", desc);
33 nvme_ns_attach_req_fini(*reqp);
34 return (false);
35 } else if (nvme_ctrl_err(ctrl) != exp_err) {
36 warnx("TEST FAILED: nvme_ns_attach_req_init_by_sel() returned "
37 "wrong error %s (0x%x), not %s (0x%x)",
38 nvme_ctrl_errtostr(ctrl, nvme_ctrl_err(ctrl)),
39 nvme_ctrl_err(ctrl), nvme_ctrl_errtostr(ctrl,
40 exp_err), exp_err);
41 return (false);
42 } else {
43 (void) printf("TEST PASSED: nvme_ns_attach_req_init_by_sel() "
44 "correctly failed for %s\n", desc);
45 return (true);
46 }
47 }
48
49 static bool
bad_ns_create_req(nvme_ctrl_t * ctrl,nvme_ns_create_req_t ** reqp,uint32_t csi,nvme_err_t exp_err,const char * desc)50 bad_ns_create_req(nvme_ctrl_t *ctrl, nvme_ns_create_req_t **reqp, uint32_t csi,
51 nvme_err_t exp_err, const char *desc)
52 {
53 if (nvme_ns_create_req_init_by_csi(ctrl, csi, reqp)) {
54 warnx("TEST FAILED: nvme_ns_create_req_init_by_csi() "
55 "erroneously passed despite %s", desc);
56 nvme_ns_create_req_fini(*reqp);
57 return (false);
58 } else if (nvme_ctrl_err(ctrl) != exp_err) {
59 warnx("TEST FAILED: nvme_ns_create_req_init_by_csi() returned "
60 "wrong error %s (0x%x), not %s (0x%x)",
61 nvme_ctrl_errtostr(ctrl, nvme_ctrl_err(ctrl)),
62 nvme_ctrl_err(ctrl), nvme_ctrl_errtostr(ctrl,
63 exp_err), exp_err);
64 return (false);
65 } else {
66 (void) printf("TEST PASSED: nvme_ns_create_req_init_by_csi() "
67 "correctly failed for %s\n", desc);
68 return (true);
69 }
70 }
71
72 static bool
bad_ns_delete_req(nvme_ctrl_t * ctrl,nvme_ns_delete_req_t ** reqp,nvme_err_t exp_err,const char * desc)73 bad_ns_delete_req(nvme_ctrl_t *ctrl, nvme_ns_delete_req_t **reqp,
74 nvme_err_t exp_err, const char *desc)
75 {
76 if (nvme_ns_delete_req_init(ctrl, reqp)) {
77 warnx("TEST FAILED: nvme_ns_delete_req_init() "
78 "erroneously passed despite %s", desc);
79 nvme_ns_delete_req_fini(*reqp);
80 return (false);
81 } else if (nvme_ctrl_err(ctrl) != exp_err) {
82 warnx("TEST FAILED: nvme_ns_delete_req_init() returned "
83 "wrong error %s (0x%x), not %s (0x%x)",
84 nvme_ctrl_errtostr(ctrl, nvme_ctrl_err(ctrl)),
85 nvme_ctrl_err(ctrl), nvme_ctrl_errtostr(ctrl,
86 exp_err), exp_err);
87 return (false);
88 } else {
89 (void) printf("TEST PASSED: nvme_ns_delete_req_init() "
90 "correctly failed for %s\n", desc);
91 return (true);
92 }
93 }
94
95 int
main(void)96 main(void)
97 {
98 int ret = EXIT_SUCCESS;
99 nvme_t *nvme;
100 nvme_ctrl_t *ctrl;
101 nvme_ns_attach_req_t *ns_attach_req;
102 nvme_ns_create_req_t *ns_create_req;
103 nvme_ns_delete_req_t *ns_delete_req;
104
105 libnvme_test_init(&nvme, &ctrl);
106
107 if (!bad_ns_attach_req(ctrl, &ns_attach_req, UINT32_MAX,
108 NVME_ERR_NS_ATTACH_BAD_SEL, "invalid sel value")) {
109 ret = EXIT_FAILURE;
110 }
111
112 if (!bad_ns_attach_req(ctrl, NULL, NVME_NS_ATTACH_CTRL_ATTACH,
113 NVME_ERR_BAD_PTR, "invalid req pointer")) {
114 ret = EXIT_FAILURE;
115 }
116
117 if (!bad_ns_create_req(ctrl, &ns_create_req, UINT32_MAX,
118 NVME_ERR_NS_CREATE_BAD_CSI, "invalid csi value")) {
119 ret = EXIT_FAILURE;
120 }
121
122 if (!bad_ns_create_req(ctrl, NULL, NVME_CSI_NVM, NVME_ERR_BAD_PTR,
123 "invalid req pointer")) {
124 ret = EXIT_FAILURE;
125 }
126
127 umem_setmtbf(1);
128
129 if (!bad_ns_attach_req(ctrl, &ns_attach_req, NVME_NS_ATTACH_CTRL_ATTACH,
130 NVME_ERR_NO_MEM, "no memory")) {
131 ret = EXIT_FAILURE;
132 }
133
134 if (!bad_ns_create_req(ctrl, &ns_create_req, NVME_CSI_NVM,
135 NVME_ERR_NO_MEM, "no memory")) {
136 ret = EXIT_FAILURE;
137 }
138
139 if (!bad_ns_delete_req(ctrl, &ns_delete_req, NVME_ERR_NO_MEM,
140 "no memory")) {
141 ret = EXIT_FAILURE;
142 }
143
144 umem_setmtbf(0);
145
146 if (ret == EXIT_SUCCESS) {
147 (void) printf("All tests passed successfully\n");
148 }
149
150 nvme_ctrl_fini(ctrl);
151 nvme_fini(nvme);
152 return (ret);
153 }
154