Incr: don't exclude 'active' devices from auto inclusion in a container.

For containers, it is always appropriate to include a device in the
container.
Whether it should then be included in an array is a separate question.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2011-02-01 13:07:36 +11:00
parent ac597b1c21
commit e5e5d7cea3
3 changed files with 8 additions and 20 deletions

View File

@ -358,22 +358,17 @@ int Incremental(char *devname, int verbose, int runstop,
* array was possibly started early and our best bet is
* to add this anyway.
* Also if action policy is re-add or better we allow
* re-add
* re-add.
* This doesn't apply to containers as the 'non-spare'
* flag has a different meaning. The test has to happen
* at the device level there
*/
if ((info.disk.state & (1<<MD_DISK_SYNC)) != 0
if (!st->ss->external
&& (info.disk.state & (1<<MD_DISK_SYNC)) != 0
&& ! policy_action_allows(policy, st->ss->name,
act_re_add)
&& runstop < 1) {
int active = 0;
if (st->ss->external) {
char *devname = devnum2devname(fd2devnum(mdfd));
active = devname && is_container_active(devname);
free(devname);
} else if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0)
active = 1;
if (active) {
if (ioctl(mdfd, GET_ARRAY_INFO, &ainf) == 0) {
fprintf(stderr, Name
": not adding %s to active array (without --run) %s\n",
devname, chosen_name);

View File

@ -1164,7 +1164,6 @@ extern int open_mddev(char *dev, int report_errors);
extern int open_container(int fd);
extern int is_container_member(struct mdstat_ent *ent, char *devname);
extern int is_subarray_active(char *subarray, char *devname);
int is_container_active(char *devname);
extern int open_subarray(char *dev, char *subarray, struct supertype *st, int quiet);
extern struct superswitch *version_to_superswitch(char *vers);

8
util.c
View File

@ -1490,8 +1490,7 @@ int is_subarray_active(char *subarray, char *container)
for (ent = mdstat; ent; ent = ent->next)
if (is_container_member(ent, container))
if (!subarray ||
strcmp(to_subarray(ent, container), subarray) == 0)
if (strcmp(to_subarray(ent, container), subarray) == 0)
break;
free_mdstat(mdstat);
@ -1499,11 +1498,6 @@ int is_subarray_active(char *subarray, char *container)
return ent != NULL;
}
int is_container_active(char *container)
{
return is_subarray_active(NULL, container);
}
/* open_subarray - opens a subarray in a container
* @dev: container device name
* @st: empty supertype