md: raid0: Make raid0_run() return a proper error code.
Currently raid0_run() always returns -ENOMEM on errors. This is
incorrect as running the array might fail for other reasons, for
example because not all component devices were available.
This patch changes create_strip_zones() so that it returns a proper
error code (either -ENOMEM or -EINVAL) rather than 1 on errors and
makes raid0_run(), its single caller, return that value instead
of -ENOMEM.
Signed-off-by: Andre Noll <maan@systemlinux.org>
Signed-off-by: NeilBrown <neilb@suse.de>
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c
index edffc49..e5648b6 100644
--- a/drivers/md/raid0.c
+++ b/drivers/md/raid0.c
@@ -105,12 +105,12 @@
conf->strip_zone = kzalloc(sizeof(struct strip_zone)*
conf->nr_strip_zones, GFP_KERNEL);
if (!conf->strip_zone)
- return 1;
+ return -ENOMEM;
conf->devlist = kzalloc(sizeof(mdk_rdev_t*)*
conf->nr_strip_zones*mddev->raid_disks,
GFP_KERNEL);
if (!conf->devlist)
- return 1;
+ return -ENOMEM;
/* The first zone must contain all devices, so here we check that
* there is a proper alignment of slots to devices and find them all
@@ -207,8 +207,8 @@
printk(KERN_INFO "raid0: done.\n");
return 0;
- abort:
- return 1;
+abort:
+ return -EINVAL;
}
/**
@@ -254,6 +254,7 @@
static int raid0_run(mddev_t *mddev)
{
raid0_conf_t *conf;
+ int ret;
if (mddev->chunk_size == 0) {
printk(KERN_ERR "md/raid0: non-zero chunk size required.\n");
@@ -269,12 +270,13 @@
conf = kmalloc(sizeof (raid0_conf_t), GFP_KERNEL);
if (!conf)
- goto out;
+ return -ENOMEM;
mddev->private = (void *)conf;
conf->strip_zone = NULL;
conf->devlist = NULL;
- if (create_strip_zones (mddev))
+ ret = create_strip_zones(mddev);
+ if (ret < 0)
goto out_free_conf;
/* calculate array device size */
@@ -306,8 +308,7 @@
kfree(conf->devlist);
kfree(conf);
mddev->private = NULL;
-out:
- return -ENOMEM;
+ return ret;
}
static int raid0_stop (mddev_t *mddev)