Commit 03dca343 authored by Dan Williams's avatar Dan Williams

libnvdimm, dax: fix deletion

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: default avatarDan Williams <dan.j.williams@intel.com>
parent 5e24c9fd
...@@ -93,6 +93,25 @@ static bool is_idle(struct device *dev, struct nd_namespace_common *ndns) ...@@ -93,6 +93,25 @@ static bool is_idle(struct device *dev, struct nd_namespace_common *ndns)
return true; 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, static void nd_detach_and_reset(struct device *dev,
struct nd_namespace_common **_ndns) struct nd_namespace_common **_ndns)
{ {
...@@ -106,8 +125,8 @@ static void nd_detach_and_reset(struct device *dev, ...@@ -106,8 +125,8 @@ static void nd_detach_and_reset(struct device *dev,
nd_btt->lbasize = 0; nd_btt->lbasize = 0;
kfree(nd_btt->uuid); kfree(nd_btt->uuid);
nd_btt->uuid = NULL; nd_btt->uuid = NULL;
} else if (is_nd_pfn(dev)) { } else if (is_nd_pfn(dev) || is_nd_dax(dev)) {
struct nd_pfn *nd_pfn = to_nd_pfn(dev); struct nd_pfn *nd_pfn = to_nd_pfn_safe(dev);
kfree(nd_pfn->uuid); kfree(nd_pfn->uuid);
nd_pfn->uuid = NULL; nd_pfn->uuid = NULL;
......
...@@ -94,4 +94,5 @@ bool __nd_attach_ndns(struct device *dev, struct nd_namespace_common *attach, ...@@ -94,4 +94,5 @@ bool __nd_attach_ndns(struct device *dev, struct nd_namespace_common *attach,
ssize_t nd_namespace_store(struct device *dev, ssize_t nd_namespace_store(struct device *dev,
struct nd_namespace_common **_ndns, const char *buf, struct nd_namespace_common **_ndns, const char *buf,
size_t len); size_t len);
struct nd_pfn *to_nd_pfn_safe(struct device *dev);
#endif /* __ND_CORE_H__ */ #endif /* __ND_CORE_H__ */
...@@ -54,25 +54,6 @@ struct nd_pfn *to_nd_pfn(struct device *dev) ...@@ -54,25 +54,6 @@ struct nd_pfn *to_nd_pfn(struct device *dev)
} }
EXPORT_SYMBOL(to_nd_pfn); 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, static ssize_t mode_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment