Merge tag 'for-linus-20180920' of git://git.kernel.dk/linux-block
[sfrench/cifs-2.6.git] / drivers / nvdimm / namespace_devs.c
index 28afdd668905019472d802be06695bfc06897b48..4a4266250c28cfde56b08a2aa7ce04a27d6e6527 100644 (file)
@@ -799,7 +799,7 @@ static int merge_dpa(struct nd_region *nd_region,
        return 0;
 }
 
-static int __reserve_free_pmem(struct device *dev, void *data)
+int __reserve_free_pmem(struct device *dev, void *data)
 {
        struct nvdimm *nvdimm = data;
        struct nd_region *nd_region;
@@ -836,7 +836,7 @@ static int __reserve_free_pmem(struct device *dev, void *data)
        return 0;
 }
 
-static void release_free_pmem(struct nvdimm_bus *nvdimm_bus,
+void release_free_pmem(struct nvdimm_bus *nvdimm_bus,
                struct nd_mapping *nd_mapping)
 {
        struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
@@ -1032,7 +1032,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
 
                allocated += nvdimm_allocated_dpa(ndd, &label_id);
        }
-       available = nd_region_available_dpa(nd_region);
+       available = nd_region_allocatable_dpa(nd_region);
 
        if (val > available + allocated)
                return -ENOSPC;
@@ -1144,6 +1144,26 @@ resource_size_t nvdimm_namespace_capacity(struct nd_namespace_common *ndns)
 }
 EXPORT_SYMBOL(nvdimm_namespace_capacity);
 
+bool nvdimm_namespace_locked(struct nd_namespace_common *ndns)
+{
+       int i;
+       bool locked = false;
+       struct device *dev = &ndns->dev;
+       struct nd_region *nd_region = to_nd_region(dev->parent);
+
+       for (i = 0; i < nd_region->ndr_mappings; i++) {
+               struct nd_mapping *nd_mapping = &nd_region->mapping[i];
+               struct nvdimm *nvdimm = nd_mapping->nvdimm;
+
+               if (test_bit(NDD_LOCKED, &nvdimm->flags)) {
+                       dev_dbg(dev, "%s locked\n", nvdimm_name(nvdimm));
+                       locked = true;
+               }
+       }
+       return locked;
+}
+EXPORT_SYMBOL(nvdimm_namespace_locked);
+
 static ssize_t size_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {
@@ -1695,6 +1715,9 @@ struct nd_namespace_common *nvdimm_namespace_common_probe(struct device *dev)
                }
        }
 
+       if (nvdimm_namespace_locked(ndns))
+               return ERR_PTR(-EACCES);
+
        size = nvdimm_namespace_capacity(ndns);
        if (size < ND_MIN_NAMESPACE_SIZE) {
                dev_dbg(&ndns->dev, "%pa, too small must be at least %#x\n",