mdstat = mdstat_read(oneshot?0:1, 0);
for (st=statelist; st; st=st->next) {
+ struct { int state, major, minor; } info[MaxDisks];
mdu_array_info_t array;
struct mdstat_ent *mse = NULL, *mse2;
char *dev = st->devname;
if (mse &&
mse->percent == -1 &&
- st->percent >= 0)
- alert("RebuildFinished", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
+ st->percent >= 0) {
+ /* Rebuild/sync/whatever just finished.
+ * If there is a number in /mismatch_cnt,
+ * we should report that.
+ */
+ struct sysarray *sra =
+ sysfs_read(-1, st->devnum, GET_MISMATCH);
+ if (sra && sra->mismatch_cnt > 0) {
+ char cnt[40];
+ sprintf(cnt, " mismatches found: %d", sra->mismatch_cnt);
+ alert("RebuildFinished", dev, cnt, mailaddr, mailfrom, alert_cmd, dosyslog);
+ } else
+ alert("RebuildFinished", dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog);
+ if (sra)
+ free(sra);
+ }
if (mse)
st->percent = mse->percent;
+
+ for (i=0; i<MaxDisks && i <= array.raid_disks + array.nr_disks;
+ i++) {
+ mdu_disk_info_t disc;
+ if (ioctl(fd, GET_DISK_INFO, &disc) >= 0) {
+ info[i].state = disc.state;
+ info[i].major = disc.major;
+ info[i].minor = disc.minor;
+ } else
+ info[i].major = info[i].minor = 0;
+ }
+ close(fd);
+
for (i=0; i<MaxDisks; i++) {
mdu_disk_info_t disc;
int newstate=0;
if (i > array.raid_disks + array.nr_disks) {
newstate = 0;
disc.major = disc.minor = 0;
- } else if (ioctl(fd, GET_DISK_INFO, &disc)>= 0) {
- newstate = disc.state;
- dv = map_dev(disc.major, disc.minor, 1);
+ } else if (info[i].major || info[i].minor) {
+ newstate = info[i].state;
+ dv = map_dev(info[i].major, info[i].minor, 1);
+ disc.state = newstate;
+ disc.major = info[i].major;
+ disc.minor = info[i].minor;
} else if (mse && mse->pattern && i < strlen(mse->pattern)) {
switch(mse->pattern[i]) {
case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
st->devstate[i] = disc.state;
st->devid[i] = makedev(disc.major, disc.minor);
}
- close(fd);
st->active = array.active_disks;
st->working = array.working_disks;
st->spare = array.spare_disks;
fprintf(mp, "A %s event had been detected on md device %s.\n\n", event, dev);
- if (disc)
+ if (disc && disc[0] != ' ')
fprintf(mp, "It could be related to component device %s.\n\n", disc);
+ if (disc && disc[0] == ' ')
+ fprintf(mp, "Extra information:%s.\n\n", disc);
fprintf(mp, "Faithfully yours, etc.\n");
syslog(priority, "%s event detected on md device %s", event, dev);
}
}
+
+/* Not really Monitor but ... */
+int Wait(char *dev)
+{
+ struct stat stb;
+ int devnum;
+ int rv = 1;
+
+ if (stat(dev, &stb) != 0) {
+ fprintf(stderr, Name ": Cannot find %s: %s\n", dev,
+ strerror(errno));
+ return 2;
+ }
+ if (major(stb.st_rdev) == MD_MAJOR)
+ devnum = minor(stb.st_rdev);
+ else
+ devnum = -1-(minor(stb.st_rdev)/64);
+
+ while(1) {
+ struct mdstat_ent *ms = mdstat_read(1, 0);
+ struct mdstat_ent *e;
+
+ for (e=ms ; e; e=e->next)
+ if (e->devnum == devnum)
+ break;
+
+ if (!e || e->percent < 0) {
+ free_mdstat(ms);
+ return rv;
+ }
+ free(ms);
+ rv = 0;
+ mdstat_wait(5);
+ }
+}