diff options
author | Dan Williams <dan.j.williams@intel.com> | 2016-06-15 17:59:17 -0400 |
---|---|---|
committer | Dan Williams <dan.j.williams@intel.com> | 2016-06-15 17:59:17 -0400 |
commit | f02716db951c5e01acf48df9fe815007674fecff (patch) | |
tree | 011a5c22e8ff2c8fa10379c1a7ec84e1f54aae3e | |
parent | 5edb56491d4812c42175980759da53388e5d86f5 (diff) |
libnvdimm: use devm_add_action_or_reset()
Clean up needless calls to the action routine by letting
devm_add_action_or_reset() call it automatically. This does cause the
disk to registered and immediately unregistered when a memory allocation
fails, but the block layer should be prepared for such an event.
Reported-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r-- | drivers/nvdimm/blk.c | 11 | ||||
-rw-r--r-- | drivers/nvdimm/pmem.c | 14 |
2 files changed, 10 insertions, 15 deletions
diff --git a/drivers/nvdimm/blk.c b/drivers/nvdimm/blk.c index 495e06d9f7e7..dfe691cf4d74 100644 --- a/drivers/nvdimm/blk.c +++ b/drivers/nvdimm/blk.c | |||
@@ -267,10 +267,8 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk) | |||
267 | q = blk_alloc_queue(GFP_KERNEL); | 267 | q = blk_alloc_queue(GFP_KERNEL); |
268 | if (!q) | 268 | if (!q) |
269 | return -ENOMEM; | 269 | return -ENOMEM; |
270 | if (devm_add_action(dev, nd_blk_release_queue, q)) { | 270 | if (devm_add_action_or_reset(dev, nd_blk_release_queue, q)) |
271 | blk_cleanup_queue(q); | ||
272 | return -ENOMEM; | 271 | return -ENOMEM; |
273 | } | ||
274 | 272 | ||
275 | blk_queue_make_request(q, nd_blk_make_request); | 273 | blk_queue_make_request(q, nd_blk_make_request); |
276 | blk_queue_max_hw_sectors(q, UINT_MAX); | 274 | blk_queue_max_hw_sectors(q, UINT_MAX); |
@@ -282,10 +280,6 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk) | |||
282 | disk = alloc_disk(0); | 280 | disk = alloc_disk(0); |
283 | if (!disk) | 281 | if (!disk) |
284 | return -ENOMEM; | 282 | return -ENOMEM; |
285 | if (devm_add_action(dev, nd_blk_release_disk, disk)) { | ||
286 | put_disk(disk); | ||
287 | return -ENOMEM; | ||
288 | } | ||
289 | 283 | ||
290 | disk->driverfs_dev = dev; | 284 | disk->driverfs_dev = dev; |
291 | disk->first_minor = 0; | 285 | disk->first_minor = 0; |
@@ -296,6 +290,9 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk) | |||
296 | set_capacity(disk, 0); | 290 | set_capacity(disk, 0); |
297 | add_disk(disk); | 291 | add_disk(disk); |
298 | 292 | ||
293 | if (devm_add_action_or_reset(dev, nd_blk_release_disk, disk)) | ||
294 | return -ENOMEM; | ||
295 | |||
299 | if (nsblk_meta_size(nsblk)) { | 296 | if (nsblk_meta_size(nsblk)) { |
300 | int rc = nd_integrity_init(disk, nsblk_meta_size(nsblk)); | 297 | int rc = nd_integrity_init(disk, nsblk_meta_size(nsblk)); |
301 | 298 | ||
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 608fc4464574..ba253df6233f 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c | |||
@@ -195,7 +195,7 @@ static void pmem_release_queue(void *q) | |||
195 | blk_cleanup_queue(q); | 195 | blk_cleanup_queue(q); |
196 | } | 196 | } |
197 | 197 | ||
198 | void pmem_release_disk(void *disk) | 198 | static void pmem_release_disk(void *disk) |
199 | { | 199 | { |
200 | del_gendisk(disk); | 200 | del_gendisk(disk); |
201 | put_disk(disk); | 201 | put_disk(disk); |
@@ -269,10 +269,8 @@ static int pmem_attach_disk(struct device *dev, | |||
269 | * At release time the queue must be dead before | 269 | * At release time the queue must be dead before |
270 | * devm_memremap_pages is unwound | 270 | * devm_memremap_pages is unwound |
271 | */ | 271 | */ |
272 | if (devm_add_action(dev, pmem_release_queue, q)) { | 272 | if (devm_add_action_or_reset(dev, pmem_release_queue, q)) |
273 | blk_cleanup_queue(q); | ||
274 | return -ENOMEM; | 273 | return -ENOMEM; |
275 | } | ||
276 | 274 | ||
277 | if (IS_ERR(addr)) | 275 | if (IS_ERR(addr)) |
278 | return PTR_ERR(addr); | 276 | return PTR_ERR(addr); |
@@ -288,10 +286,6 @@ static int pmem_attach_disk(struct device *dev, | |||
288 | disk = alloc_disk_node(0, nid); | 286 | disk = alloc_disk_node(0, nid); |
289 | if (!disk) | 287 | if (!disk) |
290 | return -ENOMEM; | 288 | return -ENOMEM; |
291 | if (devm_add_action(dev, pmem_release_disk, disk)) { | ||
292 | put_disk(disk); | ||
293 | return -ENOMEM; | ||
294 | } | ||
295 | 289 | ||
296 | disk->fops = &pmem_fops; | 290 | disk->fops = &pmem_fops; |
297 | disk->queue = q; | 291 | disk->queue = q; |
@@ -305,6 +299,10 @@ static int pmem_attach_disk(struct device *dev, | |||
305 | nvdimm_badblocks_populate(to_nd_region(dev->parent), &pmem->bb, res); | 299 | nvdimm_badblocks_populate(to_nd_region(dev->parent), &pmem->bb, res); |
306 | disk->bb = &pmem->bb; | 300 | disk->bb = &pmem->bb; |
307 | add_disk(disk); | 301 | add_disk(disk); |
302 | |||
303 | if (devm_add_action_or_reset(dev, pmem_release_disk, disk)) | ||
304 | return -ENOMEM; | ||
305 | |||
308 | revalidate_disk(disk); | 306 | revalidate_disk(disk); |
309 | 307 | ||
310 | return 0; | 308 | return 0; |