Hi XFS list,
please find attached a patch for libdisk/mkfs.xfs which tunes XFS on
software partitionable RAID arrays, also called mdp.
Hubert Verstraete
------------------------------------------------------------------------
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