From: Neil Brown <neilb@cse.unsw.edu.au>

Make sure correct major is used when assembling partitioned md arrays from
boot parameters.

We need to make mdp_major available to do_mounts_md.c, and use it there.


---

 25-akpm/drivers/md/md.c     |    2 +-
 25-akpm/init/do_mounts_md.c |    9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff -puN drivers/md/md.c~md-array-assembly-major-fix drivers/md/md.c
--- 25/drivers/md/md.c~md-array-assembly-major-fix	Wed Mar 10 15:46:59 2004
+++ 25-akpm/drivers/md/md.c	Wed Mar 10 15:46:59 2004
@@ -1447,7 +1447,7 @@ abort:
 	return 1;
 }
 
-static int mdp_major = 0;
+int mdp_major = 0;
 
 static struct kobject *md_probe(dev_t dev, int *part, void *data)
 {
diff -puN init/do_mounts_md.c~md-array-assembly-major-fix init/do_mounts_md.c
--- 25/init/do_mounts_md.c~md-array-assembly-major-fix	Wed Mar 10 15:46:59 2004
+++ 25-akpm/init/do_mounts_md.c	Wed Mar 10 15:46:59 2004
@@ -24,6 +24,7 @@ static struct {
 
 static int md_setup_ents __initdata;
 
+extern int mdp_major;
 /*
  * Parse the command-line parameters given our kernel, but do not
  * actually try to invoke the MD device now; that is handled by
@@ -115,6 +116,8 @@ static int __init md_setup(char *str)
 	return 1;
 }
 
+#define MdpMinorShift 6
+
 static void __init md_setup_drive(void)
 {
 	int minor, i, ent, partitioned;
@@ -134,7 +137,11 @@ static void __init md_setup_drive(void)
 
 		sprintf(name, "/dev/md%s%d", partitioned?"_d":"", minor);
 		sprintf(devfs_name, "/dev/md/%s%d", partitioned?"d":"", minor);
-		create_dev(name, MKDEV(MD_MAJOR, minor), devfs_name);
+		if (partitioned)
+			dev = MKDEV(mdp_major, minor << MdpMinorShift);
+		else
+			dev = MKDEV(MD_MAJOR, minor);
+		create_dev(name, dev, devfs_name);
 		for (i = 0; i < MD_SB_DISKS && devname != 0; i++) {
 			char *p;
 			char comp_name[64];

_