Skip to content

Commit a6e6d72

Browse files
committed
libnvdimm/labels: Add claim class helpers
In preparation for LIBNVDIMM to manage labels on CXL devices deploy helpers that abstract the label type from the implementation. The CXL label format is mostly similar to the EFI label format with concepts / fields added, like dynamic region creation and label type guids, and other concepts removed like BLK-mode and interleave-set-cookie ids. CXL labels do have the concept of a claim class represented by an "abstraction" identifier. It turns out both label implementations use the same ids, but EFI encodes them as GUIDs and CXL labels encode them as UUIDs. For now abstract out the claim class such that the UUID vs GUID distinction can later be hidden in the helper. Reviewed-by: Jonathan Cameron <[email protected]> Link: https://lore.kernel.org/r/162982116719.1124374.9917866609080940364.stgit@dwillia2-desk3.amr.corp.intel.com Signed-off-by: Dan Williams <[email protected]>
1 parent 8b03aa0 commit a6e6d72

File tree

4 files changed

+28
-19
lines changed

4 files changed

+28
-19
lines changed

drivers/nvdimm/label.c

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ static unsigned long nd_label_offset(struct nvdimm_drvdata *ndd,
724724
- (unsigned long) to_namespace_index(ndd, 0);
725725
}
726726

727-
enum nvdimm_claim_class to_nvdimm_cclass(guid_t *guid)
727+
static enum nvdimm_claim_class to_nvdimm_cclass(guid_t *guid)
728728
{
729729
if (guid_equal(guid, &nvdimm_btt_guid))
730730
return NVDIMM_CCLASS_BTT;
@@ -792,6 +792,25 @@ bool nsl_validate_type_guid(struct nvdimm_drvdata *ndd,
792792
return true;
793793
}
794794

795+
static void nsl_set_claim_class(struct nvdimm_drvdata *ndd,
796+
struct nd_namespace_label *nd_label,
797+
enum nvdimm_claim_class claim_class)
798+
{
799+
if (!namespace_label_has(ndd, abstraction_guid))
800+
return;
801+
guid_copy(&nd_label->abstraction_guid,
802+
to_abstraction_guid(claim_class,
803+
&nd_label->abstraction_guid));
804+
}
805+
806+
enum nvdimm_claim_class nsl_get_claim_class(struct nvdimm_drvdata *ndd,
807+
struct nd_namespace_label *nd_label)
808+
{
809+
if (!namespace_label_has(ndd, abstraction_guid))
810+
return NVDIMM_CCLASS_NONE;
811+
return to_nvdimm_cclass(&nd_label->abstraction_guid);
812+
}
813+
795814
static int __pmem_label_update(struct nd_region *nd_region,
796815
struct nd_mapping *nd_mapping, struct nd_namespace_pmem *nspm,
797816
int pos, unsigned long flags)
@@ -843,10 +862,7 @@ static int __pmem_label_update(struct nd_region *nd_region,
843862
nsl_set_dpa(ndd, nd_label, res->start);
844863
nsl_set_slot(ndd, nd_label, slot);
845864
nsl_set_type_guid(ndd, nd_label, &nd_set->type_guid);
846-
if (namespace_label_has(ndd, abstraction_guid))
847-
guid_copy(&nd_label->abstraction_guid,
848-
to_abstraction_guid(ndns->claim_class,
849-
&nd_label->abstraction_guid));
865+
nsl_set_claim_class(ndd, nd_label, ndns->claim_class);
850866
nsl_calculate_checksum(ndd, nd_label);
851867
nd_dbg_dpa(nd_region, ndd, res, "\n");
852868

@@ -1111,10 +1127,7 @@ static int __blk_label_update(struct nd_region *nd_region,
11111127
nsl_set_lbasize(ndd, nd_label, nsblk->lbasize);
11121128
nsl_set_slot(ndd, nd_label, slot);
11131129
nsl_set_type_guid(ndd, nd_label, &nd_set->type_guid);
1114-
if (namespace_label_has(ndd, abstraction_guid))
1115-
guid_copy(&nd_label->abstraction_guid,
1116-
to_abstraction_guid(ndns->claim_class,
1117-
&nd_label->abstraction_guid));
1130+
nsl_set_claim_class(ndd, nd_label, ndns->claim_class);
11181131
nsl_calculate_checksum(ndd, nd_label);
11191132

11201133
/* update label */

drivers/nvdimm/label.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,6 @@ struct nd_namespace_label *nd_label_active(struct nvdimm_drvdata *ndd, int n);
135135
u32 nd_label_alloc_slot(struct nvdimm_drvdata *ndd);
136136
bool nd_label_free_slot(struct nvdimm_drvdata *ndd, u32 slot);
137137
u32 nd_label_nfree(struct nvdimm_drvdata *ndd);
138-
enum nvdimm_claim_class to_nvdimm_cclass(guid_t *guid);
139138
struct nd_region;
140139
struct nd_namespace_pmem;
141140
struct nd_namespace_blk;

drivers/nvdimm/namespace_devs.c

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,10 +2042,8 @@ static struct device *create_namespace_pmem(struct nd_region *nd_region,
20422042
nspm->uuid = kmemdup((void __force *) label0->uuid,
20432043
NSLABEL_UUID_LEN, GFP_KERNEL);
20442044
nspm->lbasize = nsl_get_lbasize(ndd, label0);
2045-
if (namespace_label_has(ndd, abstraction_guid))
2046-
nspm->nsio.common.claim_class
2047-
= to_nvdimm_cclass(&label0->abstraction_guid);
2048-
2045+
nspm->nsio.common.claim_class =
2046+
nsl_get_claim_class(ndd, label0);
20492047
}
20502048

20512049
if (!nspm->alt_name || !nspm->uuid) {
@@ -2273,11 +2271,8 @@ static struct device *create_namespace_blk(struct nd_region *nd_region,
22732271
dev->parent = &nd_region->dev;
22742272
nsblk->id = -1;
22752273
nsblk->lbasize = nsl_get_lbasize(ndd, nd_label);
2276-
nsblk->uuid = kmemdup(nd_label->uuid, NSLABEL_UUID_LEN,
2277-
GFP_KERNEL);
2278-
if (namespace_label_has(ndd, abstraction_guid))
2279-
nsblk->common.claim_class
2280-
= to_nvdimm_cclass(&nd_label->abstraction_guid);
2274+
nsblk->uuid = kmemdup(nd_label->uuid, NSLABEL_UUID_LEN, GFP_KERNEL);
2275+
nsblk->common.claim_class = nsl_get_claim_class(ndd, nd_label);
22812276
if (!nsblk->uuid)
22822277
goto blk_err;
22832278
nsl_get_name(ndd, nd_label, name);

drivers/nvdimm/nd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ bool nsl_validate_blk_isetcookie(struct nvdimm_drvdata *ndd,
182182
u64 isetcookie);
183183
bool nsl_validate_type_guid(struct nvdimm_drvdata *ndd,
184184
struct nd_namespace_label *nd_label, guid_t *guid);
185+
enum nvdimm_claim_class nsl_get_claim_class(struct nvdimm_drvdata *ndd,
186+
struct nd_namespace_label *nd_label);
185187

186188
struct nd_region_data {
187189
int ns_count;

0 commit comments

Comments
 (0)