]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Adjust major number testing to allow for extended minor number in 2.6.28
authorNeilBrown <neilb@suse.de>
Thu, 30 Oct 2008 05:37:29 +0000 (16:37 +1100)
committerNeilBrown <neilb@suse.de>
Thu, 30 Oct 2008 05:37:29 +0000 (16:37 +1100)
From 2.6.28, normal md device will be able to have partitions.  These
partitions will have a different major number.  Sometimes mdadm tests
the major number and so can get confused.
Change these tests to test against get_mdp_major().  mdp does not use
extended minor number and so this test will always be accurate.

Also use /sys/dev links to map major/minor to devnum in sysfs.

Signed-off-by: NeilBrown <neilb@suse.de>
Detail.c
sysfs.c

index 9ba8af1d4da2cae97a30f80a4a4a8b27030f4642..3cee66fed89c8c6a315fa60efd3ce3ae7d196bd4 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -169,7 +169,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
                struct mdstat_ent *ms = mdstat_read(0, 0);
                struct mdstat_ent *e;
                int devnum = array.md_minor;
-               if (major(stb.st_rdev) != MD_MAJOR)
+               if (major(stb.st_rdev) == get_mdp_major())
                        devnum = -1 - devnum;
 
                for (e=ms; e; e=e->next)
diff --git a/sysfs.c b/sysfs.c
index 0255f8825e9ef12af2f485a1e0ee247066bec388..6350242b6db175d0896cd01d9717ee6f63e03fd5 100644 (file)
--- a/sysfs.c
+++ b/sysfs.c
@@ -83,11 +83,34 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
                if (fstat(fd, &stb)) return NULL;
                if (ioctl(fd, RAID_VERSION, &vers) != 0)
                        return NULL;
-               if (major(stb.st_rdev)==9)
+               if (major(stb.st_rdev) == MD_MAJOR)
                        sprintf(sra->sys_name, "md%d", (int)minor(stb.st_rdev));
-               else
+               else if (major(stb.st_rdev) == get_mdp_major())
                        sprintf(sra->sys_name, "md_d%d",
                                (int)minor(stb.st_rdev)>>MdpMinorShift);
+               else {
+                       /* must be an extended-minor partition. Look at the
+                        * /sys/dev/block/%d:%d link which must look like
+                        * ../../block/mdXXX/mdXXXpYY
+                        */
+                       char path[30];
+                       char link[200];
+                       char *cp;
+                       int n;
+                       sprintf(path, "/sys/dev/block/%d:%d", major(stb.st_rdev),
+                               minor(stb.st_rdev));
+                       n = readlink(path, link, sizeof(link)-1);
+                       if (n <= 0)
+                               return NULL;
+                       link[n] = 0;
+                       cp = strrchr(link, '/');
+                       if (cp) *cp = 0;
+                       cp = strchr(link, '/');
+                       if (cp && strncmp(cp, "/md", 3) == 0)
+                               strcpy(sra->sys_name, cp+1);
+                       else
+                               return NULL;
+               }
        } else {
                if (devnum >= 0)
                        sprintf(sra->sys_name, "md%d", devnum);
@@ -244,7 +267,7 @@ unsigned long long get_component_size(int fd)
        char fname[50];
        int n;
        if (fstat(fd, &stb)) return 0;
-       if (major(stb.st_rdev) == 9)
+       if (major(stb.st_rdev) != get_mdp_major())
                sprintf(fname, "/sys/block/md%d/md/component_size",
                        (int)minor(stb.st_rdev));
        else