Lines Matching defs:ns
9 _nvme_ns_get_data(struct spdk_nvme_ns *ns)
11 return &ns->nsdata;
21 nvme_ns_set_identify_data(struct spdk_nvme_ns *ns)
27 nsdata = _nvme_ns_get_data(ns);
28 nsdata_nvm = ns->nsdata_nvm;
30 ns->flags = 0x0000;
33 ns->sector_size = 1 << nsdata->lbaf[format_index].lbads;
34 ns->extended_lba_size = ns->sector_size;
36 ns->md_size = nsdata->lbaf[format_index].ms;
38 ns->flags |= SPDK_NVME_NS_EXTENDED_LBA_SUPPORTED;
39 ns->extended_lba_size += ns->md_size;
42 ns->sectors_per_max_io = spdk_nvme_ns_get_max_io_xfer_size(ns) / ns->extended_lba_size;
43 ns->sectors_per_max_io_no_md = spdk_nvme_ns_get_max_io_xfer_size(ns) / ns->sector_size;
44 if (ns->ctrlr->quirks & NVME_QUIRK_MDTS_EXCLUDE_MD) {
45 ns->sectors_per_max_io = ns->sectors_per_max_io_no_md;
49 ns->sectors_per_stripe = nsdata->noiob;
50 SPDK_DEBUGLOG(nvme, "ns %u optimal IO boundary %" PRIu32 " blocks\n",
51 ns->id, ns->sectors_per_stripe);
52 } else if (ns->ctrlr->quirks & NVME_INTEL_QUIRK_STRIPING &&
53 ns->ctrlr->cdata.vs[3] != 0) {
54 ns->sectors_per_stripe = (1ULL << ns->ctrlr->cdata.vs[3]) * ns->ctrlr->min_page_size /
55 ns->sector_size;
56 SPDK_DEBUGLOG(nvme, "ns %u stripe size quirk %" PRIu32 " blocks\n",
57 ns->id, ns->sectors_per_stripe);
59 ns->sectors_per_stripe = 0;
62 if (ns->ctrlr->cdata.oncs.dsm) {
63 ns->flags |= SPDK_NVME_NS_DEALLOCATE_SUPPORTED;
66 if (ns->ctrlr->cdata.oncs.compare) {
67 ns->flags |= SPDK_NVME_NS_COMPARE_SUPPORTED;
70 if (ns->ctrlr->cdata.vwc.present) {
71 ns->flags |= SPDK_NVME_NS_FLUSH_SUPPORTED;
74 if (ns->ctrlr->cdata.oncs.write_zeroes) {
75 ns->flags |= SPDK_NVME_NS_WRITE_ZEROES_SUPPORTED;
78 if (ns->ctrlr->cdata.oncs.write_unc) {
79 ns->flags |= SPDK_NVME_NS_WRITE_UNCORRECTABLE_SUPPORTED;
83 ns->flags |= SPDK_NVME_NS_RESERVATION_SUPPORTED;
86 ns->pi_type = SPDK_NVME_FMT_NVM_PROTECTION_DISABLE;
88 ns->flags |= SPDK_NVME_NS_DPS_PI_SUPPORTED;
89 ns->pi_type = nsdata->dps.pit;
90 if (nsdata_nvm != NULL && ns->ctrlr->cdata.ctratt.bits.elbas) {
94 ns->pi_format = nsdata_nvm->elbaf[format_index].pif;
96 ns->pi_format = SPDK_NVME_16B_GUARD_PI;
102 nvme_ctrlr_identify_ns(struct spdk_nvme_ns *ns)
114 nsdata = _nvme_ns_get_data(ns);
115 rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS, 0, ns->id, 0,
123 if (nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, status,
124 &ns->ctrlr->ctrlr_lock)) {
130 nvme_ns_destruct(ns);
135 nvme_ns_set_identify_data(ns);
141 nvme_ctrlr_identify_ns_zns_specific(struct spdk_nvme_ns *ns)
144 struct spdk_nvme_ctrlr *ctrlr = ns->ctrlr;
148 nvme_ns_free_zns_specific_data(ns);
163 rc = nvme_ctrlr_cmd_identify(ctrlr, SPDK_NVME_IDENTIFY_NS_IOCS, 0, ns->id, ns->csi,
181 ns->nsdata_zns = nsdata_zns;
187 nvme_ctrlr_identify_ns_nvm_specific(struct spdk_nvme_ns *ns)
190 struct spdk_nvme_ctrlr *ctrlr = ns->ctrlr;
194 nvme_ns_free_zns_specific_data(ns);
209 rc = nvme_ctrlr_cmd_identify(ctrlr, SPDK_NVME_IDENTIFY_NS_IOCS, 0, ns->id, ns->csi,
227 ns->nsdata_nvm = nsdata_nvm;
233 nvme_ctrlr_identify_ns_iocs_specific(struct spdk_nvme_ns *ns)
235 switch (ns->csi) {
237 return nvme_ctrlr_identify_ns_zns_specific(ns);
239 if (ns->ctrlr->cdata.ctratt.bits.elbas) {
240 return nvme_ctrlr_identify_ns_nvm_specific(ns);
256 nvme_ctrlr_identify_id_desc(struct spdk_nvme_ns *ns)
261 memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list));
263 if ((ns->ctrlr->vs.raw < SPDK_NVME_VERSION(1, 3, 0) &&
264 !(ns->ctrlr->cap.bits.css & SPDK_NVME_CAP_CSS_IOCS)) ||
265 (ns->ctrlr->quirks & NVME_QUIRK_IDENTIFY_CNS)) {
277 rc = nvme_ctrlr_cmd_identify(ns->ctrlr, SPDK_NVME_IDENTIFY_NS_ID_DESCRIPTOR_LIST, 0, ns->id,
278 0, ns->id_desc_list, sizeof(ns->id_desc_list),
285 rc = nvme_wait_for_completion_robust_lock(ns->ctrlr->adminq, status, &ns->ctrlr->ctrlr_lock);
288 memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list));
295 nvme_ns_set_id_desc_list_data(ns);
301 spdk_nvme_ns_get_id(struct spdk_nvme_ns *ns)
303 return ns->id;
307 spdk_nvme_ns_is_active(struct spdk_nvme_ns *ns)
314 if (ns->id == 0) {
318 nsdata = _nvme_ns_get_data(ns);
329 spdk_nvme_ns_get_ctrlr(struct spdk_nvme_ns *ns)
331 return ns->ctrlr;
335 spdk_nvme_ns_get_max_io_xfer_size(struct spdk_nvme_ns *ns)
337 return ns->ctrlr->max_xfer_size;
341 spdk_nvme_ns_get_sector_size(struct spdk_nvme_ns *ns)
343 return ns->sector_size;
347 spdk_nvme_ns_get_extended_sector_size(struct spdk_nvme_ns *ns)
349 return ns->extended_lba_size;
353 spdk_nvme_ns_get_num_sectors(struct spdk_nvme_ns *ns)
355 return _nvme_ns_get_data(ns)->nsze;
359 spdk_nvme_ns_get_size(struct spdk_nvme_ns *ns)
361 return spdk_nvme_ns_get_num_sectors(ns) * spdk_nvme_ns_get_sector_size(ns);
365 spdk_nvme_ns_get_flags(struct spdk_nvme_ns *ns)
367 return ns->flags;
371 spdk_nvme_ns_get_pi_type(struct spdk_nvme_ns *ns) {
372 return ns->pi_type;
376 spdk_nvme_ns_get_pi_format(struct spdk_nvme_ns *ns) {
377 return ns->pi_format;
381 spdk_nvme_ns_supports_extended_lba(struct spdk_nvme_ns *ns)
383 return (ns->flags & SPDK_NVME_NS_EXTENDED_LBA_SUPPORTED) ? true : false;
387 spdk_nvme_ns_supports_compare(struct spdk_nvme_ns *ns)
389 return (ns->flags & SPDK_NVME_NS_COMPARE_SUPPORTED) ? true : false;
393 spdk_nvme_ns_get_md_size(struct spdk_nvme_ns *ns)
395 return ns->md_size;
409 spdk_nvme_ns_get_data(struct spdk_nvme_ns *ns)
411 return _nvme_ns_get_data(ns);
415 spdk_nvme_nvm_ns_get_data(struct spdk_nvme_ns *ns)
417 return ns->nsdata_nvm;
426 struct spdk_nvme_ns *ns)
428 struct spdk_nvme_ctrlr *ctrlr = ns->ctrlr;
429 const struct spdk_nvme_ns_data *data = spdk_nvme_ns_get_data(ns);
439 spdk_nvme_ns_get_optimal_io_boundary(struct spdk_nvme_ns *ns)
441 return ns->sectors_per_stripe;
445 nvme_ns_find_id_desc(const struct spdk_nvme_ns *ns, enum spdk_nvme_nidt type, size_t *length)
451 while (offset + 4 < sizeof(ns->id_desc_list)) {
452 desc = (const struct spdk_nvme_ns_id_desc *)&ns->id_desc_list[offset];
463 if (offset + desc->nidl + 4 > sizeof(ns->id_desc_list)) {
480 spdk_nvme_ns_get_nguid(const struct spdk_nvme_ns *ns)
485 nguid = nvme_ns_find_id_desc(ns, SPDK_NVME_NIDT_NGUID, &size);
496 spdk_nvme_ns_get_uuid(const struct spdk_nvme_ns *ns)
501 uuid = nvme_ns_find_id_desc(ns, SPDK_NVME_NIDT_UUID, &uuid_size);
512 nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
516 csi = nvme_ns_find_id_desc(ns, SPDK_NVME_NIDT_CSI, &csi_size);
525 if (ns->ctrlr->cap.bits.css & SPDK_NVME_CAP_CSS_IOCS) {
526 SPDK_WARNLOG("CSI not reported for NSID: %" PRIu32 "\n", ns->id);
535 nvme_ns_set_id_desc_list_data(struct spdk_nvme_ns *ns)
537 ns->csi = nvme_ns_get_csi(ns);
541 spdk_nvme_ns_get_csi(const struct spdk_nvme_ns *ns) {
542 return ns->csi;
546 nvme_ns_free_zns_specific_data(struct spdk_nvme_ns *ns)
548 if (!ns->id) {
552 if (ns->nsdata_zns) {
553 spdk_free(ns->nsdata_zns);
554 ns->nsdata_zns = NULL;
559 nvme_ns_free_nvm_specific_data(struct spdk_nvme_ns *ns)
561 if (!ns->id) {
565 if (ns->nsdata_nvm) {
566 spdk_free(ns->nsdata_nvm);
567 ns->nsdata_nvm = NULL;
572 nvme_ns_free_iocs_specific_data(struct spdk_nvme_ns *ns)
574 nvme_ns_free_zns_specific_data(ns);
575 nvme_ns_free_nvm_specific_data(ns);
579 nvme_ns_has_supported_iocs_specific_data(struct spdk_nvme_ns *ns)
581 switch (ns->csi) {
583 if (ns->ctrlr->cdata.ctratt.bits.elbas) {
591 SPDK_WARNLOG("Unsupported CSI: %u for NSID: %u\n", ns->csi, ns->id);
597 spdk_nvme_ns_get_ana_group_id(const struct spdk_nvme_ns *ns)
599 return ns->ana_group_id;
603 spdk_nvme_ns_get_ana_state(const struct spdk_nvme_ns *ns) {
604 return ns->ana_state;
608 nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
615 ns->ctrlr = ctrlr;
616 ns->id = id;
618 ns->ana_state = SPDK_NVME_ANA_OPTIMIZED_STATE;
620 rc = nvme_ctrlr_identify_ns(ns);
626 if (!spdk_nvme_ns_is_active(ns)) {
630 rc = nvme_ctrlr_identify_id_desc(ns);
636 nvme_ns_has_supported_iocs_specific_data(ns)) {
637 rc = nvme_ctrlr_identify_ns_iocs_specific(ns);
647 nvme_ns_destruct(struct spdk_nvme_ns *ns)
651 if (!ns->id) {
655 nsdata = _nvme_ns_get_data(ns);
657 memset(ns->id_desc_list, 0, sizeof(ns->id_desc_list));
658 nvme_ns_free_iocs_specific_data(ns);
659 ns->sector_size = 0;
660 ns->extended_lba_size = 0;
661 ns->md_size = 0;
662 ns->pi_type = 0;
663 ns->sectors_per_max_io = 0;
664 ns->sectors_per_max_io_no_md = 0;
665 ns->sectors_per_stripe = 0;
666 ns->flags = 0;
667 ns->csi = SPDK_NVME_CSI_NVM;