summary refs log tree commit diff
path: root/drivers
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2009-01-09 08:31:09 +1100
committerNeilBrown <neilb@suse.de>2009-01-09 08:31:09 +1100
commita21d15042d8cd736caf82c2bac564f3f93f3d017 (patch)
treed430b6ae126e9bc8139d1c491b80a18cc86b27f1 /drivers
parent8b76539823d71576927e3eb08b395eb6620f628d (diff)
downloadlinux-a21d15042d8cd736caf82c2bac564f3f93f3d017.tar.gz
md: centralise all freeing of an 'mddev' in 'md_free'
md_free is the .release handler for the md kobj_type.
So it makes sense to release all the objects referenced by
the mddev in there, rather than just prior to calling kobject_put
for what we think is the last time.

Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/md/md.c20
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index da838cc32cc9..970a8c42ba92 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -221,12 +221,6 @@ static void mddev_put(mddev_t *mddev)
 	if (!mddev->raid_disks && list_empty(&mddev->disks)) {
 		list_del(&mddev->all_mddevs);
 		spin_unlock(&all_mddevs_lock);
-		if (mddev->queue)
-			blk_cleanup_queue(mddev->queue);
-		mddev->queue = NULL;
-		if (mddev->sysfs_state)
-			sysfs_put(mddev->sysfs_state);
-		mddev->sysfs_state = NULL;
 		kobject_put(&mddev->kobj);
 	} else
 		spin_unlock(&all_mddevs_lock);
@@ -3451,6 +3445,17 @@ md_attr_store(struct kobject *kobj, struct attribute *attr,
 static void md_free(struct kobject *ko)
 {
 	mddev_t *mddev = container_of(ko, mddev_t, kobj);
+
+	if (mddev->sysfs_state)
+		sysfs_put(mddev->sysfs_state);
+
+	if (mddev->gendisk) {
+		del_gendisk(mddev->gendisk);
+		put_disk(mddev->gendisk);
+	}
+	if (mddev->queue)
+		blk_cleanup_queue(mddev->queue);
+
 	kfree(mddev);
 }
 
@@ -6435,9 +6440,6 @@ static __exit void md_exit(void)
 		if (!disk)
 			continue;
 		export_array(mddev);
-		del_gendisk(disk);
-		put_disk(disk);
-		mddev->gendisk = NULL;
 		mddev_put(mddev);
 	}
 }