Patch "libnvdimm, pmem: fix a NULL pointer BUG in nd_pmem_notify" has been added to the 4.11-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
libnvdimm, pmem: fix a NULL pointer BUG in nd_pmem_notify
to the 4.11-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
libnvdimm-pmem-fix-a-null-pointer-bug-in-nd_pmem_notify.patch
and it can be found in the queue-4.11 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b2518c78ce76896f0f8f7940bf02104b227e1709Mon Sep 17 00:00:00 2001
From: Toshi Kani <[email protected]>
Date: Tue, 25 Apr 2017 17:04:13 -0600
Subject: libnvdimm, pmem: fix a NULL pointer BUG in nd_pmem_notify
From: Toshi Kani <[email protected]>
commit b2518c78ce76896f0f8f7940bf02104b227e1709 upstream.
The following BUG was observed when nd_pmem_notify() was called for a BTT device. The use of a pmem_device pointer is not valid with BTT.
BUG: unable to handle kernel NULL pointer dereference at 0000000000000030 IP: nd_pmem_notify+0x30/0xf0 [nd_pmem] Call Trace: nd_device_notify+0x40/0x50 child_notify+0x10/0x20 device_for_each_child+0x50/0x90 nd_region_notify+0x20/0x30 nd_device_notify+0x40/0x50 nvdimm_region_notify+0x27/0x30 acpi_nfit_scrub+0x341/0x590 [nfit] process_one_work+0x197/0x450 worker_thread+0x4e/0x4a0 kthread+0x109/0x140
Fix nd_pmem_notify() by setting nd_region and badblocks pointers properly for BTT.
--- drivers/nvdimm/pmem.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-)
drivers/nvdimm/pmem.c +26 -13
@@ -388,12 +388,12 @@ static void nd_pmem_shutdown(struct devistatic void nd_pmem_notify (struct device *dev,enum nvdimm_event event) { -struct pmem_device *pmem =dev_get_drvdata (dev); -struct nd_region *nd_region =to_region (pmem); +struct nd_region *nd_region;resource_size_t offset =0 , end_trunc =0 ;struct nd_namespace_common *ndns;struct nd_namespace_io *nsio;struct resource res; +struct badblocks *bb;if (event !=NVDIMM_REVALIDATE_POISON )return ;
@@ -402,20 +402,33 @@ static void nd_pmem_notify(struct devicestruct nd_btt *nd_btt =to_nd_btt (dev); ndns = nd_btt->ndns; - }else if (is_nd_pfn (dev)) { -struct nd_pfn *nd_pfn =to_nd_pfn (dev); -struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; - - ndns = nd_pfn->ndns; - offset = pmem->data_offset +__le32_to_cpu (pfn_sb->start_pad); - end_trunc =__le32_to_cpu (pfn_sb->end_trunc); - }else - ndns =to_ndns (dev); + nd_region =to_nd_region (ndns->dev.parent); + nsio =to_nd_namespace_io (&ndns->dev); + bb = &nsio->bb; + }else { +struct pmem_device *pmem =dev_get_drvdata (dev); + + nd_region =to_region (pmem); + bb = &pmem->bb; + +if (is_nd_pfn (dev)) { +struct nd_pfn *nd_pfn =to_nd_pfn (dev); +struct nd_pfn_sb *pfn_sb = nd_pfn->pfn_sb; + + ndns = nd_pfn->ndns; + offset = pmem->data_offset + +__le32_to_cpu (pfn_sb->start_pad); + end_trunc =__le32_to_cpu (pfn_sb->end_trunc); + }else { + ndns =to_ndns (dev); + } + + nsio =to_nd_namespace_io (&ndns->dev); + } - nsio =to_nd_namespace_io (&ndns->dev); res.start = nsio->res.start + offset; res.end = nsio->res.end - end_trunc; -nvdimm_badblocks_populate (nd_region, &pmem->bb, &res); +nvdimm_badblocks_populate (nd_region, bb, &res); }MODULE_ALIAS ("pmem" );
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/libnvdimm-pmem-fix-a-null-pointer-bug-in-nd_pmem_notify.patch