]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Monitor.c
Check all member devices in enough_fd
[thirdparty/mdadm.git] / Monitor.c
index 337785d67fc531da21978ff025a97d61361995e7..101bca4cc8053198a0a09ec0f87be96e5a4687c3 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -143,7 +143,7 @@ int Monitor(struct mddev_dev *devlist,
                        fprintf(stderr, Name ": Monitor using program \"%s\" from config file\n",
                               alert_cmd);
        }
-       if (scan && !mailaddr && !alert_cmd) {
+       if (scan && !mailaddr && !alert_cmd && !dosyslog) {
                fprintf(stderr, Name ": No mail address or alert command - not monitoring.\n");
                return 1;
        }
@@ -335,7 +335,7 @@ static void alert(char *event, char *dev, char *disc, struct alert_info *info)
 {
        int priority;
 
-       if (!info->alert_cmd && !info->mailaddr) {
+       if (!info->alert_cmd && !info->mailaddr && !info->dosyslog) {
                time_t now = time(0);
 
                printf("%1.15s: %s on %s %s\n", ctime(&now)+4, event, dev, disc?disc:"unknown device");
@@ -449,6 +449,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        char *dev = st->devname;
        int fd;
        int i;
+       int remaining_disks;
+       int last_disk;
 
        if (test)
                alert("TestMessage", dev, NULL, ainfo);
@@ -565,7 +567,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        }
        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;
@@ -573,11 +576,15 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                        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 (strncmp(mse->metadata_version, "external:", 9) == 0 &&
+       if (mse->metadata_version &&
+           strncmp(mse->metadata_version, "external:", 9) == 0 &&
            is_subarray(mse->metadata_version+9))
                st->parent_dev =
                        devname2devnum(mse->metadata_version+10);
@@ -595,7 +602,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                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) {