diff options
author | Adam Kwolek <adam.kwolek@intel.com> | 2011-02-23 14:51:39 +0100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-02-27 17:26:42 +1100 |
commit | 882029c86d9617e838c5159496119c85bd87e27e (patch) | |
tree | e155dbfd2e5921a32e7d8cbd254331534af4ca2f /Assemble.c | |
parent | 0ac3f649307280651f5f190101fa77ac61d5e4ea (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.c | 10 |
1 files changed, 9 insertions, 1 deletions
@@ -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) |