imsm: FIX: Chunk size migration is not possible

Chunk size only migration for raid0 and raid5 is not possible.
(mdadm UT 15* fails). Mdadm exits with information:
   mdadm: imsm unknown layout 0xffffffff for this raid level 0

Problem was introduced in patch (2011-11-16):
   imsm: platform capabilities are not validated during level migration

During chunk size migration layout variable is not set correctly.
Set it correctly for this migration type.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Adam Kwolek 2011-12-15 14:35:00 +11:00 committed by NeilBrown
parent 4c965cc989
commit 67a2db324f
1 changed files with 12 additions and 7 deletions

View File

@ -9050,8 +9050,10 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
int change = -1; int change = -1;
int check_devs = 0; int check_devs = 0;
int chunk; int chunk;
int devNumChange=0; /* number of added/removed disks in operation result */
int layout = -1; int devNumChange = 0;
/* imsm compatible layout value for array geometry verification */
int imsm_layout = -1;
getinfo_super_imsm_volume(st, &info, NULL); getinfo_super_imsm_volume(st, &info, NULL);
if ((geo->level != info.array.level) && if ((geo->level != info.array.level) &&
@ -9069,14 +9071,14 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
change = -1; change = -1;
goto analyse_change_exit; goto analyse_change_exit;
} }
layout = geo->layout; imsm_layout = geo->layout;
check_devs = 1; check_devs = 1;
devNumChange = 1; /* parity disk added */ devNumChange = 1; /* parity disk added */
} else if (geo->level == 10) { } else if (geo->level == 10) {
change = CH_TAKEOVER; change = CH_TAKEOVER;
check_devs = 1; check_devs = 1;
devNumChange = 2; /* two mirrors added */ devNumChange = 2; /* two mirrors added */
layout = 0x102; /* imsm supported layout */ imsm_layout = 0x102; /* imsm supported layout */
} }
break; break;
case 1: case 1:
@ -9085,7 +9087,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
change = CH_TAKEOVER; change = CH_TAKEOVER;
check_devs = 1; check_devs = 1;
devNumChange = -(geo->raid_disks/2); devNumChange = -(geo->raid_disks/2);
layout = 0; /* imsm raid0 layout */ imsm_layout = 0; /* imsm raid0 layout */
} }
break; break;
} }
@ -9120,8 +9122,11 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
change = -1; change = -1;
goto analyse_change_exit; goto analyse_change_exit;
} }
} else } else {
geo->layout = info.array.layout; geo->layout = info.array.layout;
if (imsm_layout == -1)
imsm_layout = info.array.layout;
}
if ((geo->chunksize > 0) && (geo->chunksize != UnSet) if ((geo->chunksize > 0) && (geo->chunksize != UnSet)
&& (geo->chunksize != info.array.chunk_size)) && (geo->chunksize != info.array.chunk_size))
@ -9132,7 +9137,7 @@ enum imsm_reshape_type imsm_analyze_change(struct supertype *st,
chunk = geo->chunksize / 1024; chunk = geo->chunksize / 1024;
if (!validate_geometry_imsm(st, if (!validate_geometry_imsm(st,
geo->level, geo->level,
layout, imsm_layout,
geo->raid_disks + devNumChange, geo->raid_disks + devNumChange,
&chunk, &chunk,
geo->size, geo->size,