if (mdi &&
mdi->array.level > 0 &&
is_subarray(mdi->text_version)) {
- char *cp;
-
/* This is mdmon managed. */
close(fd);
if (sysfs_set_str(mdi, NULL,
}
/* Give monitor a chance to act */
- cp = strchr(mdi->text_version+1, '/');
- if (*cp)
- *cp = 0;
- ping_monitor(mdi->text_version+1);
+ ping_monitor(mdi->text_version);
fd = open(devname, O_RDONLY);
} else if (mdi &&
strerror(errno));
return 2;
}
- if (major(stb.st_rdev) == MD_MAJOR)
- devnum = minor(stb.st_rdev);
- else
- devnum = -1-(minor(stb.st_rdev)/64);
+ devnum = stat2devnum(&stb);
while(1) {
struct mdstat_ent *ms = mdstat_read(1, 0);
break;
if (!e || e->percent < 0) {
+ if (e &&
+ strncmp(e->metadata_version, "external:", 9) == 0) {
+ if (is_subarray(&e->metadata_version[9]))
+ ping_monitor(&e->metadata_version[9]);
+ else
+ ping_monitor(devnum2devname(devnum));
+ }
free_mdstat(ms);
return rv;
}
extern char *devnum2devname(int num);
extern int devname2devnum(char *name);
+extern int stat2devnum(struct stat *st);
extern int fd2devnum(int fd);
static inline int dev2major(int d)
int sfd;
long fl;
struct sockaddr_un addr;
+ int pos;
+ char *c;
+
+ pos = sprintf(path, "/var/run/mdadm/");
+ if (is_subarray(devname)) {
+ devname++;
+ c = strchr(devname, '/');
+ if (!c)
+ return -1;
+ snprintf(&path[pos], c - devname + 1, "%s", devname);
+ pos += c - devname;
+ } else
+ pos += sprintf(&path[pos], "%s", devname);
+ sprintf(&path[pos], ".sock");
- sprintf(path, "/var/run/mdadm/%s.sock", devname);
sfd = socket(PF_LOCAL, SOCK_STREAM, 0);
if (sfd < 0)
return -1;
return num;
}
-int fd2devnum(int fd)
+int stat2devnum(struct stat *st)
{
- struct stat stb;
- if (fstat(fd, &stb) == 0 &&
- (S_IFMT&stb.st_mode)==S_IFBLK) {
- if (major(stb.st_rdev) == MD_MAJOR)
- return minor(stb.st_rdev);
+ if ((S_IFMT & st->st_mode) == S_IFBLK) {
+ if (major(st->st_rdev) == MD_MAJOR)
+ return minor(st->st_rdev);
else
- return -1- (minor(stb.st_rdev)>>6);
+ return -1- (minor(st->st_rdev)>>6);
}
return -1;
+
+}
+
+int fd2devnum(int fd)
+{
+ struct stat stb;
+ if (fstat(fd, &stb) == 0)
+ return stat2devnum(&stb);
+ return -1;
}
int mdmon_running(int devnum)