summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-02-21 17:02:21 +1100
committerNeilBrown <neilb@suse.de>2013-02-21 17:02:21 +1100
commitfdcad551e9a54c4aa8c4b63160b76e2c539a0441 (patch)
tree1f0f1f0119d906c75128bc271e4d5f34aab2965e
parent3920235ea20bf32be8fc3c830ebca3f83eea671a (diff)
Grow: fix problem with reshaping RAID4 to RAID0.
As 'layout' doesn't map neatly from RAID4 to RAID5, we need to set it correctly for RAID4. Also, when no reshape is needed we should set re->level to the final desired level. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Grow.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/Grow.c b/Grow.c
index 1ab6f406..2cc93578 100644
--- a/Grow.c
+++ b/Grow.c
@@ -1321,6 +1321,7 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
switch (re->level) {
case 4:
+ re->before.layout = 0;
re->after.layout = 0;
break;
case 5:
@@ -1336,6 +1337,7 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
switch (re->level) {
case 4:
+ re->before.layout = 0;
re->after.layout = 0;
break;
case 5:
@@ -1428,12 +1430,14 @@ char *analyse_change(struct mdinfo *info, struct reshape *re)
if (re->after.data_disks == re->before.data_disks &&
re->after.layout == re->before.layout &&
info->new_chunk == info->array.chunk_size) {
- /* Nothing to change */
+ /* Nothing to change, can change level immediately. */
+ re->level = info->new_level;
re->backup_blocks = 0;
return NULL;
}
if (re->after.data_disks == 1 && re->before.data_disks == 1) {
/* chunk and layout changes make no difference */
+ re->level = info->new_level;
re->backup_blocks = 0;
return NULL;
}