File 0240-reshape-support-raid5-grow-on-certain-older-kernels.patch of Package mdadm.5365

Git-commit: 783bbc2b131e2cfea7870f91c194920a45fd556c Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Thu, 26 Mar 2015 10:06:26 +1100
Subject: [PATCH] reshape: support raid5 grow on certain older kernels.
References: bnc#923920

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>
---
 Grow.c |   15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

--- mdadm-3.3.1.orig/Grow.c
+++ mdadm-3.3.1/Grow.c
@@ -3145,8 +3145,19 @@ static int reshape_array(char *container
 				   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;
openSUSE Build Service is sponsored by