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)
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);
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;
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;
}