Lines Matching +full:slot +full:- +full:size
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
11 #include "nd-core.h"
39 return ndd->nslabel_size; in sizeof_namespace_label()
51 return (ndd->nsarea.config_size - index_size * 2) / in __nvdimm_num_label_slots()
59 tmp_nslot = ndd->nsarea.config_size / sizeof_namespace_label(ndd); in nvdimm_num_label_slots()
67 u32 nslot, space, size; in sizeof_namespace_index() local
70 * Per UEFI 2.7, the minimum size of the Label Storage Area is large in sizeof_namespace_index()
72 * block size is 256 bytes. The label size is 128 for namespaces in sizeof_namespace_index()
76 space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd); in sizeof_namespace_index()
77 size = __sizeof_namespace_index(nslot) * 2; in sizeof_namespace_index()
78 if (size <= space && nslot >= 2) in sizeof_namespace_index()
79 return size / 2; in sizeof_namespace_index()
81 dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n", in sizeof_namespace_index()
82 ndd->nsarea.config_size, sizeof_namespace_label(ndd)); in sizeof_namespace_index()
95 * +------------+ in __nd_label_validate()
99 * +------------+ in __nd_label_validate()
103 * +------------+ in __nd_label_validate()
105 * +------------+ in __nd_label_validate()
107 * +------------+ in __nd_label_validate()
111 * +------------+ in __nd_label_validate()
113 * +------------+ in __nd_label_validate()
120 struct device *dev = ndd->dev; in __nd_label_validate()
128 u64 sum_save, sum, size; in __nd_label_validate() local
131 memcpy(sig, nsindex[i]->sig, NSINDEX_SIG_LEN); in __nd_label_validate()
138 version = __le16_to_cpu(nsindex[i]->major) * 100 in __nd_label_validate()
139 + __le16_to_cpu(nsindex[i]->minor); in __nd_label_validate()
141 labelsize = 1 << (7 + nsindex[i]->labelsize); in __nd_label_validate()
147 i, nsindex[i]->labelsize); in __nd_label_validate()
151 sum_save = __le64_to_cpu(nsindex[i]->checksum); in __nd_label_validate()
152 nsindex[i]->checksum = __cpu_to_le64(0); in __nd_label_validate()
154 nsindex[i]->checksum = __cpu_to_le64(sum_save); in __nd_label_validate()
160 seq = __le32_to_cpu(nsindex[i]->seq); in __nd_label_validate()
167 if (__le64_to_cpu(nsindex[i]->myoff) in __nd_label_validate()
171 __le64_to_cpu(nsindex[i]->myoff)); in __nd_label_validate()
174 if (__le64_to_cpu(nsindex[i]->otheroff) in __nd_label_validate()
178 __le64_to_cpu(nsindex[i]->otheroff)); in __nd_label_validate()
181 if (__le64_to_cpu(nsindex[i]->labeloff) in __nd_label_validate()
185 __le64_to_cpu(nsindex[i]->labeloff)); in __nd_label_validate()
189 size = __le64_to_cpu(nsindex[i]->mysize); in __nd_label_validate()
190 if (size > sizeof_namespace_index(ndd) in __nd_label_validate()
191 || size < sizeof(struct nd_namespace_index)) { in __nd_label_validate()
192 dev_dbg(dev, "nsindex%d mysize: %#llx invalid\n", i, size); in __nd_label_validate()
196 nslot = __le32_to_cpu(nsindex[i]->nslot); in __nd_label_validate()
199 > ndd->nsarea.config_size) { in __nd_label_validate()
201 i, nslot, ndd->nsarea.config_size); in __nd_label_validate()
220 seq = best_seq(__le32_to_cpu(nsindex[0]->seq), in __nd_label_validate()
221 __le32_to_cpu(nsindex[1]->seq)); in __nd_label_validate()
222 if (seq == (__le32_to_cpu(nsindex[1]->seq) & NSINDEX_SEQ_MASK)) in __nd_label_validate()
229 return -1; in __nd_label_validate()
236 * need to know the size of the labels, and we can't trust the in nd_label_validate()
237 * size of the labels until we validate the index blocks. in nd_label_validate()
239 * sizes, but default to v1.2 256-byte namespace labels if in nd_label_validate()
246 ndd->nslabel_size = label_size[i]; in nd_label_validate()
252 return -1; in nd_label_validate()
281 return (label - base) / sizeof_namespace_label(ndd); in to_slot()
284 static struct nd_namespace_label *to_label(struct nvdimm_drvdata *ndd, int slot) in to_label() argument
289 label = base + sizeof_namespace_label(ndd) * slot; in to_label()
294 #define for_each_clear_bit_le(bit, addr, size) \ argument
295 for ((bit) = find_next_zero_bit_le((addr), (size), 0); \
296 (bit) < (size); \
297 (bit) = find_next_zero_bit_le((addr), (size), (bit) + 1))
300 * preamble_index - common variable initialization for nd_label_* routines
317 *free = (unsigned long *) nsindex->free; in preamble_index()
318 *nslot = __le32_to_cpu(nsindex->nslot); in preamble_index()
328 snprintf(label_id->id, ND_LABEL_ID_SIZE, "%s-%pUb", in nd_label_gen_id()
330 return label_id->id; in nd_label_gen_id()
337 return preamble_index(ndd, ndd->ns_current, nsindex, in preamble_current()
345 return preamble_index(ndd, ndd->ns_next, nsindex, in preamble_next()
350 struct nd_namespace_label *nd_label, u32 slot) in slot_valid() argument
353 if (slot != __le32_to_cpu(nd_label->slot)) in slot_valid()
360 sum_save = __le64_to_cpu(nd_label->checksum); in slot_valid()
361 nd_label->checksum = __cpu_to_le64(0); in slot_valid()
363 nd_label->checksum = __cpu_to_le64(sum_save); in slot_valid()
365 dev_dbg(ndd->dev, "fail checksum. slot: %d expect: %#llx\n", in slot_valid()
366 slot, sum); in slot_valid()
378 u32 nslot, slot; in nd_label_reserve_dpa() local
383 for_each_clear_bit_le(slot, free, nslot) { in nd_label_reserve_dpa()
384 struct nvdimm *nvdimm = to_nvdimm(ndd->dev); in nd_label_reserve_dpa()
392 nd_label = to_label(ndd, slot); in nd_label_reserve_dpa()
394 if (!slot_valid(ndd, nd_label, slot)) in nd_label_reserve_dpa()
397 memcpy(label_uuid, nd_label->uuid, NSLABEL_UUID_LEN); in nd_label_reserve_dpa()
398 flags = __le32_to_cpu(nd_label->flags); in nd_label_reserve_dpa()
399 if (test_bit(NDD_NOBLK, &nvdimm->flags)) in nd_label_reserve_dpa()
403 __le64_to_cpu(nd_label->dpa), in nd_label_reserve_dpa()
404 __le64_to_cpu(nd_label->rawsize)); in nd_label_reserve_dpa()
407 return -EBUSY; in nd_label_reserve_dpa()
421 if (ndd->data) in nd_label_data_init()
424 if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) { in nd_label_data_init()
425 dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n", in nd_label_data_init()
426 ndd->nsarea.max_xfer, ndd->nsarea.config_size); in nd_label_data_init()
427 return -ENXIO; in nd_label_data_init()
437 * Start at a label size of 128 as this should result in the largest in nd_label_data_init()
438 * possible namespace index size. in nd_label_data_init()
440 ndd->nslabel_size = 128; in nd_label_data_init()
443 return -ENXIO; in nd_label_data_init()
446 config_size = ndd->nsarea.config_size; in nd_label_data_init()
447 ndd->data = kvzalloc(config_size, GFP_KERNEL); in nd_label_data_init()
448 if (!ndd->data) in nd_label_data_init()
449 return -ENOMEM; in nd_label_data_init()
455 * going to take given our maximum transfer size, and then reduce our in nd_label_data_init()
456 * maximum transfer size based on that result. in nd_label_data_init()
458 max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size); in nd_label_data_init()
461 max_xfer -= ((max_xfer - 1) - (config_size - 1) % max_xfer) / in nd_label_data_init()
468 /* Make our initial read size a multiple of max_xfer size */ in nd_label_data_init()
473 rc = nvdimm_get_config_data(ndd, ndd->data, 0, read_size); in nd_label_data_init()
478 ndd->ns_current = nd_label_validate(ndd); in nd_label_data_init()
479 if (ndd->ns_current < 0) in nd_label_data_init()
483 ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); in nd_label_data_init()
490 offset = __le64_to_cpu(nsindex->labeloff); in nd_label_data_init()
491 nslot = __le32_to_cpu(nsindex->nslot); in nd_label_data_init()
494 for (i = 0; i < nslot; i++, offset += ndd->nslabel_size) { in nd_label_data_init()
498 if (test_bit_le(i, nsindex->free)) { in nd_label_data_init()
499 memset(ndd->data + offset, 0, ndd->nslabel_size); in nd_label_data_init()
504 if (offset + ndd->nslabel_size <= read_size) in nd_label_data_init()
512 label_read_size = offset + ndd->nslabel_size - read_size; in nd_label_data_init()
518 label_read_size = config_size - read_size; in nd_label_data_init()
521 rc = nvdimm_get_config_data(ndd, ndd->data + read_size, in nd_label_data_init()
530 dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc); in nd_label_data_init()
539 u32 nslot, slot; in nd_label_active_count() local
545 for_each_clear_bit_le(slot, free, nslot) { in nd_label_active_count()
548 nd_label = to_label(ndd, slot); in nd_label_active_count()
550 if (!slot_valid(ndd, nd_label, slot)) { in nd_label_active_count()
551 u32 label_slot = __le32_to_cpu(nd_label->slot); in nd_label_active_count()
552 u64 size = __le64_to_cpu(nd_label->rawsize); in nd_label_active_count() local
553 u64 dpa = __le64_to_cpu(nd_label->dpa); in nd_label_active_count()
555 dev_dbg(ndd->dev, in nd_label_active_count()
556 "slot%d invalid slot: %d dpa: %llx size: %llx\n", in nd_label_active_count()
557 slot, label_slot, dpa, size); in nd_label_active_count()
569 u32 nslot, slot; in nd_label_active() local
574 for_each_clear_bit_le(slot, free, nslot) { in nd_label_active()
577 nd_label = to_label(ndd, slot); in nd_label_active()
578 if (!slot_valid(ndd, nd_label, slot)) in nd_label_active()
581 if (n-- == 0) in nd_label_active()
582 return to_label(ndd, slot); in nd_label_active()
592 u32 nslot, slot; in nd_label_alloc_slot() local
597 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_alloc_slot()
599 slot = find_next_bit_le(free, nslot, 0); in nd_label_alloc_slot()
600 if (slot == nslot) in nd_label_alloc_slot()
603 clear_bit_le(slot, free); in nd_label_alloc_slot()
605 return slot; in nd_label_alloc_slot()
608 bool nd_label_free_slot(struct nvdimm_drvdata *ndd, u32 slot) in nd_label_free_slot() argument
617 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_free_slot()
619 if (slot < nslot) in nd_label_free_slot()
620 return !test_and_set_bit_le(slot, free); in nd_label_free_slot()
630 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_nfree()
651 nslot = __le32_to_cpu(nsindex->nslot); in nd_label_write_index()
653 memcpy(nsindex->sig, NSINDEX_SIGNATURE, NSINDEX_SIG_LEN); in nd_label_write_index()
654 memset(&nsindex->flags, 0, 3); in nd_label_write_index()
655 nsindex->labelsize = sizeof_namespace_label(ndd) >> 8; in nd_label_write_index()
656 nsindex->seq = __cpu_to_le32(seq); in nd_label_write_index()
658 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
659 nsindex->myoff = __cpu_to_le64(offset); in nd_label_write_index()
660 nsindex->mysize = __cpu_to_le64(sizeof_namespace_index(ndd)); in nd_label_write_index()
663 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
664 nsindex->otheroff = __cpu_to_le64(offset); in nd_label_write_index()
666 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
667 nsindex->labeloff = __cpu_to_le64(offset); in nd_label_write_index()
668 nsindex->nslot = __cpu_to_le32(nslot); in nd_label_write_index()
669 nsindex->major = __cpu_to_le16(1); in nd_label_write_index()
671 nsindex->minor = __cpu_to_le16(1); in nd_label_write_index()
673 nsindex->minor = __cpu_to_le16(2); in nd_label_write_index()
674 nsindex->checksum = __cpu_to_le64(0); in nd_label_write_index()
676 unsigned long *free = (unsigned long *) nsindex->free; in nd_label_write_index()
680 memset(nsindex->free, 0xff, nfree / 8); in nd_label_write_index()
681 for (i = 0, last_bits = nfree - nslot; i < last_bits; i++) in nd_label_write_index()
685 nsindex->checksum = __cpu_to_le64(checksum); in nd_label_write_index()
686 rc = nvdimm_set_config_data(ndd, __le64_to_cpu(nsindex->myoff), in nd_label_write_index()
695 WARN_ON(index != ndd->ns_next); in nd_label_write_index()
697 ndd->ns_current = nd_label_next_nsindex(ndd->ns_current); in nd_label_write_index()
698 ndd->ns_next = nd_label_next_nsindex(ndd->ns_next); in nd_label_write_index()
699 WARN_ON(ndd->ns_current == ndd->ns_next); in nd_label_write_index()
708 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_offset()
752 u32 slot = to_slot(ndd, victim->label); in reap_victim() local
754 dev_dbg(ndd->dev, "free: %d\n", slot); in reap_victim()
755 nd_label_free_slot(ndd, slot); in reap_victim()
756 victim->label = NULL; in reap_victim()
763 struct nd_namespace_common *ndns = &nspm->nsio.common; in __pmem_label_update()
764 struct nd_interleave_set *nd_set = nd_region->nd_set; in __pmem_label_update()
772 u32 nslot, slot; in __pmem_label_update() local
778 return -ENXIO; in __pmem_label_update()
781 nd_label_gen_id(&label_id, nspm->uuid, 0); in __pmem_label_update()
783 if (strcmp(res->name, label_id.id) == 0) in __pmem_label_update()
788 return -ENXIO; in __pmem_label_update()
792 slot = nd_label_alloc_slot(ndd); in __pmem_label_update()
793 if (slot == UINT_MAX) in __pmem_label_update()
794 return -ENXIO; in __pmem_label_update()
795 dev_dbg(ndd->dev, "allocated: %d\n", slot); in __pmem_label_update()
797 nd_label = to_label(ndd, slot); in __pmem_label_update()
799 memcpy(nd_label->uuid, nspm->uuid, NSLABEL_UUID_LEN); in __pmem_label_update()
800 if (nspm->alt_name) in __pmem_label_update()
801 memcpy(nd_label->name, nspm->alt_name, NSLABEL_NAME_LEN); in __pmem_label_update()
802 nd_label->flags = __cpu_to_le32(flags); in __pmem_label_update()
803 nd_label->nlabel = __cpu_to_le16(nd_region->ndr_mappings); in __pmem_label_update()
804 nd_label->position = __cpu_to_le16(pos); in __pmem_label_update()
805 nd_label->isetcookie = __cpu_to_le64(cookie); in __pmem_label_update()
806 nd_label->rawsize = __cpu_to_le64(resource_size(res)); in __pmem_label_update()
807 nd_label->lbasize = __cpu_to_le64(nspm->lbasize); in __pmem_label_update()
808 nd_label->dpa = __cpu_to_le64(res->start); in __pmem_label_update()
809 nd_label->slot = __cpu_to_le32(slot); in __pmem_label_update()
811 guid_copy(&nd_label->type_guid, &nd_set->type_guid); in __pmem_label_update()
813 guid_copy(&nd_label->abstraction_guid, in __pmem_label_update()
814 to_abstraction_guid(ndns->claim_class, in __pmem_label_update()
815 &nd_label->abstraction_guid)); in __pmem_label_update()
819 nd_label->checksum = __cpu_to_le64(0); in __pmem_label_update()
821 nd_label->checksum = __cpu_to_le64(sum); in __pmem_label_update()
833 mutex_lock(&nd_mapping->lock); in __pmem_label_update()
834 list_for_each_entry(label_ent, &nd_mapping->labels, list) { in __pmem_label_update()
835 if (!label_ent->label) in __pmem_label_update()
837 if (test_and_clear_bit(ND_LABEL_REAP, &label_ent->flags) in __pmem_label_update()
838 || memcmp(nspm->uuid, label_ent->label->uuid, in __pmem_label_update()
844 rc = nd_label_write_index(ndd, ndd->ns_next, in __pmem_label_update()
845 nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0); in __pmem_label_update()
847 list_for_each_entry(label_ent, &nd_mapping->labels, list) in __pmem_label_update()
848 if (!label_ent->label) { in __pmem_label_update()
849 label_ent->label = nd_label; in __pmem_label_update()
853 dev_WARN_ONCE(&nspm->nsio.common.dev, nd_label, in __pmem_label_update()
857 rc = -ENXIO; in __pmem_label_update()
859 mutex_unlock(&nd_mapping->lock); in __pmem_label_update()
868 if (res->flags & DPA_RESOURCE_ADJUSTED) in is_old_resource()
882 if (res->start != __le64_to_cpu(nd_label->dpa)) in to_resource()
884 if (resource_size(res) != __le64_to_cpu(nd_label->rawsize)) in to_resource()
901 int i, alloc, victims, nfree, old_num_resources, nlabel, rc = -ENXIO; in __blk_label_update()
902 struct nd_interleave_set *nd_set = nd_region->nd_set; in __blk_label_update()
903 struct nd_namespace_common *ndns = &nsblk->common; in __blk_label_update()
914 u32 nslot, slot; in __blk_label_update() local
917 return -ENXIO; in __blk_label_update()
919 old_res_list = nsblk->res; in __blk_label_update()
921 old_num_resources = nsblk->num_resources; in __blk_label_update()
922 nd_label_gen_id(&label_id, nsblk->uuid, NSLABEL_FLAG_LOCAL); in __blk_label_update()
929 * disable and re-enable the parent region. in __blk_label_update()
933 if (strcmp(res->name, label_id.id) != 0) in __blk_label_update()
941 /* convert old local-label-map to dimm-slot victim-map */ in __blk_label_update()
944 return -ENOMEM; in __blk_label_update()
947 for_each_clear_bit_le(slot, free, nslot) { in __blk_label_update()
948 nd_label = to_label(ndd, slot); in __blk_label_update()
949 memcpy(uuid, nd_label->uuid, NSLABEL_UUID_LEN); in __blk_label_update()
950 if (memcmp(uuid, nsblk->uuid, NSLABEL_UUID_LEN) != 0) in __blk_label_update()
956 slot = to_slot(ndd, nd_label); in __blk_label_update()
957 set_bit(slot, victim_map); in __blk_label_update()
963 if (nfree - alloc < 0 || nfree - alloc + victims < 1) { in __blk_label_update()
964 dev_info(&nsblk->common.dev, "insufficient label space\n"); in __blk_label_update()
966 return -ENOSPC; in __blk_label_update()
972 nsblk->res = NULL; in __blk_label_update()
973 nsblk->num_resources = 0; in __blk_label_update()
975 if (strcmp(res->name, label_id.id) != 0) in __blk_label_update()
977 if (!nsblk_add_resource(nd_region, ndd, nsblk, res->start)) { in __blk_label_update()
978 rc = -ENOMEM; in __blk_label_update()
984 mutex_lock(&nd_mapping->lock); in __blk_label_update()
985 list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) in __blk_label_update()
986 if (test_and_clear_bit(ND_LABEL_REAP, &label_ent->flags)) { in __blk_label_update()
988 list_move(&label_ent->list, &list); in __blk_label_update()
990 mutex_unlock(&nd_mapping->lock); in __blk_label_update()
996 for (i = 0; i < nsblk->num_resources; i++) { in __blk_label_update()
997 struct resource *min = nsblk->res[min_dpa_idx]; in __blk_label_update()
999 res = nsblk->res[i]; in __blk_label_update()
1000 if (res->start < min->start) in __blk_label_update()
1004 for (i = 0; i < nsblk->num_resources; i++) { in __blk_label_update()
1007 res = nsblk->res[i]; in __blk_label_update()
1009 continue; /* carry-over */ in __blk_label_update()
1010 slot = nd_label_alloc_slot(ndd); in __blk_label_update()
1011 if (slot == UINT_MAX) { in __blk_label_update()
1012 rc = -ENXIO; in __blk_label_update()
1015 dev_dbg(ndd->dev, "allocated: %d\n", slot); in __blk_label_update()
1017 nd_label = to_label(ndd, slot); in __blk_label_update()
1019 memcpy(nd_label->uuid, nsblk->uuid, NSLABEL_UUID_LEN); in __blk_label_update()
1020 if (nsblk->alt_name) in __blk_label_update()
1021 memcpy(nd_label->name, nsblk->alt_name, in __blk_label_update()
1023 nd_label->flags = __cpu_to_le32(NSLABEL_FLAG_LOCAL); in __blk_label_update()
1028 * policy for blk-aperture namespaces. in __blk_label_update()
1032 nd_label->nlabel = __cpu_to_le16(nsblk->num_resources); in __blk_label_update()
1033 nd_label->position = __cpu_to_le16(0); in __blk_label_update()
1035 nd_label->nlabel = __cpu_to_le16(0xffff); in __blk_label_update()
1036 nd_label->position = __cpu_to_le16(0xffff); in __blk_label_update()
1038 nd_label->isetcookie = __cpu_to_le64(nd_set->cookie2); in __blk_label_update()
1040 nd_label->nlabel = __cpu_to_le16(0); /* N/A */ in __blk_label_update()
1041 nd_label->position = __cpu_to_le16(0); /* N/A */ in __blk_label_update()
1042 nd_label->isetcookie = __cpu_to_le64(0); /* N/A */ in __blk_label_update()
1045 nd_label->dpa = __cpu_to_le64(res->start); in __blk_label_update()
1046 nd_label->rawsize = __cpu_to_le64(resource_size(res)); in __blk_label_update()
1047 nd_label->lbasize = __cpu_to_le64(nsblk->lbasize); in __blk_label_update()
1048 nd_label->slot = __cpu_to_le32(slot); in __blk_label_update()
1050 guid_copy(&nd_label->type_guid, &nd_set->type_guid); in __blk_label_update()
1052 guid_copy(&nd_label->abstraction_guid, in __blk_label_update()
1053 to_abstraction_guid(ndns->claim_class, in __blk_label_update()
1054 &nd_label->abstraction_guid)); in __blk_label_update()
1059 nd_label->checksum = __cpu_to_le64(0); in __blk_label_update()
1062 nd_label->checksum = __cpu_to_le64(sum); in __blk_label_update()
1074 for_each_set_bit(slot, victim_map, victim_map ? nslot : 0) { in __blk_label_update()
1075 dev_dbg(ndd->dev, "free: %d\n", slot); in __blk_label_update()
1076 nd_label_free_slot(ndd, slot); in __blk_label_update()
1080 rc = nd_label_write_index(ndd, ndd->ns_next, in __blk_label_update()
1081 nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0); in __blk_label_update()
1086 * Now that the on-dimm labels are up to date, fix up the tracking in __blk_label_update()
1087 * entries in nd_mapping->labels in __blk_label_update()
1090 mutex_lock(&nd_mapping->lock); in __blk_label_update()
1091 list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) { in __blk_label_update()
1092 nd_label = label_ent->label; in __blk_label_update()
1096 memcpy(uuid, nd_label->uuid, NSLABEL_UUID_LEN); in __blk_label_update()
1097 if (memcmp(uuid, nsblk->uuid, NSLABEL_UUID_LEN) != 0) in __blk_label_update()
1099 nlabel--; in __blk_label_update()
1100 list_move(&label_ent->list, &list); in __blk_label_update()
1101 label_ent->label = NULL; in __blk_label_update()
1103 list_splice_tail_init(&list, &nd_mapping->labels); in __blk_label_update()
1104 mutex_unlock(&nd_mapping->lock); in __blk_label_update()
1106 if (nlabel + nsblk->num_resources > num_labels) { in __blk_label_update()
1112 rc = -ENXIO; in __blk_label_update()
1116 mutex_lock(&nd_mapping->lock); in __blk_label_update()
1117 label_ent = list_first_entry_or_null(&nd_mapping->labels, in __blk_label_update()
1121 mutex_unlock(&nd_mapping->lock); in __blk_label_update()
1122 rc = -ENXIO; in __blk_label_update()
1125 for_each_clear_bit_le(slot, free, nslot) { in __blk_label_update()
1126 nd_label = to_label(ndd, slot); in __blk_label_update()
1127 memcpy(uuid, nd_label->uuid, NSLABEL_UUID_LEN); in __blk_label_update()
1128 if (memcmp(uuid, nsblk->uuid, NSLABEL_UUID_LEN) != 0) in __blk_label_update()
1131 res->flags &= ~DPA_RESOURCE_ADJUSTED; in __blk_label_update()
1132 dev_vdbg(&nsblk->common.dev, "assign label slot: %d\n", slot); in __blk_label_update()
1133 list_for_each_entry_from(label_ent, &nd_mapping->labels, list) { in __blk_label_update()
1134 if (label_ent->label) in __blk_label_update()
1136 label_ent->label = nd_label; in __blk_label_update()
1141 dev_WARN(&nsblk->common.dev, in __blk_label_update()
1142 "failed to track label slot%d\n", slot); in __blk_label_update()
1144 mutex_unlock(&nd_mapping->lock); in __blk_label_update()
1157 kfree(nsblk->res); in __blk_label_update()
1158 nsblk->res = old_res_list; in __blk_label_update()
1159 nsblk->num_resources = old_num_resources; in __blk_label_update()
1171 mutex_lock(&nd_mapping->lock); in init_labels()
1172 list_for_each_entry(label_ent, &nd_mapping->labels, list) in init_labels()
1174 mutex_unlock(&nd_mapping->lock); in init_labels()
1183 return -ENOMEM; in init_labels()
1184 mutex_lock(&nd_mapping->lock); in init_labels()
1185 list_add_tail(&label_ent->list, &nd_mapping->labels); in init_labels()
1186 mutex_unlock(&nd_mapping->lock); in init_labels()
1189 if (ndd->ns_current == -1 || ndd->ns_next == -1) in init_labels()
1195 memset(nsindex, 0, ndd->nsarea.config_size); in init_labels()
1197 int rc = nd_label_write_index(ndd, i, 3 - i, ND_NSINDEX_INIT); in init_labels()
1202 ndd->ns_next = 1; in init_labels()
1203 ndd->ns_current = 0; in init_labels()
1216 u32 nslot, slot; in del_labels() local
1226 mutex_lock(&nd_mapping->lock); in del_labels()
1227 list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) { in del_labels()
1228 struct nd_namespace_label *nd_label = label_ent->label; in del_labels()
1233 memcpy(label_uuid, nd_label->uuid, NSLABEL_UUID_LEN); in del_labels()
1236 active--; in del_labels()
1237 slot = to_slot(ndd, nd_label); in del_labels()
1238 nd_label_free_slot(ndd, slot); in del_labels()
1239 dev_dbg(ndd->dev, "free: %d\n", slot); in del_labels()
1240 list_move_tail(&label_ent->list, &list); in del_labels()
1241 label_ent->label = NULL; in del_labels()
1243 list_splice_tail_init(&list, &nd_mapping->labels); in del_labels()
1247 dev_dbg(ndd->dev, "no more active labels\n"); in del_labels()
1249 mutex_unlock(&nd_mapping->lock); in del_labels()
1251 return nd_label_write_index(ndd, ndd->ns_next, in del_labels()
1252 nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0); in del_labels()
1256 struct nd_namespace_pmem *nspm, resource_size_t size) in nd_pmem_namespace_label_update() argument
1260 for (i = 0; i < nd_region->ndr_mappings; i++) { in nd_pmem_namespace_label_update()
1261 struct nd_mapping *nd_mapping = &nd_region->mapping[i]; in nd_pmem_namespace_label_update()
1266 if (size == 0) { in nd_pmem_namespace_label_update()
1267 rc = del_labels(nd_mapping, nspm->uuid); in nd_pmem_namespace_label_update()
1274 if (strncmp(res->name, "pmem", 4) == 0) in nd_pmem_namespace_label_update()
1288 if (size == 0) in nd_pmem_namespace_label_update()
1292 for (i = 0; i < nd_region->ndr_mappings; i++) { in nd_pmem_namespace_label_update()
1293 struct nd_mapping *nd_mapping = &nd_region->mapping[i]; in nd_pmem_namespace_label_update()
1304 struct nd_namespace_blk *nsblk, resource_size_t size) in nd_blk_namespace_label_update() argument
1306 struct nd_mapping *nd_mapping = &nd_region->mapping[0]; in nd_blk_namespace_label_update()
1310 if (size == 0) in nd_blk_namespace_label_update()
1311 return del_labels(nd_mapping, nsblk->uuid); in nd_blk_namespace_label_update()