]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - util.c
Add udev rules file for mdadm.
[thirdparty/mdadm.git] / util.c
diff --git a/util.c b/util.c
index ab2d7e9f06e3cb1f91a4a9c30529df872ee95670..1806e08f6978e071f1084cbfd0fe7318e47f9cee 100644 (file)
--- a/util.c
+++ b/util.c
@@ -1116,13 +1116,34 @@ int devname2devnum(char *name)
 
 int stat2devnum(struct stat *st)
 {
+       char path[30];
+       char link[200];
+       char *cp;
+       int n;
+
        if ((S_IFMT & st->st_mode) == S_IFBLK) {
                if (major(st->st_rdev) == MD_MAJOR)
                        return minor(st->st_rdev);
-               else
-                       return -1- (minor(st->st_rdev)>>6);
+               else if (major(st->st_rdev) == get_mdp_major())
+                       return -1- (minor(st->st_rdev)>>MdpMinorShift);
+
+               /* must be an extended-minor partition. Look at the
+                * /sys/dev/block/%d:%d link which must look like
+                * ../../block/mdXXX/mdXXXpYY
+                */
+               sprintf(path, "/sys/dev/block/%d:%d", major(st->st_rdev),
+                       minor(st->st_rdev));
+               n = readlink(path, link, sizeof(link)-1);
+               if (n <= 0)
+                       return NoMdDev;
+               link[n] = 0;
+               cp = strrchr(link, '/');
+               if (cp) *cp = 0;
+               cp = strchr(link, '/');
+               if (cp && strncmp(cp, "/md", 3) == 0)
+                       return devname2devnum(cp+1);
        }
-       return -1;
+       return NoMdDev;
 
 }
 
@@ -1131,7 +1152,7 @@ int fd2devnum(int fd)
        struct stat stb;
        if (fstat(fd, &stb) == 0)
                return stat2devnum(&stb);
-       return -1;
+       return NoMdDev;
 }
 
 int mdmon_running(int devnum)
@@ -1188,7 +1209,7 @@ int start_mdmon(int devnum)
                NULL
        };
 
-       if (env_no_mdmon())
+       if (check_env("MDADM_NO_MDMON"))
                return 0;
 
        len = readlink("/proc/self/exe", pathbuf, sizeof(pathbuf));
@@ -1227,9 +1248,9 @@ int start_mdmon(int devnum)
        return 0;
 }
 
-int env_no_mdmon(void)
+int check_env(char *name)
 {
-       char *val = getenv("MDADM_NO_MDMON");
+       char *val = getenv(name);
 
        if (val && atoi(val) == 1)
                return 1;