summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2015-03-26 10:06:26 +1100
committerNeilBrown <neilb@suse.de>2015-03-26 10:06:26 +1100
commit783bbc2b131e2cfea7870f91c194920a45fd556c (patch)
tree37031eeb1666f87042c45f05ae04fb71c77bd478
parent4d149ab5178e21422a9bdb9a5489ed3381a0d136 (diff)
downloadmdadm-783bbc2b131e2cfea7870f91c194920a45fd556c.tar.gz
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>
-rw-r--r--Grow.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/Grow.c b/Grow.c
index a8bbf2b..9a573fd 100644
--- a/Grow.c
+++ b/Grow.c
@@ -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;