mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
libnvdimm fixes for v5.14-rc6
- 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. -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQSbo+XnGs+rwLz9XGXfioYZHlFsZwUCYRhC0wAKCRDfioYZHlFs Z6InAQD+duS9GS5DnnFInmRDj/rMRQFVB4X25mmSlViYOR0gNwEAtJQP03CGAp+G +DP7/nu2HrIhx8Ng8vTsu8ZnO8ge7Qw= =zmii -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
7ba34c0cba
@ -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 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)
|
||||
continue;
|
||||
if (count >= ND_MAX_MAPPINGS) {
|
||||
|
@ -313,7 +313,7 @@ long dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, long nr_pages,
|
||||
return -ENXIO;
|
||||
|
||||
if (nr_pages < 0)
|
||||
return nr_pages;
|
||||
return -EINVAL;
|
||||
|
||||
avail = dax_dev->ops->direct_access(dax_dev, pgoff, nr_pages,
|
||||
kaddr, pfn);
|
||||
|
@ -2527,7 +2527,7 @@ static void deactivate_labels(void *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++) {
|
||||
struct nd_mapping *nd_mapping = &nd_region->mapping[i];
|
||||
@ -2546,13 +2546,14 @@ static int init_active_labels(struct nd_region *nd_region)
|
||||
else if (test_bit(NDD_LABELING, &nvdimm->flags))
|
||||
/* fail, labels needed to disambiguate dpa */;
|
||||
else
|
||||
return 0;
|
||||
continue;
|
||||
|
||||
dev_err(&nd_region->dev, "%s: is %s, failing probe\n",
|
||||
dev_name(&nd_mapping->nvdimm->dev),
|
||||
test_bit(NDD_LOCKED, &nvdimm->flags)
|
||||
? "locked" : "disabled");
|
||||
return -ENXIO;
|
||||
rc = -ENXIO;
|
||||
goto out;
|
||||
}
|
||||
nd_mapping->ndd = ndd;
|
||||
atomic_inc(&nvdimm->busy);
|
||||
@ -2586,13 +2587,17 @@ static int init_active_labels(struct nd_region *nd_region)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i < nd_region->ndr_mappings) {
|
||||
if (i < nd_region->ndr_mappings)
|
||||
rc = -ENOMEM;
|
||||
|
||||
out:
|
||||
if (rc) {
|
||||
deactivate_labels(nd_region);
|
||||
return -ENOMEM;
|
||||
return rc;
|
||||
}
|
||||
|
||||
return devm_add_action_or_reset(&nd_region->dev, deactivate_labels,
|
||||
nd_region);
|
||||
nd_region);
|
||||
}
|
||||
|
||||
int nd_region_register_namespaces(struct nd_region *nd_region, int *err)
|
||||
|
2
fs/dax.c
2
fs/dax.c
@ -722,7 +722,7 @@ static int copy_cow_page_dax(struct block_device *bdev, struct dax_device *dax_d
|
||||
return rc;
|
||||
|
||||
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) {
|
||||
dax_read_unlock(id);
|
||||
return rc;
|
||||
|
@ -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)
|
||||
{
|
||||
long nr_pages, nr_ranges;
|
||||
void *kaddr;
|
||||
pfn_t pfn;
|
||||
struct fuse_dax_mapping *range;
|
||||
int ret, id;
|
||||
size_t dax_size = -1;
|
||||
@ -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);
|
||||
|
||||
id = dax_read_lock();
|
||||
nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), &kaddr,
|
||||
&pfn);
|
||||
nr_pages = dax_direct_access(fcd->dev, 0, PHYS_PFN(dax_size), NULL,
|
||||
NULL);
|
||||
dax_read_unlock(id);
|
||||
if (nr_pages < 0) {
|
||||
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,
|
||||
dev_dbg(dev, "%s: transition out verify\n", __func__);
|
||||
fw->state = FW_STATE_UPDATED;
|
||||
fw->missed_activate = false;
|
||||
/* fall through */
|
||||
fallthrough;
|
||||
case FW_STATE_UPDATED:
|
||||
nd_cmd->status = 0;
|
||||
/* bogus test version */
|
||||
|
Loading…
Reference in New Issue
Block a user