if (fstat(fd, &stb)) return NULL;
if (ioctl(fd, RAID_VERSION, &vers) != 0)
return NULL;
- if (major(stb.st_rdev)==9)
- sprintf(sra->sys_name, "md%d", minor(stb.st_rdev));
- else
+ if (major(stb.st_rdev) == MD_MAJOR)
+ sprintf(sra->sys_name, "md%d", (int)minor(stb.st_rdev));
+ else if (major(stb.st_rdev) == get_mdp_major())
sprintf(sra->sys_name, "md_d%d",
- minor(stb.st_rdev)>>MdpMinorShift);
+ (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);
strcpy(base, "metadata_version");
if (load_sys(fname, buf))
goto abort;
- if (strncmp(buf, "none", 4) == 0)
+ if (strncmp(buf, "none", 4) == 0) {
sra->array.major_version =
sra->array.minor_version = -1;
- else if (strncmp(buf, "external:", 9) == 0) {
+ strcpy(sra->text_version, "");
+ } else if (strncmp(buf, "external:", 9) == 0) {
sra->array.major_version = -1;
sra->array.minor_version = -2;
strcpy(sra->text_version, buf+9);
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",
- minor(stb.st_rdev));
+ (int)minor(stb.st_rdev));
else
sprintf(fname, "/sys/block/md_d%d/md/component_size",
- minor(stb.st_rdev)>>MdpMinorShift);
+ (int)minor(stb.st_rdev)>>MdpMinorShift);
fd = open(fname, O_RDONLY);
if (fd < 0)
return 0;