diff options
author | NeilBrown <neilb@suse.de> | 2008-10-30 17:02:49 +1100 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2008-10-30 17:02:49 +1100 |
commit | 9c3220067be02b5ef4da6e51ec91f928572d5223 (patch) | |
tree | 7cb9a23e61a01d5fed4a1a5516959b303c4d7717 | |
parent | 6c766cf10178b9bae4ddcfd6b8de2d70f9d84568 (diff) | |
parent | 4ebd3237119b1c1d701ea0c94795631883e449ed (diff) | |
download | mdadm-9c3220067be02b5ef4da6e51ec91f928572d5223.tar.gz mdadm-9c3220067be02b5ef4da6e51ec91f928572d5223.tar.xz mdadm-9c3220067be02b5ef4da6e51ec91f928572d5223.zip |
Merge branch 'master' into devel-3.0
-rw-r--r-- | Detail.c | 2 | ||||
-rw-r--r-- | sysfs.c | 29 |
2 files changed, 27 insertions, 4 deletions
@@ -216,7 +216,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) @@ -88,11 +88,34 @@ void sysfs_init(struct mdinfo *mdi, int fd, int devnum) return; if (ioctl(fd, RAID_VERSION, &vers) != 0) return; - if (major(stb.st_rdev)==9) + if (major(stb.st_rdev) == MD_MAJOR) sprintf(mdi->sys_name, "md%d", (int)minor(stb.st_rdev)); - else + else if (major(stb.st_rdev) == get_mdp_major()) sprintf(mdi->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; + link[n] = 0; + cp = strrchr(link, '/'); + if (cp) *cp = 0; + cp = strchr(link, '/'); + if (cp && strncmp(cp, "/md", 3) == 0) + strcpy(mdi->sys_name, cp+1); + else + return; + } } else { if (devnum >= 0) sprintf(mdi->sys_name, "md%d", devnum); @@ -363,7 +386,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 |