]> www.infradead.org Git - users/hch/block.git/commitdiff
md: implement ->free_disk
authorChristoph Hellwig <hch@lst.de>
Fri, 8 Jul 2022 08:24:23 +0000 (10:24 +0200)
committerChristoph Hellwig <hch@lst.de>
Tue, 12 Jul 2022 06:58:59 +0000 (08:58 +0200)
Ensure that all private data is only freed once all accesses are done.

Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/md/md.c

index 861d6a9481b2ee807f845585ef8408f75c25a069..ae076a7a8779627774ec39974c1db3abcbe06897 100644 (file)
@@ -5581,11 +5581,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 = {
@@ -7844,6 +7839,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,
@@ -7857,6 +7863,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)