Add --test option to --re-add and similar From: NeilBrown --test can be given in Manage mode. This can be used when there is an attempt to fail or remove 'faulty', 'failed' or 'detached' devices, or to re-add 'missing' devices. If no devices were failed, removed, or re-added, then mdadm will exit with status '2'. Signed-off-by: NeilBrown --- Incremental.c | 4 ++-- Manage.c | 9 +++++++-- Monitor.c | 6 +++--- mdadm.c | 5 ++++- mdadm.h | 2 +- 5 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Incremental.c b/Incremental.c index ff14809..f8f1532 100644 --- a/Incremental.c +++ b/Incremental.c @@ -900,7 +900,7 @@ int IncrementalRemove(char *devname, int verbose) memset(&devlist, 0, sizeof(devlist)); devlist.devname = devname; devlist.disposition = 'f'; - Manage_subdevs(ent->dev, mdfd, &devlist, verbose); + Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0); devlist.disposition = 'r'; - return Manage_subdevs(ent->dev, mdfd, &devlist, verbose); + return Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0); } diff --git a/Manage.c b/Manage.c index 6445282..85f06e6 100644 --- a/Manage.c +++ b/Manage.c @@ -323,7 +323,7 @@ int Manage_reconfig(char *devname, int fd, int layout) } int Manage_subdevs(char *devname, int fd, - mddev_dev_t devlist, int verbose) + mddev_dev_t devlist, int verbose, int test) { /* do something to each dev. * devmode can be @@ -352,6 +352,7 @@ int Manage_subdevs(char *devname, int fd, int ouuid[4]; int lfd = -1; int sysfd = -1; + int count = 0; /* number of actions taken */ if (ioctl(fd, GET_ARRAY_INFO, &array)) { fprintf(stderr, Name ": cannot get array info for %s\n", @@ -670,6 +671,7 @@ int Manage_subdevs(char *devname, int fd, if (ioctl(fd, ADD_NEW_DISK, &disc) == 0) { if (verbose >= 0) fprintf(stderr, Name ": re-added %s\n", add_dev); + count++; continue; } if (errno == ENOMEM || errno == EROFS) { @@ -944,6 +946,7 @@ int Manage_subdevs(char *devname, int fd, } if (lfd >= 0) close(lfd); + count++; if (verbose >= 0) fprintf(stderr, Name ": hot removed %s from %s\n", dnprintable, devname); @@ -963,14 +966,16 @@ int Manage_subdevs(char *devname, int fd, if (sysfd >= 0) close(sysfd); sysfd = -1; + count++; if (verbose >= 0) fprintf(stderr, Name ": set %s faulty in %s\n", dnprintable, devname); break; } } + if (test && count == 0) + return 2; return 0; - } int autodetect(void) diff --git a/Monitor.c b/Monitor.c index b0802f8..407f011 100644 --- a/Monitor.c +++ b/Monitor.c @@ -490,15 +490,15 @@ int Monitor(mddev_dev_t devlist, sprintf(devname, "%d:%d", major(dev), minor(dev)); devlist.disposition = 'r'; - if (Manage_subdevs(st2->devname, fd2, &devlist, -1) == 0) { + if (Manage_subdevs(st2->devname, fd2, &devlist, -1, 0) == 0) { devlist.disposition = 'a'; - if (Manage_subdevs(st->devname, fd1, &devlist, -1) == 0) { + if (Manage_subdevs(st->devname, fd1, &devlist, -1, 0) == 0) { alert("MoveSpare", st->devname, st2->devname, mailaddr, mailfrom, alert_cmd, dosyslog); close(fd1); close(fd2); break; } - else Manage_subdevs(st2->devname, fd2, &devlist, -1); + else Manage_subdevs(st2->devname, fd2, &devlist, -1, 0); } } close(fd1); diff --git a/mdadm.c b/mdadm.c index 90e8292..80fda17 100644 --- a/mdadm.c +++ b/mdadm.c @@ -783,6 +783,9 @@ int main(int argc, char *argv[]) } runstop = -1; continue; + case O(MANAGE,'t'): + test = 1; + continue; case O(MISC,'Q'): case O(MISC,'D'): @@ -1044,7 +1047,7 @@ int main(int argc, char *argv[]) rv = Manage_ro(devlist->devname, mdfd, readonly); if (!rv && devs_found>1) rv = Manage_subdevs(devlist->devname, mdfd, - devlist->next, verbose-quiet); + devlist->next, verbose-quiet, test); if (!rv && readonly < 0) rv = Manage_ro(devlist->devname, mdfd, readonly); if (!rv && runstop) diff --git a/mdadm.h b/mdadm.h index f6ff686..ff178ed 100644 --- a/mdadm.h +++ b/mdadm.h @@ -717,7 +717,7 @@ extern int Manage_runstop(char *devname, int fd, int runstop, int quiet); extern int Manage_resize(char *devname, int fd, long long size, int raid_disks); extern int Manage_reconfig(char *devname, int fd, int layout); extern int Manage_subdevs(char *devname, int fd, - mddev_dev_t devlist, int verbose); + mddev_dev_t devlist, int verbose, int test); extern int autodetect(void); extern int Grow_Add_device(char *devname, int fd, char *newdev); extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);