Commit 7ba34c0c authored by Linus Torvalds's avatar Linus Torvalds

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

Pull libnvdimm fixes from Dan Williams:
 "A couple of fixes for long standing bugs, a warning fixup, and some
  miscellaneous dax cleanups.

  The bugs were recently found due to new platforms looking to use the
  ACPI NFIT "virtual" device definition, and new error injection
  capabilities to trigger error responses to label area requests. Ira's
  cleanups have been long pending, I neglected to send them earlier, and
  see no harm in including them now. This has all appeared in -next with
  no reported issues.

  Summary:

   - Fix support for NFIT "virtual" ranges (BIOS-defined memory disks)

   - Fix recovery from failed label storage areas on NVDIMM devices

   - Miscellaneous cleanups from Ira's investigation of
     dax_direct_access paths preparing for stray-write protection"

* tag 'libnvdimm-fixes-5.14-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm:
  tools/testing/nvdimm: Fix missing 'fallthrough' warning
  libnvdimm/region: Fix label activation vs errors
  ACPI: NFIT: Fix support for virtual SPA ranges
  dax: Ensure errno is returned from dax_direct_access
  fs/dax: Clarify nr_pages to dax_direct_access()
  fs/fuse: Remove unneeded kaddr parameter
parents 12f41321 96dcb97d
...@@ -3021,6 +3021,9 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc, ...@@ -3021,6 +3021,9 @@ static int acpi_nfit_register_region(struct acpi_nfit_desc *acpi_desc,
struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev; struct acpi_nfit_memory_map *memdev = nfit_memdev->memdev;
struct nd_mapping_desc *mapping; struct nd_mapping_desc *mapping;
/* range index 0 == unmapped in SPA or invalid-SPA */
if (memdev->range_index == 0 || spa->range_index == 0)
continue;
if (memdev->range_index != spa->range_index) if (memdev->range_index != spa->range_index)
continue; continue;
if (count >= ND_MAX_MAPPINGS) { if (count >= ND_MAX_MAPPINGS) {
......
...@@ -313,7 +313,7 @@ long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages, ...@@ -313,7 +313,7 @@ long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
return -ENXIO; return -ENXIO;
if (nr_pages < 0) if (nr_pages < 0)
return nr_pages; return -EINVAL;
avail = dax_dev->ops->direct_access(dax_dev, pgoff, nr_pages, avail = dax_dev->ops->direct_access(dax_dev, pgoff, nr_pages,
kaddr, pfn); kaddr, pfn);
......
...@@ -2527,7 +2527,7 @@ static void deactivate_labels(void *region) ...@@ -2527,7 +2527,7 @@ static void deactivate_labels(void *region)
static int init_active_labels(struct nd_region *nd_region) static int init_active_labels(struct nd_region *nd_region)
{ {
int i; int i, rc = 0;
for (i = 0; i < nd_region->ndr_mappings; i++) { for (i = 0; i < nd_region->ndr_mappings; i++) {
struct nd_mapping *nd_mapping = &nd_region->mapping[i]; struct nd_mapping *nd_mapping = &nd_region->mapping[i];
...@@ -2546,13 +2546,14 @@ static int init_active_labels(struct nd_region *nd_region) ...@@ -2546,13 +2546,14 @@ static int init_active_labels(struct nd_region *nd_region)
else if (test_bit(NDD_LABELING, &nvdimm->flags)) else if (test_bit(NDD_LABELING, &nvdimm->flags))
/* fail, labels needed to disambiguate dpa */; /* fail, labels needed to disambiguate dpa */;
else else
return 0; continue;
dev_err(&nd_region->dev, "%s: is %s, failing probe\n", dev_err(&nd_region->dev, "%s: is %s, failing probe\n",
dev_name(&nd_mapping->nvdimm->dev), dev_name(&nd_mapping->nvdimm->dev),
test_bit(NDD_LOCKED, &nvdimm->flags) test_bit(NDD_LOCKED, &nvdimm->flags)
? "locked" : "disabled"); ? "locked" : "disabled");
return -ENXIO; rc = -ENXIO;
goto out;
} }
nd_mapping->ndd = ndd; nd_mapping->ndd = ndd;
atomic_inc(&nvdimm->busy); atomic_inc(&nvdimm->busy);
...@@ -2586,9 +2587,13 @@ static int init_active_labels(struct nd_region *nd_region) ...@@ -2586,9 +2587,13 @@ static int init_active_labels(struct nd_region *nd_region)
break; break;
} }
if (i < nd_region->ndr_mappings) { if (i < nd_region->ndr_mappings)
rc = -ENOMEM;
out:
if (rc) {
deactivate_labels(nd_region); deactivate_labels(nd_region);
return -ENOMEM; return rc;
} }
return devm_add_action_or_reset(&nd_region->dev, deactivate_labels, return devm_add_action_or_reset(&nd_region->dev, deactivate_labels,
......
...@@ -722,7 +722,7 @@ static int copy_cow_page_dax(struct block_device *bdev, struct dax_device *dax_d ...@@ -722,7 +722,7 @@ static int copy_cow_page_dax(struct block_device *bdev, struct dax_device *dax_d
return rc; return rc;
id = dax_read_lock(); id = dax_read_lock();
rc = dax_direct_access(dax_dev, pgoff, PHYS_PFN(PAGE_SIZE), &kaddr, NULL); rc = dax_direct_access(dax_dev, pgoff, 1, &kaddr, NULL);
if (rc < 0) { if (rc < 0) {
dax_read_unlock(id); dax_read_unlock(id);
return rc; return rc;
......
...@@ -1235,8 +1235,6 @@ void fuse_dax_conn_free(struct fuse_conn *fc) ...@@ -1235,8 +1235,6 @@ void fuse_dax_conn_free(struct fuse_conn *fc)
static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd) static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd)
{ {
long nr_pages, nr_ranges; long nr_pages, nr_ranges;
void *kaddr;
pfn_t pfn;
struct fuse_dax_mapping *range; struct fuse_dax_mapping *range;
int ret, id; int ret, id;
size_t dax_size = -1; size_t dax_size = -1;
...@@ -1248,8 +1246,8 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd) ...@@ -1248,8 +1246,8 @@ static int fuse_dax_mem_range_init(struct fuse_conn_dax *fcd)
INIT_DELAYED_WORK(&fcd->free_work, fuse_dax_free_mem_worker); INIT_DELAYED_WORK(&fcd->free_work, fuse_dax_free_mem_worker);
id = dax_read_lock(); id = dax_read_lock();
nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), &kaddr, nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), NULL,
&pfn); NULL);
dax_read_unlock(id); dax_read_unlock(id);
if (nr_pages < 0) { if (nr_pages < 0) {
pr_debug("dax_direct_access() returned %ld\n", nr_pages); pr_debug("dax_direct_access() returned %ld\n", nr_pages);
......
...@@ -434,7 +434,7 @@ static int nd_intel_test_finish_query(struct nfit_test *t, ...@@ -434,7 +434,7 @@ static int nd_intel_test_finish_query(struct nfit_test *t,
dev_dbg(dev, "%s: transition out verify\n", __func__); dev_dbg(dev, "%s: transition out verify\n", __func__);
fw->state = FW_STATE_UPDATED; fw->state = FW_STATE_UPDATED;
fw->missed_activate = false; fw->missed_activate = false;
/* fall through */ fallthrough;
case FW_STATE_UPDATED: case FW_STATE_UPDATED:
nd_cmd->status = 0; nd_cmd->status = 0;
/* bogus test version */ /* bogus test version */
......
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