diff options
author | Dan Williams <dan.j.williams@intel.com> | 2016-09-21 18:22:33 +0200 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2016-09-21 18:35:15 +0200 |
commit | ecfb6d8a041cc2ca80bc69ffc20c00067d190df5 (patch) | |
tree | 24f28c0e055e608a45f95af056254df5a4aa297d /drivers/nvdimm/core.c | |
parent | tools/testing/nvdimm: fix allocation range for mock flush hint tables (diff) | |
download | linux-ecfb6d8a041cc2ca80bc69ffc20c00067d190df5.tar.xz linux-ecfb6d8a041cc2ca80bc69ffc20c00067d190df5.zip |
libnvdimm: fix devm_nvdimm_memremap() error path
The internal alloc_nvdimm_map() helper might fail, particularly if the
memory region is already busy. Report request_mem_region() failures and
check for the failure.
Reported-by: Ryan Chen <ryan.chan105@gmail.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/nvdimm/core.c')
-rw-r--r-- | drivers/nvdimm/core.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/nvdimm/core.c b/drivers/nvdimm/core.c index 715583f69d28..4d7bbd2df5c0 100644 --- a/drivers/nvdimm/core.c +++ b/drivers/nvdimm/core.c @@ -99,8 +99,11 @@ static struct nvdimm_map *alloc_nvdimm_map(struct device *dev, nvdimm_map->size = size; kref_init(&nvdimm_map->kref); - if (!request_mem_region(offset, size, dev_name(&nvdimm_bus->dev))) + if (!request_mem_region(offset, size, dev_name(&nvdimm_bus->dev))) { + dev_err(&nvdimm_bus->dev, "failed to request %pa + %zd for %s\n", + &offset, size, dev_name(dev)); goto err_request_region; + } if (flags) nvdimm_map->mem = memremap(offset, size, flags); @@ -171,6 +174,9 @@ void *devm_nvdimm_memremap(struct device *dev, resource_size_t offset, kref_get(&nvdimm_map->kref); nvdimm_bus_unlock(dev); + if (!nvdimm_map) + return NULL; + if (devm_add_action_or_reset(dev, nvdimm_map_put, nvdimm_map)) return NULL; |