diff options
author | NeilBrown | 2009-01-09 08:31:09 +1100 |
---|---|---|
committer | NeilBrown | 2009-01-09 08:31:09 +1100 |
commit | a21d15042d8cd736caf82c2bac564f3f93f3d017 (patch) | |
tree | d430b6ae126e9bc8139d1c491b80a18cc86b27f1 /drivers/md | |
parent | 8b76539823d71576927e3eb08b395eb6620f628d (diff) |
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/md')
-rw-r--r-- | drivers/md/md.c | 20 |
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); } } |