diff options
author | NeilBrown <neilb@suse.de> | 2015-03-26 10:06:26 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2015-03-26 10:06:26 +1100 |
commit | 783bbc2b131e2cfea7870f91c194920a45fd556c (patch) | |
tree | 37031eeb1666f87042c45f05ae04fb71c77bd478 | |
parent | 4d149ab5178e21422a9bdb9a5489ed3381a0d136 (diff) | |
download | mdadm-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.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -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; |