<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Neil Brown &lt;neilb@cse.unsw.edu.au&gt;

Thanks. It is a good start, but there are other problems with freeing
things on error paths.   This patch should fix it all.



 drivers/md/raid0.c |   17 ++++++++---------
 1 files changed, 8 insertions(+), 9 deletions(-)

diff -puN drivers/md/raid0.c~raid-fixes drivers/md/raid0.c
--- 25/drivers/md/raid0.c~raid-fixes	2003-05-29 19:07:09.000000000 -0700
+++ 25-akpm/drivers/md/raid0.c	2003-05-29 19:07:09.000000000 -0700
@@ -85,10 +85,8 @@ static int create_strip_zones (mddev_t *
 	conf-&gt;devlist = kmalloc(sizeof(mdk_rdev_t*)*
 				conf-&gt;nr_strip_zones*mddev-&gt;raid_disks,
 				GFP_KERNEL);
-	if (!conf-&gt;devlist) {
-		kfree(conf);
+	if (!conf-&gt;devlist)
 		return 1;
-	}
 
 	memset(conf-&gt;strip_zone, 0,sizeof(struct strip_zone)*
 				   conf-&gt;nr_strip_zones);
@@ -235,6 +233,8 @@ static int raid0_run (mddev_t *mddev)
 		goto out;
 	mddev-&gt;private = (void *)conf;
  
+	conf-&gt;strip_zone = NULL;
+	conf-&gt;devlist = NULL;
 	if (create_strip_zones (mddev)) 
 		goto out_free_conf;
 
@@ -273,7 +273,7 @@ static int raid0_run (mddev_t *mddev)
 				nb_zone*sizeof(struct strip_zone*));
 	conf-&gt;hash_table = kmalloc (sizeof (struct strip_zone *)*nb_zone, GFP_KERNEL);
 	if (!conf-&gt;hash_table)
-		goto out_free_zone_conf;
+		goto out_free_conf;
 	size = conf-&gt;strip_zone[cur].size;
 
 	for (i=0; i&lt; nb_zone; i++) {
@@ -296,12 +296,11 @@ static int raid0_run (mddev_t *mddev)
 	blk_queue_merge_bvec(&amp;mddev-&gt;queue, raid0_mergeable_bvec);
 	return 0;
 
-out_free_zone_conf:
-	kfree(conf-&gt;strip_zone);
-	conf-&gt;strip_zone = NULL;
-
 out_free_conf:
-	kfree (conf-&gt;devlist);
+	if (conf-&gt;strip_zone)
+		kfree(conf-&gt;strip_zone);
+	if (conf-&gt;devlist)
+		kfree (conf-&gt;devlist);
 	kfree(conf);
 	mddev-&gt;private = NULL;
 out:

_
</pre></body></html>