Lines Matching +full:uuid +full:- +full:dev
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright(c) 2013-2015 Intel Corporation. All rights reserved.
7 #include <linux/uuid.h>
11 #include "nd-core.h"
47 return ndd->nslabel_size; in sizeof_namespace_label()
59 return (ndd->nsarea.config_size - index_size * 2) / in __nvdimm_num_label_slots()
67 tmp_nslot = ndd->nsarea.config_size / sizeof_namespace_label(ndd); in nvdimm_num_label_slots()
84 space = ndd->nsarea.config_size - nslot * sizeof_namespace_label(ndd); in sizeof_namespace_index()
89 dev_err(ndd->dev, "label area (%d) too small to host (%d byte) labels\n", in sizeof_namespace_index()
90 ndd->nsarea.config_size, sizeof_namespace_label(ndd)); in sizeof_namespace_index()
103 * +------------+ in __nd_label_validate()
107 * +------------+ in __nd_label_validate()
111 * +------------+ in __nd_label_validate()
113 * +------------+ in __nd_label_validate()
115 * +------------+ in __nd_label_validate()
119 * +------------+ in __nd_label_validate()
121 * +------------+ in __nd_label_validate()
128 struct device *dev = ndd->dev; in __nd_label_validate() local
139 memcpy(sig, nsindex[i]->sig, NSINDEX_SIG_LEN); in __nd_label_validate()
141 dev_dbg(dev, "nsindex%d signature invalid\n", i); in __nd_label_validate()
146 version = __le16_to_cpu(nsindex[i]->major) * 100 in __nd_label_validate()
147 + __le16_to_cpu(nsindex[i]->minor); in __nd_label_validate()
149 labelsize = 1 << (7 + nsindex[i]->labelsize); in __nd_label_validate()
154 dev_dbg(dev, "nsindex%d labelsize %d invalid\n", in __nd_label_validate()
155 i, nsindex[i]->labelsize); in __nd_label_validate()
159 sum_save = __le64_to_cpu(nsindex[i]->checksum); in __nd_label_validate()
160 nsindex[i]->checksum = __cpu_to_le64(0); in __nd_label_validate()
162 nsindex[i]->checksum = __cpu_to_le64(sum_save); in __nd_label_validate()
164 dev_dbg(dev, "nsindex%d checksum invalid\n", i); in __nd_label_validate()
168 seq = __le32_to_cpu(nsindex[i]->seq); in __nd_label_validate()
170 dev_dbg(dev, "nsindex%d sequence: %#x invalid\n", i, seq); in __nd_label_validate()
175 if (__le64_to_cpu(nsindex[i]->myoff) in __nd_label_validate()
177 dev_dbg(dev, "nsindex%d myoff: %#llx invalid\n", in __nd_label_validate()
179 __le64_to_cpu(nsindex[i]->myoff)); in __nd_label_validate()
182 if (__le64_to_cpu(nsindex[i]->otheroff) in __nd_label_validate()
184 dev_dbg(dev, "nsindex%d otheroff: %#llx invalid\n", in __nd_label_validate()
186 __le64_to_cpu(nsindex[i]->otheroff)); in __nd_label_validate()
189 if (__le64_to_cpu(nsindex[i]->labeloff) in __nd_label_validate()
191 dev_dbg(dev, "nsindex%d labeloff: %#llx invalid\n", in __nd_label_validate()
193 __le64_to_cpu(nsindex[i]->labeloff)); in __nd_label_validate()
197 size = __le64_to_cpu(nsindex[i]->mysize); in __nd_label_validate()
200 dev_dbg(dev, "nsindex%d mysize: %#llx invalid\n", i, size); in __nd_label_validate()
204 nslot = __le32_to_cpu(nsindex[i]->nslot); in __nd_label_validate()
207 > ndd->nsarea.config_size) { in __nd_label_validate()
208 dev_dbg(dev, "nsindex%d nslot: %u invalid, config_size: %#x\n", in __nd_label_validate()
209 i, nslot, ndd->nsarea.config_size); in __nd_label_validate()
228 seq = best_seq(__le32_to_cpu(nsindex[0]->seq), in __nd_label_validate()
229 __le32_to_cpu(nsindex[1]->seq)); in __nd_label_validate()
230 if (seq == (__le32_to_cpu(nsindex[1]->seq) & NSINDEX_SEQ_MASK)) in __nd_label_validate()
237 return -1; in __nd_label_validate()
247 * sizes, but default to v1.2 256-byte namespace labels if in nd_label_validate()
254 ndd->nslabel_size = label_size[i]; in nd_label_validate()
260 return -1; in nd_label_validate()
289 return (label - base) / sizeof_namespace_label(ndd); in to_slot()
308 * preamble_index - common variable initialization for nd_label_* routines
325 *free = (unsigned long *) nsindex->free; in preamble_index()
326 *nslot = __le32_to_cpu(nsindex->nslot); in preamble_index()
332 char *nd_label_gen_id(struct nd_label_id *label_id, const uuid_t *uuid, in nd_label_gen_id() argument
335 if (!label_id || !uuid) in nd_label_gen_id()
337 snprintf(label_id->id, ND_LABEL_ID_SIZE, "pmem-%pUb", uuid); in nd_label_gen_id()
338 return label_id->id; in nd_label_gen_id()
345 return preamble_index(ndd, ndd->ns_current, nsindex, in preamble_current()
353 return preamble_index(ndd, ndd->ns_next, nsindex, in preamble_next()
362 if (!ndd->cxl && !efi_namespace_label_has(ndd, checksum)) in nsl_validate_checksum()
377 if (!ndd->cxl && !efi_namespace_label_has(ndd, checksum)) in nsl_calculate_checksum()
394 dev_dbg(ndd->dev, "fail checksum. slot: %d\n", slot); in slot_valid()
428 return -EBUSY; in nd_label_reserve_dpa()
442 if (ndd->data) in nd_label_data_init()
445 if (ndd->nsarea.status || ndd->nsarea.max_xfer == 0) { in nd_label_data_init()
446 dev_dbg(ndd->dev, "failed to init config data area: (%u:%u)\n", in nd_label_data_init()
447 ndd->nsarea.max_xfer, ndd->nsarea.config_size); in nd_label_data_init()
448 return -ENXIO; in nd_label_data_init()
461 ndd->nslabel_size = 128; in nd_label_data_init()
464 return -ENXIO; in nd_label_data_init()
467 config_size = ndd->nsarea.config_size; in nd_label_data_init()
468 ndd->data = kvzalloc(config_size, GFP_KERNEL); in nd_label_data_init()
469 if (!ndd->data) in nd_label_data_init()
470 return -ENOMEM; in nd_label_data_init()
479 max_xfer = min_t(size_t, ndd->nsarea.max_xfer, config_size); in nd_label_data_init()
482 max_xfer -= ((max_xfer - 1) - (config_size - 1) % max_xfer) / in nd_label_data_init()
494 rc = nvdimm_get_config_data(ndd, ndd->data, 0, read_size); in nd_label_data_init()
499 ndd->ns_current = nd_label_validate(ndd); in nd_label_data_init()
500 if (ndd->ns_current < 0) in nd_label_data_init()
504 ndd->ns_next = nd_label_next_nsindex(ndd->ns_current); in nd_label_data_init()
511 offset = __le64_to_cpu(nsindex->labeloff); in nd_label_data_init()
512 nslot = __le32_to_cpu(nsindex->nslot); in nd_label_data_init()
515 for (i = 0; i < nslot; i++, offset += ndd->nslabel_size) { in nd_label_data_init()
519 if (test_bit_le(i, nsindex->free)) { in nd_label_data_init()
520 memset(ndd->data + offset, 0, ndd->nslabel_size); in nd_label_data_init()
525 if (offset + ndd->nslabel_size <= read_size) in nd_label_data_init()
533 label_read_size = offset + ndd->nslabel_size - read_size; in nd_label_data_init()
539 label_read_size = config_size - read_size; in nd_label_data_init()
542 rc = nvdimm_get_config_data(ndd, ndd->data + read_size, in nd_label_data_init()
551 dev_dbg(ndd->dev, "len: %zu rc: %d\n", offset, rc); in nd_label_data_init()
576 dev_dbg(ndd->dev, in nd_label_active_count()
602 if (n-- == 0) in nd_label_active()
618 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_alloc_slot()
638 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_free_slot()
651 WARN_ON(!is_nvdimm_bus_locked(ndd->dev)); in nd_label_nfree()
672 nslot = __le32_to_cpu(nsindex->nslot); in nd_label_write_index()
674 memcpy(nsindex->sig, NSINDEX_SIGNATURE, NSINDEX_SIG_LEN); in nd_label_write_index()
675 memset(&nsindex->flags, 0, 3); in nd_label_write_index()
676 nsindex->labelsize = sizeof_namespace_label(ndd) >> 8; in nd_label_write_index()
677 nsindex->seq = __cpu_to_le32(seq); in nd_label_write_index()
679 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
680 nsindex->myoff = __cpu_to_le64(offset); in nd_label_write_index()
681 nsindex->mysize = __cpu_to_le64(sizeof_namespace_index(ndd)); in nd_label_write_index()
684 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
685 nsindex->otheroff = __cpu_to_le64(offset); in nd_label_write_index()
687 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_write_index()
688 nsindex->labeloff = __cpu_to_le64(offset); in nd_label_write_index()
689 nsindex->nslot = __cpu_to_le32(nslot); in nd_label_write_index()
690 nsindex->major = __cpu_to_le16(1); in nd_label_write_index()
692 nsindex->minor = __cpu_to_le16(1); in nd_label_write_index()
694 nsindex->minor = __cpu_to_le16(2); in nd_label_write_index()
695 nsindex->checksum = __cpu_to_le64(0); in nd_label_write_index()
697 unsigned long *free = (unsigned long *) nsindex->free; in nd_label_write_index()
701 memset(nsindex->free, 0xff, nfree / 8); in nd_label_write_index()
702 for (i = 0, last_bits = nfree - nslot; i < last_bits; i++) in nd_label_write_index()
706 nsindex->checksum = __cpu_to_le64(checksum); in nd_label_write_index()
707 rc = nvdimm_set_config_data(ndd, __le64_to_cpu(nsindex->myoff), in nd_label_write_index()
716 WARN_ON(index != ndd->ns_next); in nd_label_write_index()
718 ndd->ns_current = nd_label_next_nsindex(ndd->ns_current); in nd_label_write_index()
719 ndd->ns_next = nd_label_next_nsindex(ndd->ns_next); in nd_label_write_index()
720 WARN_ON(ndd->ns_current == ndd->ns_next); in nd_label_write_index()
729 - (unsigned long) to_namespace_index(ndd, 0); in nd_label_offset()
749 static enum nvdimm_claim_class uuid_to_nvdimm_cclass(uuid_t *uuid) in uuid_to_nvdimm_cclass() argument
751 if (uuid_equal(uuid, &nvdimm_btt_uuid)) in uuid_to_nvdimm_cclass()
753 else if (uuid_equal(uuid, &nvdimm_btt2_uuid)) in uuid_to_nvdimm_cclass()
755 else if (uuid_equal(uuid, &nvdimm_pfn_uuid)) in uuid_to_nvdimm_cclass()
757 else if (uuid_equal(uuid, &nvdimm_dax_uuid)) in uuid_to_nvdimm_cclass()
759 else if (uuid_equal(uuid, &uuid_null)) in uuid_to_nvdimm_cclass()
801 * know the claim_class, don't touch the existing uuid. in to_abstraction_uuid()
812 u32 slot = to_slot(ndd, victim->label); in reap_victim()
814 dev_dbg(ndd->dev, "free: %d\n", slot); in reap_victim()
816 victim->label = NULL; in reap_victim()
823 guid_copy(&nd_label->efi.type_guid, guid); in nsl_set_type_guid()
829 if (ndd->cxl || !efi_namespace_label_has(ndd, type_guid)) in nsl_validate_type_guid()
831 if (!guid_equal(&nd_label->efi.type_guid, guid)) { in nsl_validate_type_guid()
832 dev_dbg(ndd->dev, "expect type_guid %pUb got %pUb\n", guid, in nsl_validate_type_guid()
833 &nd_label->efi.type_guid); in nsl_validate_type_guid()
843 if (ndd->cxl) { in nsl_set_claim_class()
844 uuid_t uuid; in nsl_set_claim_class() local
846 import_uuid(&uuid, nd_label->cxl.abstraction_uuid); in nsl_set_claim_class()
847 export_uuid(nd_label->cxl.abstraction_uuid, in nsl_set_claim_class()
848 to_abstraction_uuid(claim_class, &uuid)); in nsl_set_claim_class()
854 guid_copy(&nd_label->efi.abstraction_guid, in nsl_set_claim_class()
856 &nd_label->efi.abstraction_guid)); in nsl_set_claim_class()
862 if (ndd->cxl) { in nsl_get_claim_class()
863 uuid_t uuid; in nsl_get_claim_class() local
865 import_uuid(&uuid, nd_label->cxl.abstraction_uuid); in nsl_get_claim_class()
866 return uuid_to_nvdimm_cclass(&uuid); in nsl_get_claim_class()
870 return guid_to_nvdimm_cclass(&nd_label->efi.abstraction_guid); in nsl_get_claim_class()
877 struct nd_namespace_common *ndns = &nspm->nsio.common; in __pmem_label_update()
878 struct nd_interleave_set *nd_set = nd_region->nd_set; in __pmem_label_update()
892 return -ENXIO; in __pmem_label_update()
895 nd_label_gen_id(&label_id, nspm->uuid, 0); in __pmem_label_update()
897 if (strcmp(res->name, label_id.id) == 0) in __pmem_label_update()
902 return -ENXIO; in __pmem_label_update()
908 return -ENXIO; in __pmem_label_update()
909 dev_dbg(ndd->dev, "allocated: %d\n", slot); in __pmem_label_update()
913 nsl_set_uuid(ndd, nd_label, nspm->uuid); in __pmem_label_update()
914 nsl_set_name(ndd, nd_label, nspm->alt_name); in __pmem_label_update()
916 nsl_set_nlabel(ndd, nd_label, nd_region->ndr_mappings); in __pmem_label_update()
921 nsl_set_lbasize(ndd, nd_label, nspm->lbasize); in __pmem_label_update()
922 nsl_set_dpa(ndd, nd_label, res->start); in __pmem_label_update()
924 nsl_set_type_guid(ndd, nd_label, &nd_set->type_guid); in __pmem_label_update()
925 nsl_set_claim_class(ndd, nd_label, ndns->claim_class); in __pmem_label_update()
937 mutex_lock(&nd_mapping->lock); in __pmem_label_update()
938 list_for_each_entry(label_ent, &nd_mapping->labels, list) { in __pmem_label_update()
939 if (!label_ent->label) in __pmem_label_update()
941 if (test_and_clear_bit(ND_LABEL_REAP, &label_ent->flags) || in __pmem_label_update()
942 nsl_uuid_equal(ndd, label_ent->label, nspm->uuid)) in __pmem_label_update()
947 rc = nd_label_write_index(ndd, ndd->ns_next, in __pmem_label_update()
948 nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0); in __pmem_label_update()
950 list_for_each_entry(label_ent, &nd_mapping->labels, list) in __pmem_label_update()
951 if (!label_ent->label) { in __pmem_label_update()
952 label_ent->label = nd_label; in __pmem_label_update()
956 dev_WARN_ONCE(&nspm->nsio.common.dev, nd_label, in __pmem_label_update()
960 rc = -ENXIO; in __pmem_label_update()
962 mutex_unlock(&nd_mapping->lock); in __pmem_label_update()
974 mutex_lock(&nd_mapping->lock); in init_labels()
975 list_for_each_entry(label_ent, &nd_mapping->labels, list) in init_labels()
977 mutex_unlock(&nd_mapping->lock); in init_labels()
986 return -ENOMEM; in init_labels()
987 mutex_lock(&nd_mapping->lock); in init_labels()
988 list_add_tail(&label_ent->list, &nd_mapping->labels); in init_labels()
989 mutex_unlock(&nd_mapping->lock); in init_labels()
992 if (ndd->ns_current == -1 || ndd->ns_next == -1) in init_labels()
998 memset(nsindex, 0, ndd->nsarea.config_size); in init_labels()
1000 int rc = nd_label_write_index(ndd, i, 3 - i, ND_NSINDEX_INIT); in init_labels()
1005 ndd->ns_next = 1; in init_labels()
1006 ndd->ns_current = 0; in init_labels()
1011 static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid) in del_labels() argument
1021 if (!uuid) in del_labels()
1028 mutex_lock(&nd_mapping->lock); in del_labels()
1029 list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) { in del_labels()
1030 struct nd_namespace_label *nd_label = label_ent->label; in del_labels()
1035 if (!nsl_uuid_equal(ndd, nd_label, uuid)) in del_labels()
1037 active--; in del_labels()
1040 dev_dbg(ndd->dev, "free: %d\n", slot); in del_labels()
1041 list_move_tail(&label_ent->list, &list); in del_labels()
1042 label_ent->label = NULL; in del_labels()
1044 list_splice_tail_init(&list, &nd_mapping->labels); in del_labels()
1048 dev_dbg(ndd->dev, "no more active labels\n"); in del_labels()
1050 mutex_unlock(&nd_mapping->lock); in del_labels()
1052 return nd_label_write_index(ndd, ndd->ns_next, in del_labels()
1053 nd_inc_seq(__le32_to_cpu(nsindex->seq)), 0); in del_labels()
1061 for (i = 0; i < nd_region->ndr_mappings; i++) { in nd_pmem_namespace_label_update()
1062 struct nd_mapping *nd_mapping = &nd_region->mapping[i]; in nd_pmem_namespace_label_update()
1068 rc = del_labels(nd_mapping, nspm->uuid); in nd_pmem_namespace_label_update()
1075 if (strncmp(res->name, "pmem", 4) == 0) in nd_pmem_namespace_label_update()
1093 for (i = 0; i < nd_region->ndr_mappings; i++) { in nd_pmem_namespace_label_update()
1094 struct nd_mapping *nd_mapping = &nd_region->mapping[i]; in nd_pmem_namespace_label_update()