xref: /illumos-gate/usr/src/test/nvme-tests/tests/libnvme/bad-req-nsmgmt.c (revision f5f0964ce91892f7482efc86903b0ec7c7b6ba66)
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