]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Monitor.c
Detail: adding sync status for cluster device
[thirdparty/mdadm.git] / Monitor.c
index c7c05d27f093b7af6508599118f973f5347bc708..2d6b3b9016e4e4f608e230bfe16e1642c5875016 100644 (file)
--- a/Monitor.c
+++ b/Monitor.c
@@ -301,26 +301,34 @@ static int make_daemon(char *pidfile)
 
 static int check_one_sharer(int scan)
 {
-       int pid, rv;
+       int pid;
+       FILE *comm_fp;
        FILE *fp;
-       char dir[20];
+       char comm_path[100];
        char path[100];
-       struct stat buf;
+       char comm[20];
+
        sprintf(path, "%s/autorebuild.pid", MDMON_DIR);
        fp = fopen(path, "r");
        if (fp) {
                if (fscanf(fp, "%d", &pid) != 1)
                        pid = -1;
-               sprintf(dir, "/proc/%d", pid);
-               rv = stat(dir, &buf);
-               if (rv != -1) {
-                       if (scan) {
-                               pr_err("Only one autorebuild process allowed in scan mode, aborting\n");
-                               fclose(fp);
-                               return 1;
-                       } else {
-                               pr_err("Warning: One autorebuild process already running.\n");
+               snprintf(comm_path, sizeof(comm_path),
+                        "/proc/%d/comm", pid);
+               comm_fp = fopen(comm_path, "r");
+               if (comm_fp) {
+                       if (fscanf(comm_fp, "%s", comm) &&
+                           strncmp(basename(comm), Name, strlen(Name)) == 0) {
+                               if (scan) {
+                                       pr_err("Only one autorebuild process allowed in scan mode, aborting\n");
+                                       fclose(comm_fp);
+                                       fclose(fp);
+                                       return 1;
+                               } else {
+                                       pr_err("Warning: One autorebuild process already running.\n");
+                               }
                        }
+                       fclose(comm_fp);
                }
                fclose(fp);
        }
@@ -557,7 +565,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat,
                alert("RebuildStarted", dev, NULL, ainfo);
        if (st->percent >= 0 && mse->percent >= 0 &&
            (mse->percent / increments) > (st->percent / increments)) {
-               char percentalert[15];
+               char percentalert[18];
                /*
                 * "RebuildNN" (10 chars) or "RebuildStarted" (15 chars)
                 */
@@ -1055,8 +1063,11 @@ int Wait(char *dev)
        }
 }
 
+/* The state "broken" is used only for RAID0/LINEAR - it's the same as
+ * "clean", but used in case the array has one or more members missing.
+ */
 static char *clean_states[] = {
-       "clear", "inactive", "readonly", "read-auto", "clean", NULL };
+       "clear", "inactive", "readonly", "read-auto", "clean", "broken", NULL };
 
 int WaitClean(char *dev, int verbose)
 {
@@ -1116,7 +1127,8 @@ int WaitClean(char *dev, int verbose)
                        rv = read(state_fd, buf, sizeof(buf));
                        if (rv < 0)
                                break;
-                       if (sysfs_match_word(buf, clean_states) <= 4)
+                       if (sysfs_match_word(buf, clean_states) <
+                           (int)ARRAY_SIZE(clean_states) - 1)
                                break;
                        rv = sysfs_wait(state_fd, &delay);
                        if (rv < 0 && errno != EINTR)