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:
parent
a4e13010df
commit
7d2e6486e3
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
9
Manage.c
9
Manage.c
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
5
mdadm.c
5
mdadm.c
|
@ -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)
|
||||||
|
|
2
mdadm.h
2
mdadm.h
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue