]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Having single function to read mdmon pid file.
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index 67c355069b84b586a6d1df0ebfc67f7c174c1104..e5b0c1f5697bbabd84bc40354438a3f4eb3b1776 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1338,8 +1338,11 @@ int add_disk(int mdfd, struct supertype *st,
        int rv;
 #ifndef MDASSEMBLE
        if (st->ss->external) {
-               rv = sysfs_add_disk(sra, info,
-                                   info->disk.state & (1<<MD_DISK_SYNC));
+               if (info->disk.state & (1<<MD_DISK_SYNC))
+                       info->recovery_start = MaxSector;
+               else
+                       info->recovery_start = 0;
+               rv = sysfs_add_disk(sra, info, 0);
                if (! rv) {
                        struct mdinfo *sd2;
                        for (sd2 = sra->devs; sd2; sd2=sd2->next)
@@ -1383,10 +1386,25 @@ int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info)
        return rv;
 }
 
+unsigned long long min_recovery_start(struct mdinfo *array)
+{
+       /* find the minimum recovery_start in an array for metadata
+        * formats that only record per-array recovery progress instead
+        * of per-device
+        */
+       unsigned long long recovery_start = MaxSector;
+       struct mdinfo *d;
+
+       for (d = array->devs; d; d = d->next)
+               recovery_start = min(recovery_start, d->recovery_start);
+
+       return recovery_start;
+}
+
 char *devnum2devname(int num)
 {
        char name[100];
-       if (num > 0)
+       if (num >= 0)
                sprintf(name, "md%d", num);
        else
                sprintf(name, "md_d%d", -1-num);
@@ -1445,14 +1463,14 @@ int fd2devnum(int fd)
        return NoMdDev;
 }
 
-int mdmon_running(int devnum)
+int mdmon_pid(int devnum)
 {
        char path[100];
        char pid[10];
        int fd;
        int n;
        sprintf(path, "/var/run/mdadm/%s.pid", devnum2devname(devnum));
-       fd = open(path, O_RDONLY, 0);
+       fd = open(path, O_RDONLY | O_NOATIME, 0);
 
        if (fd < 0)
                return 0;
@@ -1460,27 +1478,15 @@ int mdmon_running(int devnum)
        close(fd);
        if (n <= 0)
                return 0;
-       if (kill(atoi(pid), 0) == 0)
-               return 1;
-       return 0;
+       return atoi(pid);
 }
 
-int signal_mdmon(int devnum)
+int mdmon_running(int devnum)
 {
-       char path[100];
-       char pid[10];
-       int fd;
-       int n;
-       sprintf(path, "/var/run/mdadm/%s.pid", devnum2devname(devnum));
-       fd = open(path, O_RDONLY, 0);
-
-       if (fd < 0)
-               return 0;
-       n = read(fd, pid, 9);
-       close(fd);
-       if (n <= 0)
+       int pid = mdmon_pid(devnum);
+       if (pid <= 0)
                return 0;
-       if (kill(atoi(pid), SIGUSR1) == 0)
+       if (kill(pid, 0) == 0)
                return 1;
        return 0;
 }