summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2010-03-22 06:53:49 +0100
committerNeilBrown <neilb@suse.de>2010-05-18 07:27:49 +0200
commita78d38a1a16c8e009aa512caa71d483757fefc1c (patch)
tree028ba0f1d0d6a18b2710ece1f24639f9ff72e3d2
parentmd: notify level changes through sysfs. (diff)
downloadlinux-a78d38a1a16c8e009aa512caa71d483757fefc1c.tar.xz
linux-a78d38a1a16c8e009aa512caa71d483757fefc1c.zip
md: add support for raid5 to raid4 conversion
This is unlikely to be wanted, but we may as well provide it for completeness. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/raid5.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index bb28fd6b44fe..020143dec180 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5788,6 +5788,18 @@ static void *raid5_takeover(mddev_t *mddev)
return ERR_PTR(-EINVAL);
}
+static void *raid4_takeover(mddev_t *mddev)
+{
+ /* raid4 can take over raid5 if layout is right.
+ */
+ if (mddev->level == 5 &&
+ mddev->layout == ALGORITHM_PARITY_N) {
+ mddev->new_layout = 0;
+ mddev->new_level = 4;
+ return setup_conf(mddev);
+ }
+ return ERR_PTR(-EINVAL);
+}
static struct mdk_personality raid5_personality;
@@ -5903,6 +5915,7 @@ static struct mdk_personality raid4_personality =
.start_reshape = raid5_start_reshape,
.finish_reshape = raid5_finish_reshape,
.quiesce = raid5_quiesce,
+ .takeover = raid4_takeover,
};
static int __init raid5_init(void)