libnvdimm/labels: Add blk special cases for nlabel and position 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.

Finish off the BLK-mode specific helper conversion with the nlabel and
position behaviour that is specific to EFI v1.2 labels and not the
original v1.1 definition.

Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
Link: https://lore.kernel.org/r/162982115698.1124374.10182273478536799613.stgit@dwillia2-desk3.amr.corp.intel.com
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2021-08-24 09:05:57 -07:00
parent f56541a712
commit de8fa48b9a

View File

@ -898,6 +898,10 @@ static struct resource *to_resource(struct nvdimm_drvdata *ndd,
return NULL; return NULL;
} }
/*
* Use the presence of the type_guid as a flag to determine isetcookie
* usage and nlabel + position policy for blk-aperture namespaces.
*/
static void nsl_set_blk_isetcookie(struct nvdimm_drvdata *ndd, static void nsl_set_blk_isetcookie(struct nvdimm_drvdata *ndd,
struct nd_namespace_label *nd_label, struct nd_namespace_label *nd_label,
u64 isetcookie) u64 isetcookie)
@ -925,6 +929,28 @@ bool nsl_validate_blk_isetcookie(struct nvdimm_drvdata *ndd,
return true; return true;
} }
static void nsl_set_blk_nlabel(struct nvdimm_drvdata *ndd,
struct nd_namespace_label *nd_label, int nlabel,
bool first)
{
if (!namespace_label_has(ndd, type_guid)) {
nsl_set_nlabel(ndd, nd_label, 0); /* N/A */
return;
}
nsl_set_nlabel(ndd, nd_label, first ? nlabel : 0xffff);
}
static void nsl_set_blk_position(struct nvdimm_drvdata *ndd,
struct nd_namespace_label *nd_label,
bool first)
{
if (!namespace_label_has(ndd, type_guid)) {
nsl_set_position(ndd, nd_label, 0);
return;
}
nsl_set_position(ndd, nd_label, first ? 0 : 0xffff);
}
/* /*
* 1/ Account all the labels that can be freed after this update * 1/ Account all the labels that can be freed after this update
* 2/ Allocate and write the label to the staging (next) index * 2/ Allocate and write the label to the staging (next) index
@ -1056,23 +1082,9 @@ static int __blk_label_update(struct nd_region *nd_region,
nsl_set_name(ndd, nd_label, nsblk->alt_name); nsl_set_name(ndd, nd_label, nsblk->alt_name);
nsl_set_flags(ndd, nd_label, NSLABEL_FLAG_LOCAL); nsl_set_flags(ndd, nd_label, NSLABEL_FLAG_LOCAL);
/* nsl_set_blk_nlabel(ndd, nd_label, nsblk->num_resources,
* Use the presence of the type_guid as a flag to i == min_dpa_idx);
* determine isetcookie usage and nlabel + position nsl_set_blk_position(ndd, nd_label, i == min_dpa_idx);
* policy for blk-aperture namespaces.
*/
if (namespace_label_has(ndd, type_guid)) {
if (i == min_dpa_idx) {
nsl_set_nlabel(ndd, nd_label, nsblk->num_resources);
nsl_set_position(ndd, nd_label, 0);
} else {
nsl_set_nlabel(ndd, nd_label, 0xffff);
nsl_set_position(ndd, nd_label, 0xffff);
}
} else {
nsl_set_nlabel(ndd, nd_label, 0); /* N/A */
nsl_set_position(ndd, nd_label, 0); /* N/A */
}
nsl_set_blk_isetcookie(ndd, nd_label, nd_set->cookie2); nsl_set_blk_isetcookie(ndd, nd_label, nd_set->cookie2);
nsl_set_dpa(ndd, nd_label, res->start); nsl_set_dpa(ndd, nd_label, res->start);