Skip to content

Commit ed99d36

Browse files
committed
Merge branch 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm
Pull libnvdimm fixes from Dan Williams: "A build fix, a NULL de-reference found by static analysis, a misuse of the percpu_ref_exit() (tagged for -stable), and notification of failed attempts to clear media errors. These patches have received a build success notification from the 0day- kbuild-robot and appeared in next-20161028" * 'libnvdimm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: device-dax: fix percpu_ref_exit ordering nvdimm: make CONFIG_NVDIMM_DAX 'bool' pmem: report error on clear poison failure libnvdimm, namespace: potential NULL deref on allocation error
2 parents b92d964 + 52e73eb commit ed99d36

5 files changed

Lines changed: 17 additions & 11 deletions

File tree

drivers/dax/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ if DEV_DAX
1414

1515
config DEV_DAX_PMEM
1616
tristate "PMEM DAX: direct access to persistent memory"
17-
depends on NVDIMM_DAX
17+
depends on LIBNVDIMM && NVDIMM_DAX
1818
default DEV_DAX
1919
help
2020
Support raw access to persistent memory. Note that this

drivers/dax/pmem.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ static void dax_pmem_percpu_exit(void *data)
4444

4545
dev_dbg(dax_pmem->dev, "%s\n", __func__);
4646
percpu_ref_exit(ref);
47-
wait_for_completion(&dax_pmem->cmp);
4847
}
4948

5049
static void dax_pmem_percpu_kill(void *data)
@@ -54,6 +53,7 @@ static void dax_pmem_percpu_kill(void *data)
5453

5554
dev_dbg(dax_pmem->dev, "%s\n", __func__);
5655
percpu_ref_kill(ref);
56+
wait_for_completion(&dax_pmem->cmp);
5757
}
5858

5959
static int dax_pmem_probe(struct device *dev)

drivers/nvdimm/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ config NVDIMM_PFN
8989
Select Y if unsure
9090

9191
config NVDIMM_DAX
92-
tristate "NVDIMM DAX: Raw access to persistent memory"
92+
bool "NVDIMM DAX: Raw access to persistent memory"
9393
default LIBNVDIMM
9494
depends on NVDIMM_PFN
9595
help

drivers/nvdimm/namespace_devs.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2176,12 +2176,14 @@ static struct device **scan_labels(struct nd_region *nd_region)
21762176
return devs;
21772177

21782178
err:
2179-
for (i = 0; devs[i]; i++)
2180-
if (is_nd_blk(&nd_region->dev))
2181-
namespace_blk_release(devs[i]);
2182-
else
2183-
namespace_pmem_release(devs[i]);
2184-
kfree(devs);
2179+
if (devs) {
2180+
for (i = 0; devs[i]; i++)
2181+
if (is_nd_blk(&nd_region->dev))
2182+
namespace_blk_release(devs[i]);
2183+
else
2184+
namespace_pmem_release(devs[i]);
2185+
kfree(devs);
2186+
}
21852187
return NULL;
21862188
}
21872189

drivers/nvdimm/pmem.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ static struct nd_region *to_region(struct pmem_device *pmem)
4747
return to_nd_region(to_dev(pmem)->parent);
4848
}
4949

50-
static void pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,
50+
static int pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,
5151
unsigned int len)
5252
{
5353
struct device *dev = to_dev(pmem);
@@ -62,8 +62,12 @@ static void pmem_clear_poison(struct pmem_device *pmem, phys_addr_t offset,
6262
__func__, (unsigned long long) sector,
6363
cleared / 512, cleared / 512 > 1 ? "s" : "");
6464
badblocks_clear(&pmem->bb, sector, cleared / 512);
65+
} else {
66+
return -EIO;
6567
}
68+
6669
invalidate_pmem(pmem->virt_addr + offset, len);
70+
return 0;
6771
}
6872

6973
static void write_pmem(void *pmem_addr, struct page *page,
@@ -123,7 +127,7 @@ static int pmem_do_bvec(struct pmem_device *pmem, struct page *page,
123127
flush_dcache_page(page);
124128
write_pmem(pmem_addr, page, off, len);
125129
if (unlikely(bad_pmem)) {
126-
pmem_clear_poison(pmem, pmem_off, len);
130+
rc = pmem_clear_poison(pmem, pmem_off, len);
127131
write_pmem(pmem_addr, page, off, len);
128132
}
129133
}

0 commit comments

Comments
 (0)