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:
parent
2ecda5a3fa
commit
06e293d097
|
@ -1044,7 +1044,7 @@ static int start_array(int mdfd,
|
||||||
"array_state", "readonly");
|
"array_state", "readonly");
|
||||||
if (rv == 0)
|
if (rv == 0)
|
||||||
rv = Grow_continue(mdfd, st, content,
|
rv = Grow_continue(mdfd, st, content,
|
||||||
c->backup_file,
|
c->backup_file, 0,
|
||||||
c->freeze_reshape);
|
c->freeze_reshape);
|
||||||
} else if (c->readonly &&
|
} else if (c->readonly &&
|
||||||
sysfs_attribute_available(
|
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,
|
err = Grow_continue(mdfd, st, content, c->backup_file,
|
||||||
c->freeze_reshape);
|
0, c->freeze_reshape);
|
||||||
} else switch(content->array.level) {
|
} else switch(content->array.level) {
|
||||||
case LEVEL_LINEAR:
|
case LEVEL_LINEAR:
|
||||||
case LEVEL_MULTIPATH:
|
case LEVEL_MULTIPATH:
|
||||||
|
|
6
Grow.c
6
Grow.c
|
@ -4920,7 +4920,7 @@ int Grow_continue_command(char *devname, int fd,
|
||||||
|
|
||||||
/* continue reshape
|
/* 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:
|
Grow_continue_command_exit:
|
||||||
if (fd2 > -1)
|
if (fd2 > -1)
|
||||||
|
@ -4936,7 +4936,7 @@ Grow_continue_command_exit:
|
||||||
}
|
}
|
||||||
|
|
||||||
int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
|
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;
|
int ret_val = 2;
|
||||||
|
|
||||||
|
@ -4959,7 +4959,7 @@ int Grow_continue(int mdfd, struct supertype *st, struct mdinfo *info,
|
||||||
} else
|
} else
|
||||||
ret_val = reshape_array(NULL, mdfd, "array", st, info, 1,
|
ret_val = reshape_array(NULL, mdfd, "array", st, info, 1,
|
||||||
NULL, INVALID_SECTORS,
|
NULL, INVALID_SECTORS,
|
||||||
backup_file, 0, 1,
|
backup_file, 0, forked,
|
||||||
1 | info->reshape_active,
|
1 | info->reshape_active,
|
||||||
freeze_reshape);
|
freeze_reshape);
|
||||||
|
|
||||||
|
|
2
mdadm.h
2
mdadm.h
|
@ -1193,7 +1193,7 @@ extern int Grow_restart(struct supertype *st, struct mdinfo *info,
|
||||||
int *fdlist, int cnt, char *backup_file, int verbose);
|
int *fdlist, int cnt, char *backup_file, int verbose);
|
||||||
extern int Grow_continue(int mdfd, struct supertype *st,
|
extern int Grow_continue(int mdfd, struct supertype *st,
|
||||||
struct mdinfo *info, char *backup_file,
|
struct mdinfo *info, char *backup_file,
|
||||||
int freeze_reshape);
|
int forked, int freeze_reshape);
|
||||||
|
|
||||||
extern int restore_backup(struct supertype *st,
|
extern int restore_backup(struct supertype *st,
|
||||||
struct mdinfo *content,
|
struct mdinfo *content,
|
||||||
|
|
Loading…
Reference in New Issue