*/
struct state *statelist = NULL;
+ struct state *st2;
int finished = 0;
struct mdstat_ent *mdstat = NULL;
char *mailfrom = NULL;
}
test = 0;
}
+ for (st2 = statelist; st2; st2 = statelist) {
+ statelist = st2->next;
+ free(st2);
+ }
+
if (pidfile)
unlink(pidfile);
return 0;
int pid, rv;
FILE *fp;
char dir[20];
+ char path[100];
struct stat buf;
- fp = fopen("/var/run/mdadm/autorebuild.pid", "r");
+ sprintf(path, "%s/autorebuild.pid", MDMON_DIR);
+ fp = fopen(path, "r");
if (fp) {
if (fscanf(fp, "%d", &pid) != 1)
pid = -1;
fclose(fp);
}
if (scan) {
- if (mkdir("/var/run/mdadm", S_IRWXU) < 0 &&
+ if (mkdir(MDMON_DIR, S_IRWXU) < 0 &&
errno != EEXIST) {
fprintf(stderr, Name ": Can't create "
"autorebuild.pid file\n");
} else {
- fp = fopen("/var/run/mdadm/autorebuild.pid", "w");
+ fp = fopen(path, "w");
if (!fp)
fprintf(stderr, Name ": Cannot create"
" autorebuild.pid"
char *dev = st->devname;
int fd;
int i;
+ int remaining_disks;
+ int last_disk;
if (test)
alert("TestMessage", dev, NULL, ainfo);
struct mdinfo *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);
+ char cnt[80];
+ snprintf(cnt, sizeof(cnt),
+ " mismatches found: %d (on raid level %d)",
+ sra->mismatch_cnt, array.level);
alert("RebuildFinished", dev, cnt, ainfo);
} else
alert("RebuildFinished", dev, NULL, ainfo);
}
st->percent = mse->percent;
- for (i=0; i<MaxDisks && i <= array.raid_disks + array.nr_disks;
+ remaining_disks = array.nr_disks;
+ for (i=0; i<MaxDisks && remaining_disks > 0;
i++) {
mdu_disk_info_t disc;
disc.number = i;
info[i].state = disc.state;
info[i].major = disc.major;
info[i].minor = disc.minor;
+ if (disc.major || disc.minor)
+ remaining_disks --;
} else
info[i].major = info[i].minor = 0;
}
+ last_disk = i;
if (mse->metadata_version &&
strncmp(mse->metadata_version, "external:", 9) == 0 &&
int change;
char *dv = NULL;
disc.number = i;
- if (i > array.raid_disks + array.nr_disks) {
+ if (i >= last_disk) {
newstate = 0;
disc.major = disc.minor = 0;
} else if (info[i].major || info[i].minor) {