Commit e8c59ac4 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

md: implement ->free_disk



Ensure that all private data is only freed once all accesses are done.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarLogan Gunthorpe <logang@deltatee.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
Signed-off-by: default avatarSong Liu <song@kernel.org>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent c57094a6
Loading
Loading
Loading
Loading
+12 −6
Original line number Diff line number Diff line
@@ -5600,12 +5600,6 @@ static void md_free(struct kobject *ko)

	del_gendisk(mddev->gendisk);
	put_disk(mddev->gendisk);

	percpu_ref_exit(&mddev->writes_pending);

	bioset_exit(&mddev->bio_set);
	bioset_exit(&mddev->sync_set);
	kfree(mddev);
}

static const struct sysfs_ops md_sysfs_ops = {
@@ -7875,6 +7869,17 @@ static unsigned int md_check_events(struct gendisk *disk, unsigned int clearing)
	return ret;
}

static void md_free_disk(struct gendisk *disk)
{
	struct mddev *mddev = disk->private_data;

	percpu_ref_exit(&mddev->writes_pending);
	bioset_exit(&mddev->bio_set);
	bioset_exit(&mddev->sync_set);

	kfree(mddev);
}

const struct block_device_operations md_fops =
{
	.owner		= THIS_MODULE,
@@ -7888,6 +7893,7 @@ const struct block_device_operations md_fops =
	.getgeo		= md_getgeo,
	.check_events	= md_check_events,
	.set_read_only	= md_set_read_only,
	.free_disk	= md_free_disk,
};

static int md_thread(void *arg)