diff mbox

[v2,3/9] block: clarify badblocks lifetime

Message ID 20160106223107.2736.91985.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive)
State Superseded
Headers show

Commit Message

Dan Williams Jan. 6, 2016, 10:31 p.m. UTC
The badblocks list attached to a gendisk is optionally allocated by the
driver which implies the driver owns the lifetime of the object.  Do not
automatically free it in del_gendisk(), leave that to the driver.  This
is in preparation for expanding the use of badblocks in libnvdimm
drivers and introducing devm_alloc_badblocks().

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
 block/badblocks.c     |    2 ++
 block/genhd.c         |    5 -----
 drivers/nvdimm/pmem.c |   11 ++++++++---
 3 files changed, 10 insertions(+), 8 deletions(-)
diff mbox

Patch

diff --git a/block/badblocks.c b/block/badblocks.c
index fabf6b64c2d1..37e5c0a2ef69 100644
--- a/block/badblocks.c
+++ b/block/badblocks.c
@@ -555,6 +555,8 @@  EXPORT_SYMBOL_GPL(badblocks_init);
  */
 void badblocks_exit(struct badblocks *bb)
 {
+	if (!bb)
+		return;
 	kfree(bb->page);
 	bb->page = NULL;
 }
diff --git a/block/genhd.c b/block/genhd.c
index 5e78f6eec8dd..b96012849e26 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -660,11 +660,6 @@  static void del_gendisk_end(struct gendisk *disk)
 	blk_unregister_queue(disk);
 	blk_unregister_region(disk_devt(disk), disk->minors);
 
-	if (disk->bb) {
-		badblocks_exit(disk->bb);
-		kfree(disk->bb);
-	}
-
 	part_stat_set_all(&disk->part0, 0);
 	disk->part0.stamp = 0;
 
diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c
index d20c8112e90d..8f562acc5034 100644
--- a/drivers/nvdimm/pmem.c
+++ b/drivers/nvdimm/pmem.c
@@ -23,6 +23,7 @@ 
 #include <linux/module.h>
 #include <linux/memory_hotplug.h>
 #include <linux/moduleparam.h>
+#include <linux/badblocks.h>
 #include <linux/vmalloc.h>
 #include <linux/slab.h>
 #include <linux/pmem.h>
@@ -155,11 +156,15 @@  static struct pmem_device *pmem_alloc(struct device *dev,
 
 static void pmem_detach_disk(struct pmem_device *pmem)
 {
-	if (!pmem->pmem_disk)
+	struct gendisk *disk = pmem->pmem_disk;
+
+	if (!disk)
 		return;
 
-	del_gendisk_queue(pmem->pmem_disk);
-	put_disk(pmem->pmem_disk);
+	badblocks_exit(disk->bb);
+	kfree(disk->bb);
+	del_gendisk_queue(disk);
+	put_disk(disk);
 }
 
 static int pmem_attach_disk(struct device *dev,