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>
This commit is contained in:
Adam Kwolek 2011-02-23 14:51:39 +01:00 committed by NeilBrown
parent 0ac3f64930
commit 882029c86d
1 changed files with 9 additions and 1 deletions

View File

@ -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)