All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] FIX: In Grow_restart() array parameters are wrongly used
@ 2011-04-11 13:39 Adam Kwolek
  2011-04-11 13:39 ` [PATCH 2/2] FIX: Set reshape parameters for all disks belongs to new array geometry Adam Kwolek
  2011-04-14  7:45 ` [PATCH 1/2] FIX: In Grow_restart() array parameters are wrongly used NeilBrown
  0 siblings, 2 replies; 3+ messages in thread
From: Adam Kwolek @ 2011-04-11 13:39 UTC (permalink / raw)
  To: neilb; +Cc: linux-raid, dan.j.williams, ed.ciechanowski, wojciech.neubauer

Problem can be obvious visible when to 3-disks raid5 array 2 disks are added.
(added disks number + parity == old disks number)
Mdadm generates floating point exception and core file is generated
due to division by 0 (odata == 0).

During restart for external metadata, getinfo_super() returns
in mdinfo->array.raid_disks old disks number, that has to be increased
by delta_disks to receive new value. Function getinfo_super()
cannot return raid_disks field in different way, as array starting
geometry information. We are still going to final array geometry.
This Grow_restart() should have in mind and calculate local variables
in proper way.

This change makes Grow_restart() to interpret parameters in the same way
as reshape_array() did during reshape start, and it will do it in the same
way when it will be called from Continue_reshape().

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
---

 Grow.c |   12 ++++++++----
 1 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/Grow.c b/Grow.c
index d4308bc..1fdee7e 100644
--- a/Grow.c
+++ b/Grow.c
@@ -3102,13 +3102,17 @@ int Grow_restart(struct supertype *st, struct mdinfo *info, int *fdlist, int cnt
 	unsigned long long  nstripe, ostripe;
 	int ndata, odata;
 
-	odata = info->array.raid_disks - info->delta_disks - 1;
+	if (st->ss->external) {
+		old_disks = info->array.raid_disks;
+		ndata = info->array.raid_disks + info->delta_disks - 1;
+	} else {
+		old_disks = info->array.raid_disks - info->delta_disks;
+		ndata = info->array.raid_disks - 1;
+	}
+	odata = old_disks - 1;
 	if (info->array.level == 6) odata--; /* number of data disks */
-	ndata = info->array.raid_disks - 1;
 	if (info->new_level == 6) ndata--;
 
-	old_disks = info->array.raid_disks - info->delta_disks;
-
 	if (info->delta_disks <= 0)
 		/* Didn't grow, so the backup file must have
 		 * been used


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-04-14  7:45 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-11 13:39 [PATCH 1/2] FIX: In Grow_restart() array parameters are wrongly used Adam Kwolek
2011-04-11 13:39 ` [PATCH 2/2] FIX: Set reshape parameters for all disks belongs to new array geometry Adam Kwolek
2011-04-14  7:45 ` [PATCH 1/2] FIX: In Grow_restart() array parameters are wrongly used NeilBrown

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.