]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Monitor.c
Change way of printing name of a process
[thirdparty/mdadm.git] / Monitor.c
index 86df18c264caf20e5a5f342ba0e45d5938ac754b..43470f8e57196aea79de9b6fa6e207505c1ffc62 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -38,6 +38,7 @@ struct state {
        char *spare_group;
        int active, working, failed, spare, raid;
        int from_config;
+       int from_auto;
        int expected_spares;
        int devstate[MAX_DISKS];
        dev_t devid[MAX_DISKS];
@@ -206,7 +207,7 @@ int Monitor(struct mddev_dev *devlist,
 
        while (! finished) {
                int new_found = 0;
-               struct state *st;
+               struct state *st, **stp;
                int anydegraded = 0;
 
                if (mdstat)
@@ -236,6 +237,16 @@ int Monitor(struct mddev_dev *devlist,
                                mdstat_wait(c->delay);
                }
                c->test = 0;
+
+               for (stp = &statelist; (st = *stp) != NULL; ) {
+                       if (st->from_auto && st->err > 5) {
+                               *stp = st->next;
+                               free(st->devname);
+                               free(st->spare_group);
+                               free(st);
+                       } else
+                               stp = &st->next;
+               }
        }
        for (st2 = statelist; st2; st2 = statelist) {
                statelist = st2->next;
@@ -370,14 +381,14 @@ static void alert(char *event, char *dev, char *disc, struct alert_info *info)
                        if (info->mailfrom)
                                fprintf(mp, "From: %s\n", info->mailfrom);
                        else
-                               fprintf(mp, "From: " Name " monitoring <root>\n");
+                               fprintf(mp, "From: %s monitoring <root>\n", Name);
                        fprintf(mp, "To: %s\n", info->mailaddr);
                        fprintf(mp, "Subject: %s event on %s:%s\n\n",
                                event, dev, hname);
 
                        fprintf(mp,
                                "This is an automatically generated"
-                               " mail message from " Name "\n");
+                               " mail message from %s\n", Name);
                        fprintf(mp, "running on %s\n\n", hname);
 
                        fprintf(mp,
@@ -449,7 +460,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        mdu_array_info_t array;
        struct mdstat_ent *mse = NULL, *mse2;
        char *dev = st->devname;
-       int fd;
+       int fd = -1;
        int i;
        int remaining_disks;
        int last_disk;
@@ -457,18 +468,45 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
 
        if (test)
                alert("TestMessage", dev, NULL, ainfo);
+       if (st->devnm[0])
+               fd = open("/sys/block", O_RDONLY|O_DIRECTORY);
+       if (fd >= 0) {
+               /* Don't open the device unless it is present and
+                * active in sysfs.
+                */
+               char buf[10];
+               close(fd);
+               fd = sysfs_open(st->devnm, NULL, "array_state");
+               if (fd < 0 ||
+                   read(fd, buf, 10) < 5 ||
+                   strncmp(buf,"clear",5) == 0 ||
+                   strncmp(buf,"inact",5) == 0) {
+                       if (fd >= 0)
+                               close(fd);
+                       fd = sysfs_open(st->devnm, NULL, "level");
+                       if (fd < 0 || read(fd, buf, 10) != 0) {
+                               if (fd >= 0)
+                                       close(fd);
+                               if (!st->err)
+                                       alert("DeviceDisappeared", dev, NULL, ainfo);
+                               st->err++;
+                               return 0;
+                       }
+               }
+               close(fd);
+       }
        fd = open(dev, O_RDONLY);
        if (fd < 0) {
                if (!st->err)
                        alert("DeviceDisappeared", dev, NULL, ainfo);
-               st->err=1;
+               st->err++;
                return 0;
        }
        fcntl(fd, F_SETFD, FD_CLOEXEC);
        if (ioctl(fd, GET_ARRAY_INFO, &array)<0) {
                if (!st->err)
                        alert("DeviceDisappeared", dev, NULL, ainfo);
-               st->err=1;
+               st->err++;
                close(fd);
                return 0;
        }
@@ -478,7 +516,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        if (array.level == 0 || array.level == -1) {
                if (!st->err && !st->from_config)
                        alert("DeviceDisappeared", dev, "Wrong-Level", ainfo);
-               st->err = 1;
+               st->err++;
                close(fd);
                return 0;
        }
@@ -494,7 +532,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
        if (!mse) {
                /* duplicated array in statelist
                 * or re-created after reading mdstat*/
-               st->err = 1;
+               st->err++;
                close(fd);
                return 0;
        }
@@ -505,7 +543,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                array.utime = st->utime + 1;;
 
        if (st->err) {
-               /* New array appeared where previously had and error */
+               /* New array appeared where previously had an error */
                st->err = 0;
                st->percent = RESYNC_NONE;
                new_array = 1;
@@ -684,6 +722,7 @@ static int add_new_arrays(struct mdstat_ent *mdstat, struct state **statelist,
                        close(fd);
                        st->next = *statelist;
                        st->err = 1;
+                       st->from_auto = 1;
                        strcpy(st->devnm, mse->devnm);
                        st->percent = RESYNC_UNKNOWN;
                        st->expected_spares = -1;
@@ -1050,17 +1089,12 @@ int WaitClean(char *dev, int sock, int verbose)
        if (rv) {
                int state_fd = sysfs_open(fd2devnm(fd), NULL, "array_state");
                char buf[20];
-               fd_set fds;
-               struct timeval tm;
+               int delay = 5000;
 
                /* minimize the safe_mode_delay and prepare to wait up to 5s
                 * for writes to quiesce
                 */
                sysfs_set_safemode(mdi, 1);
-               tm.tv_sec = 5;
-               tm.tv_usec = 0;
-
-               FD_ZERO(&fds);
 
                /* wait for array_state to be clean */
                while (1) {
@@ -1069,8 +1103,7 @@ int WaitClean(char *dev, int sock, int verbose)
                                break;
                        if (sysfs_match_word(buf, clean_states) <= 4)
                                break;
-                       FD_SET(state_fd, &fds);
-                       rv = select(state_fd + 1, NULL, NULL, &fds, &tm);
+                       rv = sysfs_wait(state_fd, &delay);
                        if (rv < 0 && errno != EINTR)
                                break;
                        lseek(state_fd, 0, SEEK_SET);