summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Brown <neilb@cse.unsw.edu.au>2003-06-04 09:30:06 -0700
committerBen Collins <bcollins@debian.org>2003-06-04 09:30:06 -0700
commit39032cc008398c74f3a0d53f2b4e7df2a8eba21e (patch)
treeecc05977e46af986cf10f416dd84bb3935a9dd4c
parent1e23fe7dc8d5a883cf6fc4ec6737eca05b9e8571 (diff)
[PATCH] Fix up freeing of kmalloc structures
Some paths free things twice, others free un-initialised values :-( Not any more.
-rw-r--r--drivers/md/raid0.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index 9a96d8bd0fa2..195b87a5194b 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -85,10 +85,8 @@ static int create_strip_zones (mddev_t *mddev)
conf->devlist = kmalloc(sizeof(mdk_rdev_t*)*
conf->nr_strip_zones*mddev->raid_disks,
GFP_KERNEL);
- if (!conf->devlist) {
- kfree(conf);
+ if (!conf->devlist)
return 1;
- }
memset(conf->strip_zone, 0,sizeof(struct strip_zone)*
conf->nr_strip_zones);
@@ -193,8 +191,6 @@ static int create_strip_zones (mddev_t *mddev)
printk("raid0: done.\n");
return 0;
abort:
- kfree(conf->devlist);
- kfree(conf->strip_zone);
return 1;
}
@@ -235,6 +231,8 @@ static int raid0_run (mddev_t *mddev)
goto out;
mddev->private = (void *)conf;
+ conf->strip_zone = NULL;
+ conf->devlist = NULL;
if (create_strip_zones (mddev))
goto out_free_conf;
@@ -273,7 +271,7 @@ static int raid0_run (mddev_t *mddev)
nb_zone*sizeof(struct strip_zone*));
conf->hash_table = kmalloc (sizeof (struct strip_zone *)*nb_zone, GFP_KERNEL);
if (!conf->hash_table)
- goto out_free_zone_conf;
+ goto out_free_conf;
size = conf->strip_zone[cur].size;
for (i=0; i< nb_zone; i++) {
@@ -296,12 +294,11 @@ static int raid0_run (mddev_t *mddev)
blk_queue_merge_bvec(&mddev->queue, raid0_mergeable_bvec);
return 0;
-out_free_zone_conf:
- kfree(conf->strip_zone);
- conf->strip_zone = NULL;
-
out_free_conf:
- kfree (conf->devlist);
+ if (conf->strip_zone)
+ kfree(conf->strip_zone);
+ if (conf->devlist)
+ kfree (conf->devlist);
kfree(conf);
mddev->private = NULL;
out: