Assemble/container: catch errors when starting a partial container.

If we are assembling an array in a container and it isn't complete
enough to start yet, then
  - don't start mdmon
  - don't say the array is started
  - don't wait for the device to appear in /dev


Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2009-03-10 16:28:22 +11:00
parent 3092660000
commit bb50e5d383
1 changed files with 21 additions and 11 deletions

View File

@ -1237,6 +1237,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
return 1;/* Nothing new, don't try to start */
} else if (runstop > 0 ||
(working + preexist) >= content->array.working_disks) {
int err;
map_update(&map, fd2devnum(mdfd),
content->text_version,
@ -1245,28 +1246,37 @@ int assemble_container_content(struct supertype *st, int mdfd,
case LEVEL_LINEAR:
case LEVEL_MULTIPATH:
case 0:
sysfs_set_str(content, NULL, "array_state",
"active");
err = sysfs_set_str(content, NULL, "array_state",
"active");
break;
default:
sysfs_set_str(content, NULL, "array_state",
err = sysfs_set_str(content, NULL, "array_state",
"readonly");
/* start mdmon if needed. */
if (!mdmon_running(st->container_dev))
start_mdmon(st->container_dev);
ping_monitor(devnum2devname(st->container_dev));
if (!err) {
if (!mdmon_running(st->container_dev))
start_mdmon(st->container_dev);
ping_monitor(devnum2devname(st->container_dev));
}
break;
}
sysfs_set_safemode(content, content->safe_mode_delay);
if (!err)
sysfs_set_safemode(content, content->safe_mode_delay);
if (verbose >= 0) {
fprintf(stderr, Name
": Started %s with %d devices",
chosen_name, working + preexist);
if (err)
fprintf(stderr, Name
": array %s now has %d devices",
chosen_name, working + preexist);
else
fprintf(stderr, Name
": Started %s with %d devices",
chosen_name, working + preexist);
if (preexist)
fprintf(stderr, " (%d new)", working);
fprintf(stderr, "\n");
}
wait_for(chosen_name);
if (!err)
wait_for(chosen_name);
close(mdfd);
return 0;
/* FIXME should have an O_EXCL and wait for read-auto */