summaryrefslogtreecommitdiff
path: root/Assemble.c
diff options
context:
space:
mode:
authorAdam Kwolek <adam.kwolek@intel.com>2011-02-23 14:51:39 +0100
committerNeilBrown <neilb@suse.de>2011-02-27 17:26:42 +1100
commit882029c86d9617e838c5159496119c85bd87e27e (patch)
treee155dbfd2e5921a32e7d8cbd254331534af4ca2f /Assemble.c
parent0ac3f649307280651f5f190101fa77ac61d5e4ea (diff)
FIX: disks added beyond array should be counted during reshape
During expansion there is more working disks that array can have. Disks with set raid_disk (not a spare disk) during reshape should be counted to allow array state transition to read_only state. Array reconfiguration to new geometry should be done before reshape will be started. Signed-off-by: Adam Kwolek <adam.kwolek@intel.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/Assemble.c b/Assemble.c
index 317be8b7..4d410812 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -1504,6 +1504,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
{
struct mdinfo *dev, *sra;
int working = 0, preexist = 0;
+ int expansion = 0;
struct map_ent *map = NULL;
sysfs_init(content, mdfd, 0);
@@ -1522,6 +1523,9 @@ int assemble_container_content(struct supertype *st, int mdfd,
working++;
else if (errno == EEXIST)
preexist++;
+ else if (dev->disk.raid_disk >= content->array.raid_disks &&
+ content->reshape_active)
+ expansion++;
if (working == 0) {
close(mdfd);
return 1;/* Nothing new, don't try to start */
@@ -1532,7 +1536,8 @@ int assemble_container_content(struct supertype *st, int mdfd,
content->uuid, chosen_name);
if (runstop > 0 ||
- (working + preexist) >= content->array.working_disks) {
+ (working + preexist + expansion) >=
+ content->array.working_disks) {
int err;
switch(content->array.level) {
@@ -1566,6 +1571,9 @@ int assemble_container_content(struct supertype *st, int mdfd,
chosen_name, working + preexist);
if (preexist)
fprintf(stderr, " (%d new)", working);
+ if (expansion)
+ fprintf(stderr, " ( + %d for expansion)",
+ expansion);
fprintf(stderr, "\n");
}
if (!err)