if (!mailaddr) {
mailaddr = conf_get_mailaddr();
if (mailaddr && ! scan)
- fprintf(stderr, Name ": Monitor using email address \"%s\" from config file\n",
+ pr_err("Monitor using email address \"%s\" from config file\n",
mailaddr);
}
mailfrom = conf_get_mailfrom();
if (!alert_cmd) {
alert_cmd = conf_get_program();
if (alert_cmd && ! scan)
- fprintf(stderr, Name ": Monitor using program \"%s\" from config file\n",
+ pr_err("Monitor using program \"%s\" from config file\n",
alert_cmd);
}
if (scan && !mailaddr && !alert_cmd && !dosyslog) {
- fprintf(stderr, Name ": No mail address or alert command - not monitoring.\n");
+ pr_err("No mail address or alert command - not monitoring.\n");
return 1;
}
info.alert_cmd = alert_cmd;
continue;
if (strcasecmp(mdlist->devname, "<ignore>") == 0)
continue;
- st = calloc(1, sizeof *st);
- if (st == NULL)
- continue;
+ st = xcalloc(1, sizeof *st);
if (mdlist->devname[0] == '/')
- st->devname = strdup(mdlist->devname);
+ st->devname = xstrdup(mdlist->devname);
else {
- st->devname = malloc(8+strlen(mdlist->devname)+1);
+ st->devname = xmalloc(8+strlen(mdlist->devname)+1);
strcpy(strcpy(st->devname, "/dev/md/"),
mdlist->devname);
}
st->percent = RESYNC_UNKNOWN;
st->expected_spares = mdlist->spare_disks;
if (mdlist->spare_group)
- st->spare_group = strdup(mdlist->spare_group);
+ st->spare_group = xstrdup(mdlist->spare_group);
statelist = st;
}
} else {
struct mddev_dev *dv;
for (dv=devlist ; dv; dv=dv->next) {
struct mddev_ident *mdlist = conf_get_ident(dv->devname);
- struct state *st = calloc(1, sizeof *st);
- if (st == NULL)
- continue;
- st->devname = strdup(dv->devname);
+ struct state *st = xcalloc(1, sizeof *st);
+ st->devname = xstrdup(dv->devname);
st->next = statelist;
st->devnum = INT_MAX;
st->percent = RESYNC_UNKNOWN;
if (mdlist) {
st->expected_spares = mdlist->spare_disks;
if (mdlist->spare_group)
- st->spare_group = strdup(mdlist->spare_group);
+ st->spare_group = xstrdup(mdlist->spare_group);
}
statelist = st;
}
rv = stat(dir, &buf);
if (rv != -1) {
if (scan) {
- fprintf(stderr, Name ": Only one "
+ pr_err("Only one "
"autorebuild process allowed"
" in scan mode, aborting\n");
fclose(fp);
return 1;
} else {
- fprintf(stderr, Name ": Warning: One"
+ pr_err("Warning: One"
" autorebuild process already"
" running.\n");
}
if (scan) {
if (mkdir(MDMON_DIR, S_IRWXU) < 0 &&
errno != EEXIST) {
- fprintf(stderr, Name ": Can't create "
+ pr_err("Can't create "
"autorebuild.pid file\n");
} else {
fp = fopen(path, "w");
if (!fp)
- fprintf(stderr, Name ": Cannot create"
+ pr_err("Cannot create"
" autorebuild.pid"
"file\n");
else {
int i;
int remaining_disks;
int last_disk;
+ int new_array = 0;
if (test)
alert("TestMessage", dev, NULL, ainfo);
* just make sure it is always different. */
array.utime = st->utime + 1;;
+ if (st->err) {
+ /* New array appeared where previously had and error */
+ st->err = 0;
+ st->percent = RESYNC_NONE;
+ new_array = 1;
+ alert("NewArray", st->devname, NULL, ainfo);
+ }
+
if (st->utime == array.utime &&
st->failed == array.failed_disks &&
st->working == array.working_disks &&
mse->percent == st->percent
))) {
close(fd);
- st->err = 0;
if ((st->active < st->raid) && st->spare == 0)
return 1;
else
int change;
char *dv = NULL;
disc.number = i;
- if (i >= last_disk) {
- newstate = 0;
- disc.major = disc.minor = 0;
- } else if (info[i].major || info[i].minor) {
+ if (i < last_disk &&
+ (info[i].major || info[i].minor)) {
newstate = info[i].state;
dv = map_dev_preferred(
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 < (int)strlen(mse->pattern)) {
- switch(mse->pattern[i]) {
- case 'U': newstate = 6 /* ACTIVE/SYNC */; break;
- case '_': newstate = 8 /* REMOVED */; break;
- }
- disc.major = disc.minor = 0;
- }
+ } else
+ newstate = (1 << MD_DISK_REMOVED);
+
if (dv == NULL && st->devid[i])
dv = map_dev_preferred(
major(st->devid[i]),
minor(st->devid[i]), 1, prefer);
change = newstate ^ st->devstate[i];
- if (st->utime && change && !st->err) {
- if (i < array.raid_disks &&
- (((newstate&change)&(1<<MD_DISK_FAULTY)) ||
- ((st->devstate[i]&change)&(1<<MD_DISK_ACTIVE)) ||
- ((st->devstate[i]&change)&(1<<MD_DISK_SYNC)))
- )
+ if (st->utime && change && !st->err && !new_array) {
+ if ((st->devstate[i]&change)&(1<<MD_DISK_SYNC))
alert("Fail", dev, dv, ainfo);
- else if (i >= array.raid_disks &&
+ else if ((newstate & (1<<MD_DISK_FAULTY)) &&
(disc.major || disc.minor) &&
- st->devid[i] == makedev(disc.major, disc.minor) &&
- ((newstate&change)&(1<<MD_DISK_FAULTY))
- )
+ st->devid[i] == makedev(disc.major, disc.minor))
alert("FailSpare", dev, dv, ainfo);
- else if (i < array.raid_disks &&
- ! (newstate & (1<<MD_DISK_REMOVED)) &&
- (((st->devstate[i]&change)&(1<<MD_DISK_FAULTY)) ||
- ((newstate&change)&(1<<MD_DISK_ACTIVE)) ||
- ((newstate&change)&(1<<MD_DISK_SYNC)))
- )
+ else if ((newstate&change)&(1<<MD_DISK_SYNC))
alert("SpareActive", dev, dv, ainfo);
}
st->devstate[i] = newstate;
(strcmp(mse->level, "raid0") != 0 &&
strcmp(mse->level, "linear") != 0))
) {
- struct state *st = calloc(1, sizeof *st);
+ struct state *st = xcalloc(1, sizeof *st);
mdu_array_info_t array;
int fd;
- if (st == NULL)
- continue;
- st->devname = strdup(get_md_name(mse->devnum));
+ st->devname = xstrdup(get_md_name(mse->devnum));
if ((fd = open(st->devname, O_RDONLY)) < 0 ||
ioctl(fd, GET_ARRAY_INFO, &array)< 0) {
/* no such array */
*statelist = st;
if (test)
alert("TestMessage", st->devname, NULL, info);
- alert("NewArray", st->devname, NULL, info);
new_found = 1;
}
return new_found;
int rv = 1;
if (stat(dev, &stb) != 0) {
- fprintf(stderr, Name ": Cannot find %s: %s\n", dev,
+ pr_err("Cannot find %s: %s\n", dev,
strerror(errno));
return 2;
}
fd = open(dev, O_RDONLY);
if (fd < 0) {
if (verbose)
- fprintf(stderr, Name ": Couldn't open %s: %s\n", dev, strerror(errno));
+ pr_err("Couldn't open %s: %s\n", dev, strerror(errno));
return 1;
}
mdi = sysfs_read(fd, devnum, GET_VERSION|GET_LEVEL|GET_SAFEMODE);
if (!mdi) {
if (verbose)
- fprintf(stderr, Name ": Failed to read sysfs attributes for "
- "%s\n", dev);
+ pr_err("Failed to read sysfs attributes for "
+ "%s\n", dev);
close(fd);
return 0;
}
} else
rv = 1;
if (rv && verbose)
- fprintf(stderr, Name ": Error waiting for %s to be clean\n",
+ pr_err("Error waiting for %s to be clean\n",
dev);
/* restore the original safe_mode_delay */