diff -urN --exclude-from=diff-exclude linux-2.4.26/Documentation/Configure.help linux-2.4.26-patch/Documentation/Configure.help
--- linux-2.4.26/Documentation/Configure.help	2004-05-19 21:34:35.000000000 +0100
+++ linux-2.4.26-patch/Documentation/Configure.help	2004-05-26 23:24:56.000000000 +0100
@@ -2039,6 +2039,18 @@
 
   If unsure, say Y.
 
+Verbose startup / shutdown messages
+CONFIG_MD_VERBMSG
+  If set, display verbose messages on kernel startup about RAID
+  device initialisation. This can slow down startup by a few seconds,
+  especially on framebuffer terminal types, or if a lot of RAID
+  devices are present, and also fills up space in the dmesg buffer
+  that could be useful elsewhere. However, it aids tracking down 
+  certain RAID problems. It adds about 1k to the kernel size.
+
+  If unsure, say Y. Even if un-set, error messages are still
+  reported
+
 Multipath I/O support
 CONFIG_MD_MULTIPATH
   Multipath-IO is the ability of certain devices to address the same
diff -urN --exclude-from=diff-exclude linux-2.4.26/drivers/md/Config.in linux-2.4.26-patch/drivers/md/Config.in
--- linux-2.4.26/drivers/md/Config.in	2001-09-14 22:22:18.000000000 +0100
+++ linux-2.4.26-patch/drivers/md/Config.in	2004-05-26 23:24:56.000000000 +0100
@@ -12,6 +12,8 @@
 dep_tristate '  RAID-1 (mirroring) mode' CONFIG_MD_RAID1 $CONFIG_BLK_DEV_MD
 dep_tristate '  RAID-4/RAID-5 mode' CONFIG_MD_RAID5 $CONFIG_BLK_DEV_MD
 dep_tristate '  Multipath I/O support' CONFIG_MD_MULTIPATH $CONFIG_BLK_DEV_MD
+dep_bool     '  Verbose startup messages' CONFIG_MD_VERBMSG $CONFIG_BLK_DEV_MD
+
 
 dep_tristate ' Logical volume manager (LVM) support' CONFIG_BLK_DEV_LVM $CONFIG_MD
 
diff -urN --exclude-from=diff-exclude linux-2.4.26/drivers/md/md.c linux-2.4.26-patch/drivers/md/md.c
--- linux-2.4.26/drivers/md/md.c	2003-08-25 12:44:42.000000000 +0100
+++ linux-2.4.26-patch/drivers/md/md.c	2004-05-26 23:24:56.000000000 +0100
@@ -12,6 +12,7 @@
    - kmod support by: Cyrus Durgin
    - RAID0 bugfixes: Mark Anthony Lisher <markal@iname.com>
    - Devfs support by Richard Gooch <rgooch@atnf.csiro.au>
+   - Verbose startup messages by Paul Evans <nerd@freeuk.com>
 
    - lots of fixes and improvements to the RAID1/RAID5 and generic
      RAID code (such as request based resynchronization):
@@ -524,7 +525,8 @@
 		printk(NO_SB,partition_name(dev));
 		return -EINVAL;
 	}
-	printk(KERN_INFO " [events: %08lx]\n", (unsigned long)rdev->sb->events_lo);
+	VERBMSG(printk(KERN_INFO " [events: %08lx]\n", 
+                        (unsigned long)rdev->sb->events_lo))
 	ret = 0;
 abort:
 	return ret;
@@ -633,7 +635,8 @@
 	md_list_add(&rdev->same_set, &mddev->disks);
 	rdev->mddev = mddev;
 	mddev->nb_dev++;
-	printk(KERN_INFO "md: bind<%s,%d>\n", partition_name(rdev->dev), mddev->nb_dev);
+	VERBMSG(printk(KERN_INFO "md: bind<%s,%d>\n", 
+                partition_name(rdev->dev), mddev->nb_dev))
 }
 
 static void unbind_rdev_from_array(mdk_rdev_t * rdev)
@@ -645,8 +648,8 @@
 	md_list_del(&rdev->same_set);
 	MD_INIT_LIST_HEAD(&rdev->same_set);
 	rdev->mddev->nb_dev--;
-	printk(KERN_INFO "md: unbind<%s,%d>\n", partition_name(rdev->dev),
-						 rdev->mddev->nb_dev);
+	VERBMSG(printk(KERN_INFO "md: unbind<%s,%d>\n", 
+                partition_name(rdev->dev), rdev->mddev->nb_dev))
 	rdev->mddev = NULL;
 }
 
@@ -949,7 +952,8 @@
 		goto skip;
 	}
 
-	printk(KERN_INFO "(write) %s's sb offset: %ld\n", partition_name(dev), sb_offset);
+	VERBMSG(printk(KERN_INFO "(write) %s's sb offset: %ld\n", 
+		partition_name(dev), sb_offset))
 
 	if (!sync_page_io(dev, sb_offset<<1, MD_SB_BYTES, rdev->sb_page, WRITE)) {
 		printk("md: write_disk_sb failed for device %s\n", partition_name(dev));
@@ -1009,6 +1013,7 @@
 	int err, count = 100;
 	struct md_list_head *tmp;
 	mdk_rdev_t *rdev;
+	char *part_name;
 
 	if (!mddev->sb_dirty) {
 		printk("hm, md_update_sb() called without ->sb_dirty == 1, from %p.\n", __builtin_return_address(0));
@@ -1038,29 +1043,30 @@
 	if (mddev->sb->not_persistent)
 		return 0;
 
-	printk(KERN_INFO "md: updating md%d RAID superblock on device\n",
-					mdidx(mddev));
+	VERBMSG(printk(KERN_INFO "md: updating md%d RAID superblock on device\n",
+					mdidx(mddev)))
 
 	err = 0;
 	ITERATE_RDEV(mddev,rdev,tmp) {
-		printk(KERN_INFO "md: ");
+		part_name = partition_name(rdev->dev);
 		if (rdev->faulty)
-			printk("(skipping faulty ");
+			printk(KERN_INFO "md: (skipping faulty %s)\n", part_name);
 		if (rdev->alias_device)
-			printk("(skipping alias ");
+			printk(KERN_INFO "md: (skipping alias %s)\n", part_name);
 		if (!rdev->faulty && disk_faulty(&rdev->sb->this_disk)) {
-			printk("(skipping new-faulty %s )\n",
-			       partition_name(rdev->dev));
+			printk(KERN_INFO "md: (skipping new-faulty %s)\n",
+			       part_name);
 			continue;
 		}
-		printk("%s ", partition_name(rdev->dev));
+		VERBMSG(printk(KERN_INFO "md: %s ", part_name))
+
 		if (!rdev->faulty && !rdev->alias_device) {
-			printk("[events: %08lx]",
-				(unsigned long)rdev->sb->events_lo);
+			VERBMSG(printk("[events: %08lx]",
+				(unsigned long)rdev->sb->events_lo))
 			err += write_disk_sb(rdev);
-		} else
-			printk(")\n");
+		}
 	}
+	VERBMSG(printk("\n"))
 	if (err) {
 		if (--count) {
 			printk(KERN_ERR "md: errors occurred during superblock update, repeating\n");
@@ -1246,9 +1252,9 @@
 					rdev->sb->events_hi--;
 		}
 
-		printk(KERN_INFO "md: %s's event counter: %08lx\n",
+		VERBMSG(printk(KERN_INFO "md: %s's event counter: %08lx\n",
 		       partition_name(rdev->dev),
-			(unsigned long)rdev->sb->events_lo);
+			(unsigned long)rdev->sb->events_lo))
 		if (!freshest) {
 			freshest = rdev;
 			continue;
@@ -1600,12 +1606,13 @@
 	}
 	md_maxreadahead[mdidx(mddev)] = readahead;
 
-	printk(KERN_INFO "md%d: max total readahead window set to %ldk\n",
-		mdidx(mddev), readahead*(PAGE_SIZE/1024));
+	VERBMSG(printk(KERN_INFO "md%d: max total readahead window set to %ldk\n",
+	        	mdidx(mddev), readahead*(PAGE_SIZE/1024));
+
+        	printk(KERN_INFO
+		        "md%d: %d data-disks, max readahead per data-disk: %ldk\n",
+			mdidx(mddev), data_disks, readahead/data_disks*(PAGE_SIZE/1024)))
 
-	printk(KERN_INFO
-		"md%d: %d data-disks, max readahead per data-disk: %ldk\n",
-			mdidx(mddev), data_disks, readahead/data_disks*(PAGE_SIZE/1024));
 	return 0;
 abort:
 	return 1;
@@ -1684,9 +1691,10 @@
 			return -EINVAL;
 		}
 	} else
-		if (chunk_size)
-			printk(KERN_INFO "md: RAID level %d does not need chunksize! Continuing anyway.\n",
-			       mddev->sb->level);
+		if (chunk_size) {
+			VERBMSG(printk(KERN_INFO "md: RAID level %d does not need chunksize! Continuing anyway.\n",
+			       mddev->sb->level))
+                }
 
 	if (pnum >= MAX_PERSONALITY) {
 		MD_BUG();
@@ -1857,7 +1865,7 @@
 			 * interrupted.
 			 */
 			if (!mddev->recovery_running && !resync_interrupted) {
-				printk(KERN_INFO "md: marking sb clean...\n");
+				VERBMSG(printk(KERN_INFO "md: marking sb clean...\n"))
 				mddev->sb->state |= 1 << MD_SB_CLEAN;
 			}
 			mddev->sb_dirty = 1;
@@ -1871,11 +1879,13 @@
 	 * Free resources if final stop
 	 */
 	if (!ro) {
-		printk(KERN_INFO "md: md%d stopped.\n", mdidx(mddev));
+		VERBMSG(printk(KERN_INFO "md: md%d stopped.\n", mdidx(mddev)))
 		free_mddev(mddev);
 
-	} else
-		printk(KERN_INFO "md: md%d switched to read-only mode.\n", mdidx(mddev));
+	} else {
+		VERBMSG(printk(KERN_INFO "md: md%d switched to read-only mode.\n", mdidx(mddev)))
+        }
+
 out:
 	return err;
 }
@@ -1898,8 +1908,6 @@
 
 static void autorun_array(mddev_t *mddev)
 {
-	mdk_rdev_t *rdev;
-	struct md_list_head *tmp;
 	int err;
 
 	if (mddev->disks.prev == &mddev->disks) {
@@ -1907,12 +1915,17 @@
 		return;
 	}
 
-	printk(KERN_INFO "md: running: ");
-
-	ITERATE_RDEV(mddev,rdev,tmp) {
-		printk("<%s>", partition_name(rdev->dev));
-	}
-	printk("\n");
+        VERBMSG({       /* remember; VERBMSG is just an #ifdef section */
+                mdk_rdev_t *rdev;
+                struct md_list_head *tmp;
+                
+        	printk(KERN_INFO "md: running: ");
+
+        	ITERATE_RDEV(mddev,rdev,tmp) {
+	        	printk("<%s>", partition_name(rdev->dev));
+        	}
+	        printk("\n");
+        })
 
 	err = do_md_run (mddev);
 	if (err) {
@@ -1946,12 +1959,13 @@
 	kdev_t md_kdev;
 
 
-	printk(KERN_INFO "md: autorun ...\n");
+	VERBMSG(printk(KERN_INFO "md: autorun ...\n"))
 	while (pending_raid_disks.next != &pending_raid_disks) {
 		rdev0 = md_list_entry(pending_raid_disks.next,
 					 mdk_rdev_t, pending);
 
-		printk(KERN_INFO "md: considering %s ...\n", partition_name(rdev0->dev));
+		VERBMSG(printk(KERN_INFO "md: considering %s ...\n", 
+                        partition_name(rdev0->dev)))
 		MD_INIT_LIST_HEAD(&candidates);
 		ITERATE_RDEV_PENDING(rdev,tmp) {
 			if (uuid_equal(rdev0, rdev)) {
@@ -1961,7 +1975,8 @@
 					       partition_name(rdev->dev), partition_name(rdev0->dev));
 					continue;
 				}
-				printk(KERN_INFO "md:  adding %s ...\n", partition_name(rdev->dev));
+				VERBMSG(printk(KERN_INFO "md:  adding %s ...\n", 
+                                        partition_name(rdev->dev)))
 				md_list_del(&rdev->pending);
 				md_list_add(&rdev->pending, &candidates);
 			}
@@ -1995,7 +2010,7 @@
 		}
 		autorun_array(mddev);
 	}
-	printk(KERN_INFO "md: ... autorun DONE.\n");
+	VERBMSG(printk(KERN_INFO "md: ... autorun DONE.\n"))
 }
 
 /*
@@ -3315,7 +3330,7 @@
 	}
 
 	pers[pnum] = p;
-	printk(KERN_INFO "md: %s personality registered as nr %d\n", p->name, pnum);
+	VERBMSG(printk(KERN_INFO "md: %s personality registered as nr %d\n", p->name, pnum))
 	return 0;
 }
 
@@ -3326,7 +3341,7 @@
 		return -EINVAL;
 	}
 
-	printk(KERN_INFO "md: %s personality unregistered\n", pers[pnum]->name);
+	VERBMSG(printk(KERN_INFO "md: %s personality unregistered\n", pers[pnum]->name))
 	pers[pnum] = NULL;
 	return 0;
 }
@@ -3690,6 +3705,7 @@
 		 */
 		md_mdelay(1000*1);
 	}
+
 	return NOTIFY_DONE;
 }
 
diff -urN --exclude-from=diff-exclude linux-2.4.26/drivers/md/raid0.c linux-2.4.26-patch/drivers/md/raid0.c
--- linux-2.4.26/drivers/md/raid0.c	2003-06-13 15:51:34.000000000 +0100
+++ linux-2.4.26-patch/drivers/md/raid0.c	2004-05-26 23:24:56.000000000 +0100
@@ -38,12 +38,12 @@
 	conf->nr_strip_zones = 0;
  
 	ITERATE_RDEV_ORDERED(mddev,rdev1,j1) {
-		printk("raid0: looking at %s\n", partition_name(rdev1->dev));
+                VERBMSG(printk("raid0: looking at %s\n", partition_name(rdev1->dev)))
 		c = 0;
 		ITERATE_RDEV_ORDERED(mddev,rdev2,j2) {
-			printk("raid0:   comparing %s(%ld) with %s(%ld)\n", partition_name(rdev1->dev), rdev1->size, partition_name(rdev2->dev), rdev2->size);
+			VERBMSG(printk("raid0:   comparing %s(%ld) with %s(%ld)\n", partition_name(rdev1->dev), rdev1->size, partition_name(rdev2->dev), rdev2->size))
 			if (rdev2 == rdev1) {
-				printk("raid0:   END\n");
+				VERBMSG(printk("raid0:   END\n"))
 				break;
 			}
 			if (rdev2->size == rdev1->size)
@@ -52,19 +52,19 @@
 				 * Not unique, dont count it as a new
 				 * group
 				 */
-				printk("raid0:   EQUAL\n");
+				VERBMSG(printk("raid0:   EQUAL\n"))
 				c = 1;
 				break;
 			}
-			printk("raid0:   NOT EQUAL\n");
+			VERBMSG(printk("raid0:   NOT EQUAL\n"))
 		}
 		if (!c) {
-			printk("raid0:   ==> UNIQUE\n");
+			VERBMSG(printk("raid0:   ==> UNIQUE\n"))
 			conf->nr_strip_zones++;
-			printk("raid0: %d zones\n", conf->nr_strip_zones);
+			VERBMSG(printk("raid0: %d zones\n", conf->nr_strip_zones))
 		}
 	}
-		printk("raid0: FINAL %d zones\n", conf->nr_strip_zones);
+		VERBMSG(printk("raid0: FINAL %d zones\n", conf->nr_strip_zones))
 
 	conf->strip_zone = vmalloc(sizeof(struct strip_zone)*
 				conf->nr_strip_zones);
@@ -80,30 +80,31 @@
 	{
 		struct strip_zone *zone = conf->strip_zone + i;
 
-		printk("raid0: zone %d\n", i);
+		VERBMSG(printk("raid0: zone %d\n", i))
 		zone->dev_offset = current_offset;
 		smallest = NULL;
 		c = 0;
 
 		ITERATE_RDEV_ORDERED(mddev,rdev,j) {
 
-			printk("raid0: checking %s ...", partition_name(rdev->dev));
+			VERBMSG(printk("raid0: checking %s ...", partition_name(rdev->dev)))
 			if (rdev->size > current_offset)
 			{
-				printk(" contained as device %d\n", c);
+				VERBMSG(printk(" contained as device %d\n", c))
 				zone->dev[c] = rdev;
 				c++;
 				if (!smallest || (rdev->size <smallest->size)) {
 					smallest = rdev;
-					printk("  (%ld) is smallest!.\n", rdev->size);
+					VERBMSG(printk("  (%ld) is smallest!.\n", rdev->size))
 				}
-			} else
-				printk(" nope.\n");
+			} else {
+				VERBMSG(printk(" nope.\n"))
+                        }
 		}
 
 		zone->nb_dev = c;
 		zone->size = (smallest->size - current_offset) * c;
-		printk("raid0: zone->nb_dev: %d, size: %ld\n",zone->nb_dev,zone->size);
+		VERBMSG(printk("raid0: zone->nb_dev: %d, size: %ld\n",zone->nb_dev,zone->size))
 
 		if (!conf->smallest || (zone->size < conf->smallest->size))
 			conf->smallest = zone;
@@ -112,9 +113,9 @@
 		curr_zone_offset += zone->size;
 
 		current_offset = smallest->size;
-		printk("raid0: current zone offset: %ld\n", current_offset);
+		VERBMSG(printk("raid0: current zone offset: %ld\n", current_offset))
 	}
-	printk("raid0: done.\n");
+	VERBMSG(printk("raid0: done.\n"))
 	return 0;
 }
 
@@ -138,15 +139,15 @@
 	if (create_strip_zones (mddev)) 
 		goto out_free_conf;
 
-	printk("raid0 : md_size is %d blocks.\n", md_size[mdidx(mddev)]);
-	printk("raid0 : conf->smallest->size is %ld blocks.\n", conf->smallest->size);
+	VERBMSG(printk("raid0: md_size is %d blocks.\n", md_size[mdidx(mddev)]);
+	          printk("raid0: conf->smallest->size is %ld blocks.\n", conf->smallest->size))
 	nb_zone = md_size[mdidx(mddev)]/conf->smallest->size +
 			(md_size[mdidx(mddev)] % conf->smallest->size ? 1 : 0);
-	printk("raid0 : nb_zone is %ld.\n", nb_zone);
+	VERBMSG(printk("raid0: nb_zone is %ld.\n", nb_zone))
 	conf->nr_zones = nb_zone;
 
-	printk("raid0 : Allocating %ld bytes for hash.\n",
-				nb_zone*sizeof(struct raid0_hash));
+	VERBMSG(printk("raid0: Allocating %ld bytes for hash.\n",
+				nb_zone*sizeof(struct raid0_hash)))
 
 	conf->hash_table = vmalloc (sizeof (struct raid0_hash)*nb_zone);
 	if (!conf->hash_table)
diff -urN --exclude-from=diff-exclude linux-2.4.26/drivers/md/raid1.c linux-2.4.26-patch/drivers/md/raid1.c
--- linux-2.4.26/drivers/md/raid1.c	2004-05-19 21:34:38.000000000 +0100
+++ linux-2.4.26-patch/drivers/md/raid1.c	2004-05-26 23:24:56.000000000 +0100
@@ -1627,8 +1627,9 @@
 					disk_idx);
 				continue;
 			}
-			printk(OPERATIONAL, partition_name(rdev->dev),
- 					disk_idx);
+			VERBMSG(printk(OPERATIONAL, 
+                                        partition_name(rdev->dev),
+ 					disk_idx))
 			disk->number = descriptor->number;
 			disk->raid_disk = disk_idx;
 			disk->dev = rdev->dev;
@@ -1643,7 +1644,7 @@
 		/*
 		 * Must be a spare disk ..
 		 */
-			printk(SPARE, partition_name(rdev->dev));
+			VERBMSG(printk(SPARE, partition_name(rdev->dev)))
 			disk->number = descriptor->number;
 			disk->raid_disk = disk_idx;
 			disk->dev = rdev->dev;
@@ -1766,7 +1767,8 @@
 		md_recover_arrays();
 
 
-	printk(ARRAY_IS_ACTIVE, mdidx(mddev), sb->active_disks, sb->raid_disks);
+	VERBMSG(printk(ARRAY_IS_ACTIVE, mdidx(mddev), 
+			sb->active_disks, sb->raid_disks))
 	/*
 	 * Ok, everything is just fine now
 	 */
diff -urN --exclude-from=diff-exclude linux-2.4.26/drivers/md/raid5.c linux-2.4.26-patch/drivers/md/raid5.c
--- linux-2.4.26/drivers/md/raid5.c	2003-08-25 12:44:42.000000000 +0100
+++ linux-2.4.26-patch/drivers/md/raid5.c	2004-05-26 23:24:56.000000000 +0100
@@ -1448,7 +1448,8 @@
 				printk(KERN_ERR "raid5: disabled device %s (device %d already operational)\n", partition_name(rdev->dev), raid_disk);
 				continue;
 			}
-			printk(KERN_INFO "raid5: device %s operational as raid disk %d\n", partition_name(rdev->dev), raid_disk);
+			VERBMSG(printk(KERN_INFO "raid5: device %s operational as raid disk %d\n", 
+                                partition_name(rdev->dev), raid_disk))
 	
 			disk->number = desc->number;
 			disk->raid_disk = raid_disk;
@@ -1461,7 +1462,8 @@
 			/*
 			 * Must be a spare disk ..
 			 */
-			printk(KERN_INFO "raid5: spare disk %s\n", partition_name(rdev->dev));
+			VERBMSG(printk(KERN_INFO "raid5: spare disk %s\n", 
+                                partition_name(rdev->dev)))
 			disk->number = desc->number;
 			disk->raid_disk = raid_disk;
 			disk->dev = rdev->dev;
diff -urN --exclude-from=diff-exclude linux-2.4.26/include/linux/raid/md.h linux-2.4.26-patch/include/linux/raid/md.h
--- linux-2.4.26/include/linux/raid/md.h	2004-02-20 13:07:46.000000000 +0000
+++ linux-2.4.26-patch/include/linux/raid/md.h	2004-05-26 23:24:56.000000000 +0100
@@ -18,6 +18,8 @@
 #ifndef _MD_H
 #define _MD_H
 
+#include <linux/config.h>
+
 #include <linux/mm.h>
 #include <linux/fs.h>
 #include <linux/blkdev.h>
@@ -88,5 +90,15 @@
 
 #define MD_BUG(x...) { printk("md: bug in file %s, line %d\n", __FILE__, __LINE__); md_print_devices(); }
 
+/* Verbose startup message option
+ *  Added by Paul Evans, <nerd@freeuk.com>
+ */
+
+#ifdef CONFIG_MD_VERBMSG
+# define VERBMSG(c) c;
+#else
+# define VERBMSG(c)
+#endif
+
 #endif 
 
