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 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 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 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 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