summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-11-04 10:35:08 +1100
committerNeilBrown <neilb@suse.de>2008-11-04 10:35:08 +1100
commitd7ab966bb82d1dfe5d532ae7bcbe233e906628ae (patch)
tree1a81a108976620404f27727ea469d28468333f49 /util.c
parent5c8d7dc132ff0059a4447f85562dbdcf43d1146e (diff)
downloadmdadm-d7ab966bb82d1dfe5d532ae7bcbe233e906628ae.tar.gz
mdadm-d7ab966bb82d1dfe5d532ae7bcbe233e906628ae.tar.xz
mdadm-d7ab966bb82d1dfe5d532ae7bcbe233e906628ae.zip
Move recently merged /sys/dev/ lookup into stat2devnum.
But sysfs_init and stat2devnum try to convert stat information into an md devnum. Combine all the value of both pieces of code into stat2devnum and have sysfs_init call that. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r--util.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/util.c b/util.c
index ab2d7e9..f073bce 100644
--- 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)