Lines Matching defs:ns

283 		subsystem->ns = calloc(num_ns, sizeof(struct spdk_nvmf_ns *));
284 if (subsystem->ns == NULL) {
295 free(subsystem->ns);
376 struct spdk_nvmf_ns *ns;
393 ns = spdk_nvmf_subsystem_get_first_ns(subsystem);
394 while (ns != NULL) {
395 struct spdk_nvmf_ns *next_ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns);
397 spdk_nvmf_subsystem_remove_ns(subsystem, ns->opts.nsid);
398 ns = next_ns;
410 free(subsystem->ns);
438 struct spdk_nvmf_ns *ns = spdk_nvmf_subsystem_get_first_ns(subsystem);
439 while (ns != NULL) {
440 if (ns->csi == SPDK_NVME_CSI_ZNS) {
441 return ns;
443 ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns);
841 nvmf_ns_add_host(struct spdk_nvmf_ns *ns, const char *hostnqn)
850 TAILQ_INSERT_HEAD(&ns->hosts, host, link);
855 nvmf_ns_remove_host(struct spdk_nvmf_ns *ns, struct spdk_nvmf_host *host)
857 TAILQ_REMOVE(&ns->hosts, host, link);
881 struct spdk_nvmf_ns *ns;
900 ns = subsystem->ns[nsid - 1];
901 if (!ns) {
905 if (ns->always_visible) {
911 host = nvmf_ns_find_host(ns, hostnqn);
913 rc = nvmf_ns_add_host(ns, hostnqn);
918 nvmf_ns_remove_host(ns, host);
1752 static uint32_t nvmf_ns_reservation_clear_all_registrants(struct spdk_nvmf_ns *ns);
1758 struct spdk_nvmf_ns *ns;
1772 ns = subsystem->ns[nsid - 1];
1773 if (!ns) {
1777 subsystem->ns[nsid - 1] = NULL;
1779 assert(ns->anagrpid - 1 < subsystem->max_nsid);
1780 assert(subsystem->ana_group[ns->anagrpid - 1] > 0);
1782 subsystem->ana_group[ns->anagrpid - 1]--;
1784 TAILQ_FOREACH_SAFE(host, &ns->hosts, link, tmp) {
1785 nvmf_ns_remove_host(ns, host);
1788 free(ns->ptpl_file);
1789 nvmf_ns_reservation_clear_all_registrants(ns);
1790 spdk_bdev_module_release_bdev(ns->bdev);
1791 spdk_bdev_close(ns->desc);
1792 free(ns);
1865 struct spdk_nvmf_ns *ns = remove_ctx;
1870 * is asynchronous and we could lose the ns in the middle.
1878 ns_ctx->subsystem = ns->subsystem;
1879 ns_ctx->nsid = ns->opts.nsid;
1882 rc = spdk_nvmf_subsystem_pause(ns->subsystem, ns_ctx->nsid, _nvmf_ns_hot_remove, ns_ctx);
1910 struct spdk_nvmf_ns *ns = event_ctx;
1915 * is asynchronous and we could lose the ns in the middle.
1923 ns_ctx->subsystem = ns->subsystem;
1924 ns_ctx->nsid = ns->opts.nsid;
1930 rc = spdk_nvmf_subsystem_pause(ns->subsystem, 0, _nvmf_ns_resize, ns_ctx);
2053 static int nvmf_ns_reservation_update(const struct spdk_nvmf_ns *ns,
2055 static int nvmf_ns_reservation_load(const struct spdk_nvmf_ns *ns,
2057 static int nvmf_ns_reservation_restore(struct spdk_nvmf_ns *ns,
2063 struct spdk_nvmf_ns *ns;
2065 for (ns = spdk_nvmf_subsystem_get_first_ns(subsystem);
2066 ns != NULL;
2067 ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns)) {
2068 if (spdk_bdev_is_zoned(ns->bdev) &&
2069 spdk_bdev_io_type_supported(ns->bdev, SPDK_BDEV_IO_TYPE_ZONE_APPEND)) {
2085 struct spdk_nvmf_ns *ns, *first_ns;
2143 ns = calloc(1, sizeof(*ns));
2144 if (ns == NULL) {
2149 TAILQ_INIT(&ns->hosts);
2150 ns->always_visible = !opts.no_auto_visible;
2152 nvmf_ctrlr_ns_set_visible(ctrlr, opts.nsid, ns->always_visible);
2158 rc = spdk_bdev_open_ext_v2(bdev_name, true, nvmf_ns_event, ns, &open_opts, &ns->desc);
2162 free(ns);
2166 ns->bdev = spdk_bdev_desc_get_bdev(ns->desc);
2168 if (spdk_bdev_desc_get_md_size(ns->desc) != 0) {
2169 if (!spdk_bdev_desc_is_md_interleaved(ns->desc)) {
2171 spdk_bdev_close(ns->desc);
2172 free(ns);
2176 if (spdk_bdev_desc_get_md_size(ns->desc) > SPDK_BDEV_MAX_INTERLEAVED_MD_SIZE) {
2179 spdk_bdev_desc_get_md_size(ns->desc));
2180 spdk_bdev_close(ns->desc);
2181 free(ns);
2186 rc = spdk_bdev_module_claim_bdev(ns->bdev, ns->desc, &ns_bdev_module);
2188 spdk_bdev_close(ns->desc);
2189 free(ns);
2193 ns->passthru_nsid = spdk_bdev_get_nvme_nsid(ns->bdev);
2194 if (subsystem->passthrough && ns->passthru_nsid == 0) {
2200 ns->zcopy = spdk_bdev_io_type_supported(ns->bdev, SPDK_BDEV_IO_TYPE_ZCOPY);
2203 opts.uuid = *spdk_bdev_get_uuid(ns->bdev);
2209 memcpy(opts.nguid, spdk_bdev_get_uuid(ns->bdev), sizeof(opts.nguid));
2212 if (spdk_bdev_is_zoned(ns->bdev)) {
2214 ns->csi = SPDK_NVME_CSI_ZNS;
2216 zone_append_supported = spdk_bdev_io_type_supported(ns->bdev,
2218 max_zone_append_size_kib = spdk_bdev_get_max_zone_append_size(ns->bdev) *
2219 spdk_bdev_desc_get_block_size(ns->desc);
2233 if (spdk_bdev_get_nvme_ctratt(ns->bdev).bits.fdps) {
2240 spdk_bdev_get_nvme_ctratt(ns->bdev).bits.fdps) {
2247 ns->opts = opts;
2248 ns->subsystem = subsystem;
2249 subsystem->ns[opts.nsid - 1] = ns;
2250 ns->nsid = opts.nsid;
2251 ns->anagrpid = opts.anagrpid;
2252 subsystem->ana_group[ns->anagrpid - 1]++;
2253 TAILQ_INIT(&ns->registrants);
2255 ns->ptpl_file = strdup(ptpl_file);
2256 if (!ns->ptpl_file) {
2257 SPDK_ERRLOG("Namespace ns->ptpl_file allocation failed\n");
2262 if (nvmf_ns_is_ptpl_capable(ns)) {
2263 rc = nvmf_ns_reservation_load(ns, &info);
2269 rc = nvmf_ns_reservation_restore(ns, &info);
2279 rc = transport->ops->subsystem_add_ns(transport, subsystem, ns);
2282 nvmf_ns_reservation_clear_all_registrants(ns);
2289 ns->opts.transport_specific = NULL;
2298 SPDK_DTRACE_PROBE2(nvmf_subsystem_add_ns, subsystem->subnqn, ns->nsid);
2302 subsystem->ns[opts.nsid - 1] = NULL;
2303 spdk_bdev_module_release_bdev(ns->bdev);
2304 spdk_bdev_close(ns->desc);
2305 free(ns->ptpl_file);
2306 free(ns);
2315 struct spdk_nvmf_ns *ns;
2331 ns = subsystem->ns[nsid - 1];
2332 if (!ns) {
2336 assert(ns->anagrpid - 1 < subsystem->max_nsid);
2338 assert(subsystem->ana_group[ns->anagrpid - 1] > 0);
2340 subsystem->ana_group[ns->anagrpid - 1]--;
2344 ns->anagrpid = anagrpid;
2345 ns->opts.anagrpid = anagrpid;
2363 if (subsystem->ns[nsid - 1]) {
2397 spdk_nvmf_ns_get_id(const struct spdk_nvmf_ns *ns)
2399 return ns->opts.nsid;
2403 spdk_nvmf_ns_get_bdev(struct spdk_nvmf_ns *ns)
2405 return ns->bdev;
2409 spdk_nvmf_ns_get_opts(const struct spdk_nvmf_ns *ns, struct spdk_nvmf_ns_opts *opts,
2413 memcpy(opts, &ns->opts, spdk_min(sizeof(ns->opts), opts_size));
2675 nvmf_ns_reservation_load_json(const struct spdk_nvmf_ns *ns,
2683 const char *file = ns->ptpl_file;
2757 static bool nvmf_ns_reservation_all_registrants_type(struct spdk_nvmf_ns *ns);
2760 nvmf_ns_reservation_restore(struct spdk_nvmf_ns *ns, struct spdk_nvmf_reservation_info *info)
2768 ns->nsid, info->ptpl_activated, info->num_regs);
2786 if (spdk_uuid_compare(&bdev_uuid, spdk_bdev_get_uuid(ns->bdev))) {
2791 ns->crkey = info->crkey;
2792 ns->rtype = info->rtype;
2793 ns->ptpl_activated = info->ptpl_activated;
2809 TAILQ_INSERT_TAIL(&ns->registrants, reg, link);
2817 if (nvmf_ns_reservation_all_registrants_type(ns)) {
2818 ns->holder = TAILQ_FIRST(&ns->registrants);
2820 ns->holder = holder;
2845 nvmf_ns_reservation_update_json(const struct spdk_nvmf_ns *ns,
2848 const char *file = ns->ptpl_file;
2885 nvmf_ns_update_reservation_info(struct spdk_nvmf_ns *ns)
2891 assert(ns != NULL);
2893 if (!ns->bdev || !nvmf_ns_is_ptpl_capable(ns)) {
2898 spdk_uuid_fmt_lower(info.bdev_uuid, sizeof(info.bdev_uuid), spdk_bdev_get_uuid(ns->bdev));
2900 if (ns->rtype) {
2901 info.rtype = ns->rtype;
2902 info.crkey = ns->crkey;
2903 if (!nvmf_ns_reservation_all_registrants_type(ns)) {
2904 assert(ns->holder != NULL);
2905 spdk_uuid_fmt_lower(info.holder_uuid, sizeof(info.holder_uuid), &ns->holder->hostid);
2909 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, tmp) {
2916 info.ptpl_activated = ns->ptpl_activated;
2918 return nvmf_ns_reservation_update(ns, &info);
2922 nvmf_ns_reservation_get_registrant(struct spdk_nvmf_ns *ns,
2927 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, tmp) {
2939 struct spdk_nvmf_ns *ns,
2950 nvmf_ctrlr_reservation_notice_log(ctrlr, ns, type);
2958 nvmf_ns_reservation_get_all_other_hostid(struct spdk_nvmf_ns *ns,
2966 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, tmp) {
3019 nvmf_ns_reservation_all_registrants_type(struct spdk_nvmf_ns *ns)
3021 return (ns->rtype == SPDK_NVME_RESERVE_WRITE_EXCLUSIVE_ALL_REGS ||
3022 ns->rtype == SPDK_NVME_RESERVE_EXCLUSIVE_ACCESS_ALL_REGS);
3027 nvmf_ns_reservation_registrant_is_holder(struct spdk_nvmf_ns *ns,
3034 if (nvmf_ns_reservation_all_registrants_type(ns)) {
3038 return (ns->holder == reg);
3042 nvmf_ns_reservation_add_registrant(struct spdk_nvmf_ns *ns,
3056 TAILQ_INSERT_TAIL(&ns->registrants, reg, link);
3057 ns->gen++;
3063 nvmf_ns_reservation_release_reservation(struct spdk_nvmf_ns *ns)
3065 ns->rtype = 0;
3066 ns->crkey = 0;
3067 ns->holder = NULL;
3072 nvmf_ns_reservation_check_release_on_remove_registrant(struct spdk_nvmf_ns *ns,
3078 if (!ns->holder) {
3079 assert(ns->rtype == 0);
3083 next_reg = TAILQ_FIRST(&ns->registrants);
3084 if (next_reg && nvmf_ns_reservation_all_registrants_type(ns)) {
3086 ns->holder = next_reg;
3087 } else if (nvmf_ns_reservation_registrant_is_holder(ns, reg)) {
3089 nvmf_ns_reservation_release_reservation(ns);
3094 nvmf_ns_reservation_remove_registrant(struct spdk_nvmf_ns *ns,
3097 TAILQ_REMOVE(&ns->registrants, reg, link);
3098 nvmf_ns_reservation_check_release_on_remove_registrant(ns, reg);
3100 ns->gen++;
3105 nvmf_ns_reservation_remove_registrants_by_key(struct spdk_nvmf_ns *ns,
3111 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, tmp) {
3113 nvmf_ns_reservation_remove_registrant(ns, reg);
3121 nvmf_ns_reservation_remove_all_other_registrants(struct spdk_nvmf_ns *ns,
3127 TAILQ_FOREACH_SAFE(reg_tmp, &ns->registrants, link, reg_tmp2) {
3129 nvmf_ns_reservation_remove_registrant(ns, reg_tmp);
3137 nvmf_ns_reservation_clear_all_registrants(struct spdk_nvmf_ns *ns)
3142 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, reg_tmp) {
3143 nvmf_ns_reservation_remove_registrant(ns, reg);
3150 nvmf_ns_reservation_acquire_reservation(struct spdk_nvmf_ns *ns, uint64_t rkey,
3154 ns->rtype = rtype;
3155 ns->crkey = rkey;
3156 assert(ns->holder == NULL);
3157 ns->holder = holder;
3161 nvmf_ns_reservation_register(struct spdk_nvmf_ns *ns,
3195 if (ns->ptpl_activated) {
3196 ns->ptpl_activated = 0;
3200 if (!nvmf_ns_is_ptpl_capable(ns)) {
3203 } else if (ns->ptpl_activated == 0) {
3204 ns->ptpl_activated = 1;
3210 reg = nvmf_ns_reservation_get_registrant(ns, &ctrlr->hostid);
3221 rc = nvmf_ns_reservation_add_registrant(ns, ctrlr, key.nrkey);
3246 rtype = ns->rtype;
3247 num_hostid = nvmf_ns_reservation_get_all_other_hostid(ns, hostid_list,
3251 nvmf_ns_reservation_remove_registrant(ns, reg);
3253 if (!ns->rtype && num_hostid && (rtype == SPDK_NVME_RESERVE_WRITE_EXCLUSIVE_REG_ONLY ||
3255 nvmf_subsystem_gen_ctrlr_notification(ns->subsystem, ns,
3282 rc = nvmf_ns_reservation_add_registrant(ns, ctrlr, key.nrkey);
3307 nvmf_ns_reservation_acquire(struct spdk_nvmf_ns *ns,
3350 reg = nvmf_ns_reservation_get_registrant(ns, &ctrlr->hostid);
3360 all_regs = nvmf_ns_reservation_all_registrants_type(ns);
3365 if (nvmf_ns_reservation_registrant_is_holder(ns, reg) && ns->rtype == rtype) {
3368 } else if (ns->holder == NULL) {
3370 nvmf_ns_reservation_acquire_reservation(ns, key.crkey, rtype, reg);
3380 if (!ns->holder) {
3382 nvmf_ns_reservation_remove_registrants_by_key(ns, key.prkey);
3385 num_hostid = nvmf_ns_reservation_get_all_other_hostid(ns, hostid_list,
3392 if (nvmf_ns_reservation_registrant_is_holder(ns, reg) &&
3393 ns->crkey == key.prkey) {
3394 ns->rtype = rtype;
3399 if (ns->crkey == key.prkey) {
3400 nvmf_ns_reservation_remove_registrant(ns, ns->holder);
3401 nvmf_ns_reservation_acquire_reservation(ns, key.crkey, rtype, reg);
3404 nvmf_ns_reservation_remove_registrants_by_key(ns, key.prkey);
3415 nvmf_ns_reservation_remove_all_other_registrants(ns, reg);
3416 assert(ns->holder == reg);
3418 count = nvmf_ns_reservation_remove_registrants_by_key(ns, key.prkey);
3436 new_num_hostid = nvmf_ns_reservation_get_all_other_hostid(ns, new_hostid_list,
3447 nvmf_subsystem_gen_ctrlr_notification(ns->subsystem, ns,
3458 nvmf_subsystem_gen_ctrlr_notification(ns->subsystem, ns,
3471 nvmf_ns_reservation_release(struct spdk_nvmf_ns *ns,
3508 reg = nvmf_ns_reservation_get_registrant(ns, &ctrlr->hostid);
3517 num_hostid = nvmf_ns_reservation_get_all_other_hostid(ns, hostid_list,
3523 if (!ns->holder) {
3528 if (ns->rtype != rtype) {
3534 if (!nvmf_ns_reservation_registrant_is_holder(ns, reg)) {
3540 rtype = ns->rtype;
3541 nvmf_ns_reservation_release_reservation(ns);
3545 nvmf_subsystem_gen_ctrlr_notification(ns->subsystem, ns,
3552 nvmf_ns_reservation_clear_all_registrants(ns);
3554 nvmf_subsystem_gen_ctrlr_notification(ns->subsystem, ns,
3573 nvmf_ns_reservation_report(struct spdk_nvmf_ns *ns,
3609 status_data.data.gen = ns->gen;
3610 status_data.data.rtype = ns->rtype;
3611 status_data.data.ptpls = ns->ptpl_activated;
3613 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, tmp) {
3628 TAILQ_FOREACH_SAFE(reg, &ns->registrants, link, tmp) {
3633 ctrlr_data.rcsts.status = (ns->holder == reg) ? true : false;
3671 struct spdk_nvmf_ns *ns;
3676 ns = _nvmf_subsystem_get_ns(ctrlr->subsys, nsid);
3677 assert(ns != NULL);
3681 update_sgroup = nvmf_ns_reservation_register(ns, ctrlr, req);
3684 update_sgroup = nvmf_ns_reservation_acquire(ns, ctrlr, req);
3687 update_sgroup = nvmf_ns_reservation_release(ns, ctrlr, req);
3690 nvmf_ns_reservation_report(ns, ctrlr, req);
3698 if (ns->ptpl_activated || cmd->opc == SPDK_NVME_OPC_RESERVATION_REGISTER) {
3699 if (nvmf_ns_update_reservation_info(ns) != 0) {
3713 nvmf_ns_is_ptpl_capable_json(const struct spdk_nvmf_ns *ns)
3715 return ns->ptpl_file != NULL;
3725 nvmf_ns_is_ptpl_capable(const struct spdk_nvmf_ns *ns)
3727 return g_reservation_ops.is_ptpl_capable(ns);
3731 nvmf_ns_reservation_update(const struct spdk_nvmf_ns *ns,
3734 return g_reservation_ops.update(ns, info);
3738 nvmf_ns_reservation_load(const struct spdk_nvmf_ns *ns, struct spdk_nvmf_reservation_info *info)
3740 return g_reservation_ops.load(ns, info);