Always run Grow_continue() for started array.

So far there were 2 reshape continuation cases:
 1. array is started /e.g. reshape was already invoked during initrd
                      start-up stage using "--freeze-reshape" option/
 2. array is not started yet /"normal" assembling array under reshape case/

This patch narrows continuation cases in to single one. To do this
array should be started /set readonly in to array_state/ before calling
Grow_continue() function.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Adam Kwolek 2011-10-06 11:13:22 +02:00 committed by NeilBrown
parent ea672ee119
commit 3bd58dc65f
2 changed files with 32 additions and 28 deletions

View File

@ -1343,10 +1343,14 @@ int Assemble(struct supertype *st, char *mddev,
int rv;
#ifndef MDASSEMBLE
if (content->reshape_active &&
content->delta_disks <= 0)
rv = Grow_continue(mdfd, st, content,
backup_file, freeze_reshape);
else
content->delta_disks <= 0) {
rv = sysfs_set_str(content, NULL,
"array_state", "readonly");
if (rv == 0)
rv = Grow_continue(mdfd, st, content,
backup_file,
freeze_reshape);
} else
#endif
rv = ioctl(mdfd, RUN_ARRAY, NULL);
if (rv == 0) {
@ -1561,6 +1565,11 @@ int assemble_container_content(struct supertype *st, int mdfd,
spare, backup_file, verbose) == 1)
return 1;
err = sysfs_set_str(content, NULL,
"array_state", "readonly");
if (err)
return 1;
if (st->ss->external) {
if (!mdmon_running(st->container_dev))
start_mdmon(st->container_dev);

43
Grow.c
View File

@ -3802,33 +3802,28 @@ Grow_continue_command_exit:
int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
char *backup_file, int freeze_reshape)
{
char buf[40];
char *container = NULL;
int err;
int ret_val = 2;
if (!info->reshape_active)
return ret_val;
err = sysfs_set_str(info, NULL, "array_state", "readonly");
if (err)
return err;
if (st->ss->external) {
fmt_devname(buf, st->container_dev);
container = buf;
char container[40];
int cfd = open_dev(st->container_dev);
if (!mdmon_running(st->container_dev))
start_mdmon(st->container_dev);
ping_monitor_by_id(st->container_dev);
if (cfd < 0)
return 1;
fmt_devname(container, st->container_dev);
st->ss->load_container(st, cfd, container);
close(cfd);
ret_val = reshape_container(container, NULL,
st, info, 0, backup_file,
0, 1, freeze_reshape);
} else
ret_val = reshape_array(NULL, mdfd, "array", st, info, 1,
NULL, backup_file, 0, 0, 1,
freeze_reshape);
if (info->reshape_active == 2) {
int cfd = open_dev(st->container_dev);
if (cfd < 0)
return 1;
st->ss->load_container(st, cfd, container);
close(cfd);
return reshape_container(container, NULL,
st, info, 0, backup_file,
0, 1, freeze_reshape);
}
}
return reshape_array(container, mdfd, "array", st, info, 1,
NULL, backup_file, 0, 0, 1, freeze_reshape);
return ret_val;
}