Grow: fix resent grow_continue breakage.

Commit 5e76dce1ac changed
Grow_continue to assume a fork had already happened, so that
   mdadm --grow --continue

didn't fork.  This is good, but it means that if Grow_continue
is run from Assemble, then
  mdadm --assemble ....

can misbehave if the array was in the middle of a reshape.

So introduce finer control.  Grow_continue only assumes it has
already forked if run from "mdadm --grow --continue".

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2014-05-22 14:22:58 +10:00
parent 2ecda5a3fa
commit 06e293d097
3 changed files with 6 additions and 6 deletions

View File

@ -1044,7 +1044,7 @@ static int start_array(int mdfd,
"array_state", "readonly");
if (rv == 0)
rv = Grow_continue(mdfd, st, content,
c->backup_file,
c->backup_file, 0,
c->freeze_reshape);
} else if (c->readonly &&
sysfs_attribute_available(
@ -1912,7 +1912,7 @@ int assemble_container_content(struct supertype *st, int mdfd,
}
err = Grow_continue(mdfd, st, content, c->backup_file,
c->freeze_reshape);
0, c->freeze_reshape);
} else switch(content->array.level) {
case LEVEL_LINEAR:
case LEVEL_MULTIPATH:

6
Grow.c
View File

@ -4920,7 +4920,7 @@ int Grow_continue_command(char *devname, int fd,
/* continue reshape
*/
ret_val = Grow_continue(fd, st, content, backup_file, 0);
ret_val = Grow_continue(fd, st, content, backup_file, 1, 0);
Grow_continue_command_exit:
if (fd2 > -1)
@ -4936,7 +4936,7 @@ Grow_continue_command_exit:
}
int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
char *backup_file, int freeze_reshape)
char *backup_file, int forked, int freeze_reshape)
{
int ret_val = 2;
@ -4959,7 +4959,7 @@ int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
} else
ret_val = reshape_array(NULL, mdfd, "array", st, info, 1,
NULL, INVALID_SECTORS,
backup_file, 0, 1,
backup_file, 0, forked,
1 | info->reshape_active,
freeze_reshape);

View File

@ -1193,7 +1193,7 @@ extern int Grow_restart(struct supertype *st, struct mdinfo *info,
int *fdlist, int cnt, char *backup_file, int verbose);
extern int Grow_continue(int mdfd, struct supertype *st,
struct mdinfo *info, char *backup_file,
int freeze_reshape);
int forked, int freeze_reshape);
extern int restore_backup(struct supertype *st,
struct mdinfo *content,