reshape: support raid5 grow on certain older kernels.

Kernels between
  c6563a8c38fde3c1c7fc925a v3.5-rc1~110^2~53
and
  b5254dd5fdd9abcacadb5101 v3.5-rc1~110^2~51

allow new_offset to be set, but don't then allow a RAID5
to be reshaped to change that offset.
Due to selective backports, this includes the SLES11-SP3 kernel.

It is quite easy to handle this case in mdadm, so we do.
Specifically: if the reshape with data-offset fails with EINVAL,
abort the data-offset change and try the "old" way.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2015-03-26 10:06:26 +11:00
parent 4d149ab517
commit 783bbc2b13
1 changed files with 13 additions and 2 deletions

15
Grow.c
View File

@ -3102,8 +3102,19 @@ static int reshape_array(char *container, int fd, char *devname,
devname, container, &reshape) < 0)
goto release;
if (sysfs_set_str(sra, NULL, "sync_action", "reshape") < 0) {
pr_err("Failed to initiate reshape!\n");
goto release;
struct mdinfo *sd;
if (errno != EINVAL) {
pr_err("Failed to initiate reshape!\n");
goto release;
}
/* revert data_offset and try the old way */
for (sd = sra->devs; sd; sd = sd->next) {
sysfs_set_num(sra, sd, "new_offset",
sd->data_offset);
sysfs_set_str(sra, NULL, "reshape_direction",
"forwards");
}
break;
}
if (info->new_level == reshape.level)
return 0;