|
|
@@ -625,7 +625,7 @@ static const guid_t *to_abstraction_guid(enum nvdimm_claim_class claim_class,
|
|
|
|
|
|
static int __pmem_label_update(struct nd_region *nd_region,
|
|
|
struct nd_mapping *nd_mapping, struct nd_namespace_pmem *nspm,
|
|
|
- int pos)
|
|
|
+ int pos, unsigned long flags)
|
|
|
{
|
|
|
struct nd_namespace_common *ndns = &nspm->nsio.common;
|
|
|
struct nd_interleave_set *nd_set = nd_region->nd_set;
|
|
|
@@ -666,7 +666,7 @@ static int __pmem_label_update(struct nd_region *nd_region,
|
|
|
memcpy(nd_label->uuid, nspm->uuid, NSLABEL_UUID_LEN);
|
|
|
if (nspm->alt_name)
|
|
|
memcpy(nd_label->name, nspm->alt_name, NSLABEL_NAME_LEN);
|
|
|
- nd_label->flags = __cpu_to_le32(NSLABEL_FLAG_UPDATING);
|
|
|
+ nd_label->flags = __cpu_to_le32(flags);
|
|
|
nd_label->nlabel = __cpu_to_le16(nd_region->ndr_mappings);
|
|
|
nd_label->position = __cpu_to_le16(pos);
|
|
|
nd_label->isetcookie = __cpu_to_le64(cookie);
|
|
|
@@ -1120,13 +1120,13 @@ static int del_labels(struct nd_mapping *nd_mapping, u8 *uuid)
|
|
|
int nd_pmem_namespace_label_update(struct nd_region *nd_region,
|
|
|
struct nd_namespace_pmem *nspm, resource_size_t size)
|
|
|
{
|
|
|
- int i;
|
|
|
+ int i, rc;
|
|
|
|
|
|
for (i = 0; i < nd_region->ndr_mappings; i++) {
|
|
|
struct nd_mapping *nd_mapping = &nd_region->mapping[i];
|
|
|
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
|
|
|
struct resource *res;
|
|
|
- int rc, count = 0;
|
|
|
+ int count = 0;
|
|
|
|
|
|
if (size == 0) {
|
|
|
rc = del_labels(nd_mapping, nspm->uuid);
|
|
|
@@ -1144,7 +1144,20 @@ int nd_pmem_namespace_label_update(struct nd_region *nd_region,
|
|
|
if (rc < 0)
|
|
|
return rc;
|
|
|
|
|
|
- rc = __pmem_label_update(nd_region, nd_mapping, nspm, i);
|
|
|
+ rc = __pmem_label_update(nd_region, nd_mapping, nspm, i,
|
|
|
+ NSLABEL_FLAG_UPDATING);
|
|
|
+ if (rc)
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (size == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /* Clear the UPDATING flag per UEFI 2.7 expectations */
|
|
|
+ for (i = 0; i < nd_region->ndr_mappings; i++) {
|
|
|
+ struct nd_mapping *nd_mapping = &nd_region->mapping[i];
|
|
|
+
|
|
|
+ rc = __pmem_label_update(nd_region, nd_mapping, nspm, i, 0);
|
|
|
if (rc)
|
|
|
return rc;
|
|
|
}
|