Relax restrictions on when --add is permitted.
The restriction that --add was not allowed on a device which looked like a recent member of an array was overly harsh. The real requirement was to avoid using --add when the array had failed, and the device being added might contain necessary information which can only be incorporated by stopping and re-assembling with --force. So change the test to reflect the need. Reported-by: Doug Ledford <dledford@redhat.com> Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
parent
c2ecf5f61a
commit
0a999759b5
35
Manage.c
35
Manage.c
|
@ -448,7 +448,7 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
char *dnprintable = dv->devname;
|
char *dnprintable = dv->devname;
|
||||||
char *add_dev = dv->devname;
|
char *add_dev = dv->devname;
|
||||||
int err;
|
int err;
|
||||||
int re_add_failed = 0;
|
int array_failed;
|
||||||
|
|
||||||
next = dv->next;
|
next = dv->next;
|
||||||
jnext = 0;
|
jnext = 0;
|
||||||
|
@ -851,9 +851,8 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
continue;
|
continue;
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
skip_re_add:
|
|
||||||
re_add_failed = 1;
|
|
||||||
}
|
}
|
||||||
|
skip_re_add:
|
||||||
st->ss->free_super(st);
|
st->ss->free_super(st);
|
||||||
}
|
}
|
||||||
if (add_dev != dv->devname) {
|
if (add_dev != dv->devname) {
|
||||||
|
@ -875,12 +874,30 @@ int Manage_subdevs(char *devname, int fd,
|
||||||
dv->devname, devname);
|
dv->devname, devname);
|
||||||
goto abort;
|
goto abort;
|
||||||
}
|
}
|
||||||
if (re_add_failed) {
|
if (array.active_disks < array.raid_disks) {
|
||||||
fprintf(stderr, Name ": %s reports being an active member for %s, but a --re-add fails.\n",
|
char *avail = calloc(array.raid_disks, 1);
|
||||||
dv->devname, devname);
|
int d;
|
||||||
fprintf(stderr, Name ": not performing --add as that would convert %s in to a spare.\n",
|
int found = 0;
|
||||||
dv->devname);
|
|
||||||
fprintf(stderr, Name ": To make this a spare, use \"mdadm --zero-superblock %s\" first.\n",
|
for (d = 0; d < MAX_DISKS && found < array.active_disks; d++) {
|
||||||
|
disc.number = d;
|
||||||
|
if (ioctl(fd, GET_DISK_INFO, &disc))
|
||||||
|
continue;
|
||||||
|
if (disc.major == 0 && disc.minor == 0)
|
||||||
|
continue;
|
||||||
|
if (!(disc.state & (1<<MD_DISK_SYNC)))
|
||||||
|
continue;
|
||||||
|
avail[disc.raid_disk] = 1;
|
||||||
|
found++;
|
||||||
|
}
|
||||||
|
array_failed = !enough(array.level, array.raid_disks,
|
||||||
|
array.layout, 1, avail);
|
||||||
|
} else
|
||||||
|
array_failed = 0;
|
||||||
|
if (array_failed) {
|
||||||
|
fprintf(stderr, Name ": %s has failed so using --add cannot work and might destroy\n",
|
||||||
|
devname);
|
||||||
|
fprintf(stderr, Name ": data on %s. You should stop the array and re-assemble it.\n",
|
||||||
dv->devname);
|
dv->devname);
|
||||||
if (tfd >= 0)
|
if (tfd >= 0)
|
||||||
close(tfd);
|
close(tfd);
|
||||||
|
|
Loading…
Reference in New Issue