Merge tag 'xfs-5.1-merge-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux-2.6-microblaze.git] / drivers / nvdimm / label.c
index a11bf4e..f3d753d 100644 (file)
@@ -392,6 +392,7 @@ int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd)
                return 0; /* no label, nothing to reserve */
 
        for_each_clear_bit_le(slot, free, nslot) {
+               struct nvdimm *nvdimm = to_nvdimm(ndd->dev);
                struct nd_namespace_label *nd_label;
                struct nd_region *nd_region = NULL;
                u8 label_uuid[NSLABEL_UUID_LEN];
@@ -406,6 +407,8 @@ int nd_label_reserve_dpa(struct nvdimm_drvdata *ndd)
 
                memcpy(label_uuid, nd_label->uuid, NSLABEL_UUID_LEN);
                flags = __le32_to_cpu(nd_label->flags);
+               if (test_bit(NDD_NOBLK, &nvdimm->flags))
+                       flags &= ~NSLABEL_FLAG_LOCAL;
                nd_label_gen_id(&label_id, label_uuid, flags);
                res = nvdimm_allocate_dpa(ndd, &label_id,
                                __le64_to_cpu(nd_label->dpa),
@@ -755,7 +758,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;
@@ -796,7 +799,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);
@@ -1249,13 +1252,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);
@@ -1273,7 +1276,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;
        }