1*533affcbSRobert Mustacchi /*
2*533affcbSRobert Mustacchi * This file and its contents are supplied under the terms of the
3*533affcbSRobert Mustacchi * Common Development and Distribution License ("CDDL"), version 1.0.
4*533affcbSRobert Mustacchi * You may only use this file in accordance with the terms of version
5*533affcbSRobert Mustacchi * 1.0 of the CDDL.
6*533affcbSRobert Mustacchi *
7*533affcbSRobert Mustacchi * A full copy of the text of the CDDL should have accompanied this
8*533affcbSRobert Mustacchi * source. A copy of the CDDL is also available via the Internet at
9*533affcbSRobert Mustacchi * http://www.illumos.org/license/CDDL.
10*533affcbSRobert Mustacchi */
11*533affcbSRobert Mustacchi
12*533affcbSRobert Mustacchi /*
13*533affcbSRobert Mustacchi * Copyright 2024 Oxide Computer Company
14*533affcbSRobert Mustacchi */
15*533affcbSRobert Mustacchi
16*533affcbSRobert Mustacchi /*
17*533affcbSRobert Mustacchi * Namespace information.
18*533affcbSRobert Mustacchi */
19*533affcbSRobert Mustacchi
20*533affcbSRobert Mustacchi #include <string.h>
21*533affcbSRobert Mustacchi #include <stdlib.h>
22*533affcbSRobert Mustacchi #include <stdarg.h>
23*533affcbSRobert Mustacchi
24*533affcbSRobert Mustacchi #include "libnvme_impl.h"
25*533affcbSRobert Mustacchi
26*533affcbSRobert Mustacchi bool
nvme_ns_info_error(nvme_ns_info_t * info,nvme_info_err_t err,int32_t sys,const char * fmt,...)27*533affcbSRobert Mustacchi nvme_ns_info_error(nvme_ns_info_t *info, nvme_info_err_t err, int32_t sys,
28*533affcbSRobert Mustacchi const char *fmt, ...)
29*533affcbSRobert Mustacchi {
30*533affcbSRobert Mustacchi int ret;
31*533affcbSRobert Mustacchi va_list ap;
32*533affcbSRobert Mustacchi
33*533affcbSRobert Mustacchi info->nni_err = err;
34*533affcbSRobert Mustacchi info->nni_syserr = sys;
35*533affcbSRobert Mustacchi va_start(ap, fmt);
36*533affcbSRobert Mustacchi ret = vsnprintf(info->nni_errmsg, sizeof (info->nni_errmsg), fmt, ap);
37*533affcbSRobert Mustacchi va_end(ap);
38*533affcbSRobert Mustacchi if (ret >= sizeof (info->nni_errmsg)) {
39*533affcbSRobert Mustacchi info->nni_errlen = sizeof (info->nni_errmsg) - 1;
40*533affcbSRobert Mustacchi } else if (ret <= 0) {
41*533affcbSRobert Mustacchi info->nni_errlen = 0;
42*533affcbSRobert Mustacchi info->nni_errmsg[0] = '\0';
43*533affcbSRobert Mustacchi } else {
44*533affcbSRobert Mustacchi info->nni_errlen = (size_t)ret;
45*533affcbSRobert Mustacchi }
46*533affcbSRobert Mustacchi
47*533affcbSRobert Mustacchi return (false);
48*533affcbSRobert Mustacchi }
49*533affcbSRobert Mustacchi
50*533affcbSRobert Mustacchi bool
nvme_ns_info_success(nvme_ns_info_t * info)51*533affcbSRobert Mustacchi nvme_ns_info_success(nvme_ns_info_t *info)
52*533affcbSRobert Mustacchi {
53*533affcbSRobert Mustacchi info->nni_err = NVME_INFO_ERR_OK;
54*533affcbSRobert Mustacchi info->nni_syserr = 0;
55*533affcbSRobert Mustacchi info->nni_errmsg[0] = '\0';
56*533affcbSRobert Mustacchi info->nni_errlen = 0;
57*533affcbSRobert Mustacchi
58*533affcbSRobert Mustacchi return (true);
59*533affcbSRobert Mustacchi }
60*533affcbSRobert Mustacchi
61*533affcbSRobert Mustacchi nvme_info_err_t
nvme_ns_info_err(nvme_ns_info_t * info)62*533affcbSRobert Mustacchi nvme_ns_info_err(nvme_ns_info_t *info)
63*533affcbSRobert Mustacchi {
64*533affcbSRobert Mustacchi return (info->nni_err);
65*533affcbSRobert Mustacchi }
66*533affcbSRobert Mustacchi
67*533affcbSRobert Mustacchi int32_t
nvme_ns_info_syserr(nvme_ns_info_t * info)68*533affcbSRobert Mustacchi nvme_ns_info_syserr(nvme_ns_info_t *info)
69*533affcbSRobert Mustacchi {
70*533affcbSRobert Mustacchi return (info->nni_syserr);
71*533affcbSRobert Mustacchi }
72*533affcbSRobert Mustacchi
73*533affcbSRobert Mustacchi const char *
nvme_ns_info_errmsg(nvme_ns_info_t * info)74*533affcbSRobert Mustacchi nvme_ns_info_errmsg(nvme_ns_info_t *info)
75*533affcbSRobert Mustacchi {
76*533affcbSRobert Mustacchi return (info->nni_errmsg);
77*533affcbSRobert Mustacchi }
78*533affcbSRobert Mustacchi
79*533affcbSRobert Mustacchi size_t
nvme_ns_info_errlen(nvme_ns_info_t * info)80*533affcbSRobert Mustacchi nvme_ns_info_errlen(nvme_ns_info_t *info)
81*533affcbSRobert Mustacchi {
82*533affcbSRobert Mustacchi return (info->nni_errlen);
83*533affcbSRobert Mustacchi }
84*533affcbSRobert Mustacchi
85*533affcbSRobert Mustacchi const char *
nvme_ns_info_errtostr(nvme_ns_info_t * info,nvme_info_err_t err)86*533affcbSRobert Mustacchi nvme_ns_info_errtostr(nvme_ns_info_t *info, nvme_info_err_t err)
87*533affcbSRobert Mustacchi {
88*533affcbSRobert Mustacchi return (nvme_ctrl_info_errtostr(NULL, err));
89*533affcbSRobert Mustacchi }
90*533affcbSRobert Mustacchi
91*533affcbSRobert Mustacchi void
nvme_ns_info_free(nvme_ns_info_t * info)92*533affcbSRobert Mustacchi nvme_ns_info_free(nvme_ns_info_t *info)
93*533affcbSRobert Mustacchi {
94*533affcbSRobert Mustacchi free(info);
95*533affcbSRobert Mustacchi }
96*533affcbSRobert Mustacchi
97*533affcbSRobert Mustacchi bool
nvme_ns_info_snap(nvme_ns_t * ns,nvme_ns_info_t ** infop)98*533affcbSRobert Mustacchi nvme_ns_info_snap(nvme_ns_t *ns, nvme_ns_info_t **infop)
99*533affcbSRobert Mustacchi {
100*533affcbSRobert Mustacchi nvme_ctrl_t *ctrl = ns->nn_ctrl;
101*533affcbSRobert Mustacchi nvme_ns_info_t *info;
102*533affcbSRobert Mustacchi
103*533affcbSRobert Mustacchi if (infop == NULL) {
104*533affcbSRobert Mustacchi return (nvme_ctrl_error(ctrl, NVME_ERR_BAD_PTR, 0,
105*533affcbSRobert Mustacchi "encountered invalid nvme_ns_info_t output pointer: %p",
106*533affcbSRobert Mustacchi infop));
107*533affcbSRobert Mustacchi }
108*533affcbSRobert Mustacchi
109*533affcbSRobert Mustacchi info = calloc(1, sizeof (nvme_ns_info_t));
110*533affcbSRobert Mustacchi if (info == NULL) {
111*533affcbSRobert Mustacchi int e = errno;
112*533affcbSRobert Mustacchi return (nvme_ctrl_error(ctrl, NVME_ERR_NO_MEM, e, "failed to "
113*533affcbSRobert Mustacchi "allocate memory for a new nvme_ns_info_t: %s",
114*533affcbSRobert Mustacchi strerror(e)));
115*533affcbSRobert Mustacchi }
116*533affcbSRobert Mustacchi
117*533affcbSRobert Mustacchi info->nni_nsid = ns->nn_nsid;
118*533affcbSRobert Mustacchi if (!nvme_ioc_ns_info(ns->nn_ctrl, ns->nn_nsid, &info->nni_info)) {
119*533affcbSRobert Mustacchi nvme_ns_info_free(info);
120*533affcbSRobert Mustacchi return (false);
121*533affcbSRobert Mustacchi }
122*533affcbSRobert Mustacchi info->nni_vers = ns->nn_ctrl->nc_vers;
123*533affcbSRobert Mustacchi info->nni_level = nvme_ns_state_to_disc_level(info->nni_info.nni_state);
124*533affcbSRobert Mustacchi
125*533affcbSRobert Mustacchi *infop = info;
126*533affcbSRobert Mustacchi return (nvme_ctrl_success(ctrl));
127*533affcbSRobert Mustacchi }
128*533affcbSRobert Mustacchi
129*533affcbSRobert Mustacchi bool
nvme_ctrl_ns_info_snap(nvme_ctrl_t * ctrl,uint32_t nsid,nvme_ns_info_t ** infop)130*533affcbSRobert Mustacchi nvme_ctrl_ns_info_snap(nvme_ctrl_t *ctrl, uint32_t nsid, nvme_ns_info_t **infop)
131*533affcbSRobert Mustacchi {
132*533affcbSRobert Mustacchi nvme_ns_info_t *info;
133*533affcbSRobert Mustacchi
134*533affcbSRobert Mustacchi if (infop == NULL) {
135*533affcbSRobert Mustacchi return (nvme_ctrl_error(ctrl, NVME_ERR_BAD_PTR, 0,
136*533affcbSRobert Mustacchi "encountered invalid nvme_ns_info_t output pointer: %p",
137*533affcbSRobert Mustacchi infop));
138*533affcbSRobert Mustacchi }
139*533affcbSRobert Mustacchi
140*533affcbSRobert Mustacchi if (nsid < NVME_NSID_MIN || nsid > ctrl->nc_info.id_nn) {
141*533affcbSRobert Mustacchi return (nvme_ctrl_error(ctrl, NVME_ERR_NS_RANGE, 0, "requested "
142*533affcbSRobert Mustacchi "namespace %u is invalid, valid namespaces are [0x%x, "
143*533affcbSRobert Mustacchi "0x%x]", nsid, NVME_NSID_MIN, ctrl->nc_info.id_nn));
144*533affcbSRobert Mustacchi }
145*533affcbSRobert Mustacchi
146*533affcbSRobert Mustacchi info = calloc(1, sizeof (nvme_ns_info_t));
147*533affcbSRobert Mustacchi if (info == NULL) {
148*533affcbSRobert Mustacchi int e = errno;
149*533affcbSRobert Mustacchi return (nvme_ctrl_error(ctrl, NVME_ERR_NO_MEM, e, "failed to "
150*533affcbSRobert Mustacchi "allocate memory for a new nvme_ns_info_t: %s",
151*533affcbSRobert Mustacchi strerror(e)));
152*533affcbSRobert Mustacchi }
153*533affcbSRobert Mustacchi
154*533affcbSRobert Mustacchi info->nni_nsid = nsid;
155*533affcbSRobert Mustacchi if (!nvme_ioc_ns_info(ctrl, nsid, &info->nni_info)) {
156*533affcbSRobert Mustacchi nvme_ns_info_free(info);
157*533affcbSRobert Mustacchi return (false);
158*533affcbSRobert Mustacchi }
159*533affcbSRobert Mustacchi info->nni_vers = ctrl->nc_vers;
160*533affcbSRobert Mustacchi info->nni_level = nvme_ns_state_to_disc_level(info->nni_info.nni_state);
161*533affcbSRobert Mustacchi
162*533affcbSRobert Mustacchi *infop = info;
163*533affcbSRobert Mustacchi return (nvme_ctrl_success(ctrl));
164*533affcbSRobert Mustacchi }
165*533affcbSRobert Mustacchi
166*533affcbSRobert Mustacchi uint32_t
nvme_ns_info_nsid(nvme_ns_info_t * info)167*533affcbSRobert Mustacchi nvme_ns_info_nsid(nvme_ns_info_t *info)
168*533affcbSRobert Mustacchi {
169*533affcbSRobert Mustacchi return (info->nni_nsid);
170*533affcbSRobert Mustacchi }
171*533affcbSRobert Mustacchi
172*533affcbSRobert Mustacchi const nvme_identify_nsid_t *
nvme_ns_info_identify(nvme_ns_info_t * info)173*533affcbSRobert Mustacchi nvme_ns_info_identify(nvme_ns_info_t *info)
174*533affcbSRobert Mustacchi {
175*533affcbSRobert Mustacchi return (&info->nni_info.nni_id);
176*533affcbSRobert Mustacchi }
177*533affcbSRobert Mustacchi
178*533affcbSRobert Mustacchi nvme_ns_disc_level_t
nvme_ns_info_level(nvme_ns_info_t * info)179*533affcbSRobert Mustacchi nvme_ns_info_level(nvme_ns_info_t *info)
180*533affcbSRobert Mustacchi {
181*533affcbSRobert Mustacchi return (info->nni_level);
182*533affcbSRobert Mustacchi }
183*533affcbSRobert Mustacchi
184*533affcbSRobert Mustacchi static bool
nvme_ns_info_req_active(nvme_ns_info_t * info,const nvme_version_t * vers)185*533affcbSRobert Mustacchi nvme_ns_info_req_active(nvme_ns_info_t *info, const nvme_version_t *vers)
186*533affcbSRobert Mustacchi {
187*533affcbSRobert Mustacchi if (info->nni_level < NVME_NS_DISC_F_ACTIVE) {
188*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_NS_INACTIVE, 0,
189*533affcbSRobert Mustacchi "information cannot be provided for inactive namespaces: "
190*533affcbSRobert Mustacchi "namespace is %s (0x%x)",
191*533affcbSRobert Mustacchi nvme_nsleveltostr(info->nni_level), info->nni_level));
192*533affcbSRobert Mustacchi }
193*533affcbSRobert Mustacchi
194*533affcbSRobert Mustacchi if (!nvme_vers_ns_info_atleast(info, vers)) {
195*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_VERSION, 0,
196*533affcbSRobert Mustacchi "cannot provide information, device must be at least "
197*533affcbSRobert Mustacchi "version %u.%u, but is %u.%u", vers->v_major, vers->v_minor,
198*533affcbSRobert Mustacchi info->nni_vers.v_major, info->nni_vers.v_minor));
199*533affcbSRobert Mustacchi }
200*533affcbSRobert Mustacchi
201*533affcbSRobert Mustacchi return (true);
202*533affcbSRobert Mustacchi }
203*533affcbSRobert Mustacchi
204*533affcbSRobert Mustacchi bool
nvme_ns_info_nguid(nvme_ns_info_t * info,uint8_t nguid[16])205*533affcbSRobert Mustacchi nvme_ns_info_nguid(nvme_ns_info_t *info, uint8_t nguid[16])
206*533affcbSRobert Mustacchi {
207*533affcbSRobert Mustacchi const uint8_t zero_guid[16] = { 0 };
208*533affcbSRobert Mustacchi
209*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v2)) {
210*533affcbSRobert Mustacchi return (false);
211*533affcbSRobert Mustacchi }
212*533affcbSRobert Mustacchi
213*533affcbSRobert Mustacchi if (memcmp(zero_guid, info->nni_info.nni_id.id_nguid,
214*533affcbSRobert Mustacchi sizeof (zero_guid)) == 0) {
215*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_MISSING_CAP, 0,
216*533affcbSRobert Mustacchi "Namespace GUID invalid: found all 0s"));
217*533affcbSRobert Mustacchi }
218*533affcbSRobert Mustacchi
219*533affcbSRobert Mustacchi (void) memcpy(nguid, info->nni_info.nni_id.id_nguid,
220*533affcbSRobert Mustacchi sizeof (info->nni_info.nni_id.id_nguid));
221*533affcbSRobert Mustacchi
222*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
223*533affcbSRobert Mustacchi }
224*533affcbSRobert Mustacchi
225*533affcbSRobert Mustacchi bool
nvme_ns_info_eui64(nvme_ns_info_t * info,uint8_t eui64[8])226*533affcbSRobert Mustacchi nvme_ns_info_eui64(nvme_ns_info_t *info, uint8_t eui64[8])
227*533affcbSRobert Mustacchi {
228*533affcbSRobert Mustacchi const uint8_t zero_eui64[8] = { 0 };
229*533affcbSRobert Mustacchi
230*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v1)) {
231*533affcbSRobert Mustacchi return (false);
232*533affcbSRobert Mustacchi }
233*533affcbSRobert Mustacchi
234*533affcbSRobert Mustacchi if (memcmp(zero_eui64, info->nni_info.nni_id.id_eui64,
235*533affcbSRobert Mustacchi sizeof (zero_eui64)) == 0) {
236*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_MISSING_CAP, 0,
237*533affcbSRobert Mustacchi "Namespace EUI64 invalid: found all 0s"));
238*533affcbSRobert Mustacchi }
239*533affcbSRobert Mustacchi
240*533affcbSRobert Mustacchi (void) memcpy(eui64, info->nni_info.nni_id.id_eui64,
241*533affcbSRobert Mustacchi sizeof (info->nni_info.nni_id.id_eui64));
242*533affcbSRobert Mustacchi
243*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
244*533affcbSRobert Mustacchi }
245*533affcbSRobert Mustacchi
246*533affcbSRobert Mustacchi bool
nvme_ns_info_size(nvme_ns_info_t * info,uint64_t * sizep)247*533affcbSRobert Mustacchi nvme_ns_info_size(nvme_ns_info_t *info, uint64_t *sizep)
248*533affcbSRobert Mustacchi {
249*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v0)) {
250*533affcbSRobert Mustacchi return (false);
251*533affcbSRobert Mustacchi }
252*533affcbSRobert Mustacchi
253*533affcbSRobert Mustacchi *sizep = info->nni_info.nni_id.id_nsize;
254*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
255*533affcbSRobert Mustacchi }
256*533affcbSRobert Mustacchi
257*533affcbSRobert Mustacchi bool
nvme_ns_info_cap(nvme_ns_info_t * info,uint64_t * capp)258*533affcbSRobert Mustacchi nvme_ns_info_cap(nvme_ns_info_t *info, uint64_t *capp)
259*533affcbSRobert Mustacchi {
260*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v0)) {
261*533affcbSRobert Mustacchi return (false);
262*533affcbSRobert Mustacchi }
263*533affcbSRobert Mustacchi
264*533affcbSRobert Mustacchi *capp = info->nni_info.nni_id.id_ncap;
265*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
266*533affcbSRobert Mustacchi }
267*533affcbSRobert Mustacchi
268*533affcbSRobert Mustacchi bool
nvme_ns_info_use(nvme_ns_info_t * info,uint64_t * usep)269*533affcbSRobert Mustacchi nvme_ns_info_use(nvme_ns_info_t *info, uint64_t *usep)
270*533affcbSRobert Mustacchi {
271*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v0)) {
272*533affcbSRobert Mustacchi return (false);
273*533affcbSRobert Mustacchi }
274*533affcbSRobert Mustacchi
275*533affcbSRobert Mustacchi *usep = info->nni_info.nni_id.id_nuse;
276*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
277*533affcbSRobert Mustacchi }
278*533affcbSRobert Mustacchi
279*533affcbSRobert Mustacchi bool
nvme_ns_info_nformats(nvme_ns_info_t * info,uint32_t * nfmtp)280*533affcbSRobert Mustacchi nvme_ns_info_nformats(nvme_ns_info_t *info, uint32_t *nfmtp)
281*533affcbSRobert Mustacchi {
282*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v0)) {
283*533affcbSRobert Mustacchi return (false);
284*533affcbSRobert Mustacchi }
285*533affcbSRobert Mustacchi
286*533affcbSRobert Mustacchi *nfmtp = info->nni_info.nni_id.id_nlbaf + 1;
287*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
288*533affcbSRobert Mustacchi }
289*533affcbSRobert Mustacchi
290*533affcbSRobert Mustacchi bool
nvme_ns_info_format(nvme_ns_info_t * info,uint32_t idx,const nvme_nvm_lba_fmt_t ** fmtp)291*533affcbSRobert Mustacchi nvme_ns_info_format(nvme_ns_info_t *info, uint32_t idx,
292*533affcbSRobert Mustacchi const nvme_nvm_lba_fmt_t **fmtp)
293*533affcbSRobert Mustacchi {
294*533affcbSRobert Mustacchi uint32_t max;
295*533affcbSRobert Mustacchi const nvme_identify_nsid_t *nsid = &info->nni_info.nni_id;
296*533affcbSRobert Mustacchi
297*533affcbSRobert Mustacchi if (!nvme_ns_info_nformats(info, &max)) {
298*533affcbSRobert Mustacchi return (false);
299*533affcbSRobert Mustacchi }
300*533affcbSRobert Mustacchi
301*533affcbSRobert Mustacchi if (idx >= max) {
302*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_BAD_FMT, 0,
303*533affcbSRobert Mustacchi "requested index %u is invalid: valid range is [0, %u]",
304*533affcbSRobert Mustacchi idx, max - 1));
305*533affcbSRobert Mustacchi }
306*533affcbSRobert Mustacchi
307*533affcbSRobert Mustacchi if (!info->nni_lbaf_valid[idx]) {
308*533affcbSRobert Mustacchi uint8_t lbads = nsid->id_lbaf[idx].lbaf_lbads;
309*533affcbSRobert Mustacchi
310*533affcbSRobert Mustacchi if (lbads == 0) {
311*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_BAD_FMT,
312*533affcbSRobert Mustacchi 0, "format %u is not actually valid due to 0 LBA "
313*533affcbSRobert Mustacchi "data size even though it is considered a valid "
314*533affcbSRobert Mustacchi "LBA format by NLBAF", lbads));
315*533affcbSRobert Mustacchi }
316*533affcbSRobert Mustacchi
317*533affcbSRobert Mustacchi if (lbads < 9) {
318*533affcbSRobert Mustacchi return (nvme_ns_info_error(info,
319*533affcbSRobert Mustacchi NVME_INFO_ERR_BAD_FMT_DATA, 0, "NVMe devices are "
320*533affcbSRobert Mustacchi "not allowed to have a LBA data size of less than "
321*533affcbSRobert Mustacchi "512 bytes, found raw shift value of %u for "
322*533affcbSRobert Mustacchi "format %u", lbads, idx));
323*533affcbSRobert Mustacchi }
324*533affcbSRobert Mustacchi
325*533affcbSRobert Mustacchi if (lbads >= 64) {
326*533affcbSRobert Mustacchi return (nvme_ns_info_error(info,
327*533affcbSRobert Mustacchi NVME_INFO_ERR_BAD_FMT_DATA, 0, "LBA format %u has "
328*533affcbSRobert Mustacchi "LBA data size greater " "than 64 (%u), cannot be "
329*533affcbSRobert Mustacchi "represented as a byte size", idx, lbads));
330*533affcbSRobert Mustacchi }
331*533affcbSRobert Mustacchi
332*533affcbSRobert Mustacchi info->nni_lbaf[idx].nnlf_id = idx;
333*533affcbSRobert Mustacchi info->nni_lbaf[idx].nnlf_ms = nsid->id_lbaf[idx].lbaf_ms;
334*533affcbSRobert Mustacchi info->nni_lbaf[idx].nnlf_lbasz = 1ULL << lbads;
335*533affcbSRobert Mustacchi info->nni_lbaf[idx].nnlf_rel = nsid->id_lbaf[idx].lbaf_rp;
336*533affcbSRobert Mustacchi info->nni_lbaf_valid[idx] = true;
337*533affcbSRobert Mustacchi }
338*533affcbSRobert Mustacchi
339*533affcbSRobert Mustacchi *fmtp = &info->nni_lbaf[idx];
340*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
341*533affcbSRobert Mustacchi }
342*533affcbSRobert Mustacchi
343*533affcbSRobert Mustacchi
344*533affcbSRobert Mustacchi bool
nvme_ns_info_curformat(nvme_ns_info_t * info,const nvme_nvm_lba_fmt_t ** fmtp)345*533affcbSRobert Mustacchi nvme_ns_info_curformat(nvme_ns_info_t *info, const nvme_nvm_lba_fmt_t **fmtp)
346*533affcbSRobert Mustacchi {
347*533affcbSRobert Mustacchi uint32_t idx;
348*533affcbSRobert Mustacchi
349*533affcbSRobert Mustacchi if (!nvme_ns_info_req_active(info, &nvme_vers_1v0)) {
350*533affcbSRobert Mustacchi return (false);
351*533affcbSRobert Mustacchi }
352*533affcbSRobert Mustacchi
353*533affcbSRobert Mustacchi idx = info->nni_info.nni_id.id_flbas.lba_format;
354*533affcbSRobert Mustacchi return (nvme_ns_info_format(info, idx, fmtp));
355*533affcbSRobert Mustacchi }
356*533affcbSRobert Mustacchi
357*533affcbSRobert Mustacchi bool
nvme_ns_info_bd_addr(nvme_ns_info_t * info,const char ** addrp)358*533affcbSRobert Mustacchi nvme_ns_info_bd_addr(nvme_ns_info_t *info, const char **addrp)
359*533affcbSRobert Mustacchi {
360*533affcbSRobert Mustacchi if (info->nni_level < NVME_NS_DISC_F_BLKDEV) {
361*533affcbSRobert Mustacchi return (nvme_ns_info_error(info, NVME_INFO_ERR_NS_NO_BLKDEV, 0,
362*533affcbSRobert Mustacchi "the blkdev address cannot be provided for namespaces "
363*533affcbSRobert Mustacchi "without blkdev attached: namespace is %s (0x%x)",
364*533affcbSRobert Mustacchi nvme_nsleveltostr(info->nni_level), info->nni_level));
365*533affcbSRobert Mustacchi }
366*533affcbSRobert Mustacchi
367*533affcbSRobert Mustacchi *addrp = info->nni_info.nni_addr;
368*533affcbSRobert Mustacchi return (nvme_ns_info_success(info));
369*533affcbSRobert Mustacchi }
370