libnvdimm, dax: fix deletion
[cascardo/linux.git] / drivers / nvdimm / claim.c
index 5f53db5..8b2e3c4 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;