diff -u -r xfsprogs-2.8.11/libdisk/md.c xfsprogs-2.8.11-mdp/libdisk/md.c --- xfsprogs-2.8.11/libdisk/md.c 2006-06-26 07:01:15.000000000 +0200 +++ xfsprogs-2.8.11-mdp/libdisk/md.c 2008-03-26 20:12:38.000000000 +0100 @@ -24,8 +24,12 @@ dev_t dev) { if (major(dev) == MD_MAJOR) - return 1; - return get_driver_block_major("md", major(dev)); + return MD_IS_MD; + if (get_driver_block_major("md", major(dev))) + return MD_IS_MD; + if (get_driver_block_major("mdp", major(dev))) + return MD_IS_MDP; + return 0; } int @@ -37,12 +41,32 @@ int *sectalign, struct stat64 *sb) { - if (mnt_is_md_subvol(sb->st_rdev)) { + char *pc, *dfile2 = NULL; + int is_md; + + if ((is_md = mnt_is_md_subvol(sb->st_rdev))) { struct md_array_info md; int fd; + if (is_md == MD_IS_MDP) { + if (!(pc = strrchr(dfile, 'd')) + || !(pc = strchr(pc, 'p'))) { + fprintf(stderr, + _("Error getting MD array device from %s\n"), + dfile); + exit(1); + } + dfile2 = (char *) malloc(pc - dfile + 1); + if (dfile2 == NULL) { + fprintf(stderr, + _("Couldn't malloc device string\n")); + exit(1); + } + strncpy(dfile2, dfile, pc - dfile); + dfile2[pc - dfile + 1] = '\0'; + } /* Open device */ - fd = open(dfile, O_RDONLY); + fd = open(dfile2 ? dfile2 : dfile, O_RDONLY); if (fd == -1) return 0; @@ -50,10 +74,11 @@ if (ioctl(fd, GET_ARRAY_INFO, &md)) { fprintf(stderr, _("Error getting MD array info from %s\n"), - dfile); + dfile2 ? dfile2 : dfile); exit(1); } close(fd); + if (dfile2) free(dfile2); /* * Ignore levels we don't want aligned (e.g. linear) diff -u -r xfsprogs-2.8.11/libdisk/md.h xfsprogs-2.8.11-mdp/libdisk/md.h --- xfsprogs-2.8.11/libdisk/md.h 2006-06-26 07:01:15.000000000 +0200 +++ xfsprogs-2.8.11-mdp/libdisk/md.h 2008-03-26 20:12:10.000000000 +0100 @@ -20,6 +20,9 @@ #define MD_MAJOR 9 /* we also check at runtime */ #endif +#define MD_IS_MD 1 +#define MD_IS_MDP 2 + #define GET_ARRAY_INFO _IOR (MD_MAJOR, 0x11, struct md_array_info) #define MD_SB_CLEAN 0