@@ -555,6 +555,8 @@ EXPORT_SYMBOL_GPL(badblocks_init);
*/
void badblocks_free(struct badblocks *bb)
{
+ if (!bb)
+ return;
kfree(bb->page);
bb->page = NULL;
}
@@ -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_free(disk->bb);
- kfree(disk->bb);
- }
-
part_stat_set_all(&disk->part0, 0);
disk->part0.stamp = 0;
@@ -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,14 @@ 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_free(disk->bb);
+ del_gendisk_queue(disk);
+ put_disk(disk);
}
static int pmem_attach_disk(struct device *dev,
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 | 10 +++++++--- 3 files changed, 9 insertions(+), 8 deletions(-)