Commit f68d8531 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm

Pull libnvdimm fixes from Dan Williams:
 "Two fixes:

   - a regression fix for the multiple-pmem-namespace-per-region support
     added in 4.9. Even if an existing environment is not using that
     feature the act of creating and a destroying a single namespace
     with the ndctl utility will lead to the proliferation of extra
     unwanted namespace devices.

   - a fix for the error code returned from the pmem driver when the
     memcpy_mcsafe() routine returns -EFAULT. Btrfs seems to be the only
     block I/O consumer that tries to parse the meaning of the error
     code when it is non-zero.

  Neither of these fixes are critical, the namespace leak is awkward in
  that it can cause device naming to change and complicates debugging
  namespace initialization issues. The error code fix is included out of
  caution for what other consumers might be expecting -EIO for block I/O
  errors"

* 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
  libnvdimm, namespace: fix pmem namespace leak, delete when size set to zero
  pmem: return EIO on read_pmem() failure
parents f5e8c0ff 1f19b983
...@@ -957,6 +957,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val) ...@@ -957,6 +957,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
{ {
resource_size_t allocated = 0, available = 0; resource_size_t allocated = 0, available = 0;
struct nd_region *nd_region = to_nd_region(dev->parent); struct nd_region *nd_region = to_nd_region(dev->parent);
struct nd_namespace_common *ndns = to_ndns(dev);
struct nd_mapping *nd_mapping; struct nd_mapping *nd_mapping;
struct nvdimm_drvdata *ndd; struct nvdimm_drvdata *ndd;
struct nd_label_id label_id; struct nd_label_id label_id;
...@@ -964,7 +965,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val) ...@@ -964,7 +965,7 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
u8 *uuid = NULL; u8 *uuid = NULL;
int rc, i; int rc, i;
if (dev->driver || to_ndns(dev)->claim) if (dev->driver || ndns->claim)
return -EBUSY; return -EBUSY;
if (is_namespace_pmem(dev)) { if (is_namespace_pmem(dev)) {
...@@ -1034,20 +1035,16 @@ static ssize_t __size_store(struct device *dev, unsigned long long val) ...@@ -1034,20 +1035,16 @@ static ssize_t __size_store(struct device *dev, unsigned long long val)
nd_namespace_pmem_set_resource(nd_region, nspm, nd_namespace_pmem_set_resource(nd_region, nspm,
val * nd_region->ndr_mappings); val * nd_region->ndr_mappings);
} else if (is_namespace_blk(dev)) {
struct nd_namespace_blk *nsblk = to_nd_namespace_blk(dev);
/*
* Try to delete the namespace if we deleted all of its
* allocation, this is not the seed device for the
* region, and it is not actively claimed by a btt
* instance.
*/
if (val == 0 && nd_region->ns_seed != dev
&& !nsblk->common.claim)
nd_device_unregister(dev, ND_ASYNC);
} }
/*
* Try to delete the namespace if we deleted all of its
* allocation, this is not the seed device for the region, and
* it is not actively claimed by a btt instance.
*/
if (val == 0 && nd_region->ns_seed != dev && !ndns->claim)
nd_device_unregister(dev, ND_ASYNC);
return rc; return rc;
} }
......
...@@ -90,7 +90,9 @@ static int read_pmem(struct page *page, unsigned int off, ...@@ -90,7 +90,9 @@ static int read_pmem(struct page *page, unsigned int off,
rc = memcpy_from_pmem(mem + off, pmem_addr, len); rc = memcpy_from_pmem(mem + off, pmem_addr, len);
kunmap_atomic(mem); kunmap_atomic(mem);
return rc; if (rc)
return -EIO;
return 0;
} }
static int pmem_do_bvec(struct pmem_device *pmem, struct page *page, static int pmem_do_bvec(struct pmem_device *pmem, struct page *page,
......
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