libnvdimm, dax: fix deletion
authorDan Williams <dan.j.williams@intel.com>
Sat, 21 May 2016 19:22:41 +0000 (12:22 -0700)
committerDan Williams <dan.j.williams@intel.com>
Sat, 21 May 2016 19:22:41 +0000 (12:22 -0700)
The ndctl unit tests discovered that the dax enabling omitted updates to
nd_detach_and_reset().  This routine clears device the configuration
when the namespace is detached.  Without this clearing userspace may
assume that the device is in the process of being configured by another
agent in the system.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/nvdimm/claim.c
drivers/nvdimm/nd-core.h
drivers/nvdimm/pfn_devs.c

index 5f53db59a058b79be2a1de225450d8fef7f508e9..8b2e3c4fb0add718d2dbf167b499516a94612c80 100644 (file)
@@ -93,6 +93,25 @@ static bool is_idle(struct device *dev, struct nd_namespace_common *ndns)
        return true;
 }
 
+struct nd_pfn *to_nd_pfn_safe(struct device *dev)
+{
+       /*
+        * pfn device attributes are re-used by dax device instances, so we
+        * need to be careful to correct device-to-nd_pfn conversion.
+        */
+       if (is_nd_pfn(dev))
+               return to_nd_pfn(dev);
+
+       if (is_nd_dax(dev)) {
+               struct nd_dax *nd_dax = to_nd_dax(dev);
+
+               return &nd_dax->nd_pfn;
+       }
+
+       WARN_ON(1);
+       return NULL;
+}
+
 static void nd_detach_and_reset(struct device *dev,
                struct nd_namespace_common **_ndns)
 {
@@ -106,8 +125,8 @@ static void nd_detach_and_reset(struct device *dev,
                nd_btt->lbasize = 0;
                kfree(nd_btt->uuid);
                nd_btt->uuid = NULL;
-       } else if (is_nd_pfn(dev)) {
-               struct nd_pfn *nd_pfn = to_nd_pfn(dev);
+       } else if (is_nd_pfn(dev) || is_nd_dax(dev)) {
+               struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
 
                kfree(nd_pfn->uuid);
                nd_pfn->uuid = NULL;
index 4136c1a8253949beb006890dfb5ba2b77bb78932..6c42eda025f97bcc5a7f9b58f9b9dc75bfed3ba3 100644 (file)
@@ -94,4 +94,5 @@ bool __nd_attach_ndns(struct device *dev, struct nd_namespace_common *attach,
 ssize_t nd_namespace_store(struct device *dev,
                struct nd_namespace_common **_ndns, const char *buf,
                size_t len);
+struct nd_pfn *to_nd_pfn_safe(struct device *dev);
 #endif /* __ND_CORE_H__ */
index 04f71d6d304d1567d3802363c50f93cc91be7d02..436191c470774bd7fb1505da375e1e367ae73468 100644 (file)
@@ -54,25 +54,6 @@ struct nd_pfn *to_nd_pfn(struct device *dev)
 }
 EXPORT_SYMBOL(to_nd_pfn);
 
-static struct nd_pfn *to_nd_pfn_safe(struct device *dev)
-{
-       /*
-        * pfn device attributes are re-used by dax device instances, so we
-        * need to be careful to correct device-to-nd_pfn conversion.
-        */
-       if (is_nd_pfn(dev))
-               return to_nd_pfn(dev);
-
-       if (is_nd_dax(dev)) {
-               struct nd_dax *nd_dax = to_nd_dax(dev);
-
-               return &nd_dax->nd_pfn;
-       }
-
-       WARN_ON(1);
-       return NULL;
-}
-
 static ssize_t mode_show(struct device *dev,
                struct device_attribute *attr, char *buf)
 {