Add --test option to --re-add and similar

--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 <neilb@suse.de>
This commit is contained in:
NeilBrown 2010-07-06 11:46:04 +10:00
parent a4e13010df
commit 7d2e6486e3
5 changed files with 17 additions and 9 deletions

View File

@ -900,7 +900,7 @@ int IncrementalRemove(char *devname, int verbose)
memset(&devlist, 0, sizeof(devlist)); memset(&devlist, 0, sizeof(devlist));
devlist.devname = devname; devlist.devname = devname;
devlist.disposition = 'f'; devlist.disposition = 'f';
Manage_subdevs(ent->dev, mdfd, &devlist, verbose); Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0);
devlist.disposition = 'r'; devlist.disposition = 'r';
return Manage_subdevs(ent->dev, mdfd, &devlist, verbose); return Manage_subdevs(ent->dev, mdfd, &devlist, verbose, 0);
} }

View File

@ -326,7 +326,7 @@ int Manage_resize(char *devname, int fd, long long size, int raid_disks)
} }
int Manage_subdevs(char *devname, int fd, 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. /* do something to each dev.
* devmode can be * devmode can be
@ -355,6 +355,7 @@ int Manage_subdevs(char *devname, int fd,
int ouuid[4]; int ouuid[4];
int lfd = -1; int lfd = -1;
int sysfd = -1; int sysfd = -1;
int count = 0; /* number of actions taken */
if (ioctl(fd, GET_ARRAY_INFO, &array)) { if (ioctl(fd, GET_ARRAY_INFO, &array)) {
fprintf(stderr, Name ": cannot get array info for %s\n", fprintf(stderr, Name ": cannot get array info for %s\n",
@ -684,6 +685,7 @@ int Manage_subdevs(char *devname, int fd,
ioctl(fd, ADD_NEW_DISK, &disc) == 0) { ioctl(fd, ADD_NEW_DISK, &disc) == 0) {
if (verbose >= 0) if (verbose >= 0)
fprintf(stderr, Name ": re-added %s\n", add_dev); fprintf(stderr, Name ": re-added %s\n", add_dev);
count++;
continue; continue;
} }
if (errno == ENOMEM || errno == EROFS) { if (errno == ENOMEM || errno == EROFS) {
@ -959,6 +961,7 @@ int Manage_subdevs(char *devname, int fd,
} }
if (lfd >= 0) if (lfd >= 0)
close(lfd); close(lfd);
count++;
if (verbose >= 0) if (verbose >= 0)
fprintf(stderr, Name ": hot removed %s from %s\n", fprintf(stderr, Name ": hot removed %s from %s\n",
dnprintable, devname); dnprintable, devname);
@ -978,14 +981,16 @@ int Manage_subdevs(char *devname, int fd,
if (sysfd >= 0) if (sysfd >= 0)
close(sysfd); close(sysfd);
sysfd = -1; sysfd = -1;
count++;
if (verbose >= 0) if (verbose >= 0)
fprintf(stderr, Name ": set %s faulty in %s\n", fprintf(stderr, Name ": set %s faulty in %s\n",
dnprintable, devname); dnprintable, devname);
break; break;
} }
} }
if (test && count == 0)
return 2;
return 0; return 0;
} }
int autodetect(void) int autodetect(void)

View File

@ -491,15 +491,15 @@ int Monitor(mddev_dev_t devlist,
sprintf(devname, "%d:%d", major(dev), minor(dev)); sprintf(devname, "%d:%d", major(dev), minor(dev));
devlist.disposition = 'r'; 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'; 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); alert("MoveSpare", st->devname, st2->devname, mailaddr, mailfrom, alert_cmd, dosyslog);
close(fd1); close(fd1);
close(fd2); close(fd2);
break; break;
} }
else Manage_subdevs(st2->devname, fd2, &devlist, -1); else Manage_subdevs(st2->devname, fd2, &devlist, -1, 0);
} }
} }
close(fd1); close(fd1);

View File

@ -796,6 +796,9 @@ int main(int argc, char *argv[])
} }
runstop = -1; runstop = -1;
continue; continue;
case O(MANAGE,'t'):
test = 1;
continue;
case O(MISC,'Q'): case O(MISC,'Q'):
case O(MISC,'D'): case O(MISC,'D'):
@ -1064,7 +1067,7 @@ int main(int argc, char *argv[])
rv = Manage_ro(devlist->devname, mdfd, readonly); rv = Manage_ro(devlist->devname, mdfd, readonly);
if (!rv && devs_found>1) if (!rv && devs_found>1)
rv = Manage_subdevs(devlist->devname, mdfd, rv = Manage_subdevs(devlist->devname, mdfd,
devlist->next, verbose-quiet); devlist->next, verbose-quiet, test);
if (!rv && readonly < 0) if (!rv && readonly < 0)
rv = Manage_ro(devlist->devname, mdfd, readonly); rv = Manage_ro(devlist->devname, mdfd, readonly);
if (!rv && runstop) if (!rv && runstop)

View File

@ -769,7 +769,7 @@ extern int Manage_ro(char *devname, int fd, int readonly);
extern int Manage_runstop(char *devname, int fd, int runstop, int quiet); 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_resize(char *devname, int fd, long long size, int raid_disks);
extern int Manage_subdevs(char *devname, int fd, 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 autodetect(void);
extern int Grow_Add_device(char *devname, int fd, char *newdev); 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); extern int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int write_behind, int force);