From: viro@parcelfarce.linux.theplanet.co.uk

The problems happened if you had devfs enabled; in that case late-boot code
does temporary mount of devfs over rootfs /dev, which made /dev/initrd
inaccessible.  For setups without devfs that didn't happen.

Fix is trivial - put the file in question outside of /dev; IOW, we simply
replace "/dev/initrd" with "/initrd.image" in init/*.  It works here;
please check if it fixes all initrd problems on your boxen.



 init/do_mounts_initrd.c |    6 +++---
 init/do_mounts_rd.c     |    2 +-
 init/initramfs.c        |    2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff -puN init/do_mounts_initrd.c~devfs-initrd-fix init/do_mounts_initrd.c
--- 25/init/do_mounts_initrd.c~devfs-initrd-fix	2003-10-18 16:26:48.000000000 -0700
+++ 25-akpm/init/do_mounts_initrd.c	2003-10-18 16:26:48.000000000 -0700
@@ -109,12 +109,12 @@ int __init initrd_load(void)
 		 * in that case the ram disk is just set up here, and gets
 		 * mounted in the normal path.
 		 */
-		if (rd_load_image("/dev/initrd") && ROOT_DEV != Root_RAM0) {
-			sys_unlink("/dev/initrd");
+		if (rd_load_image("/initrd.image") && ROOT_DEV != Root_RAM0) {
+			sys_unlink("/initrd.image");
 			handle_initrd();
 			return 1;
 		}
 	}
-	sys_unlink("/dev/initrd");
+	sys_unlink("/initrd.image");
 	return 0;
 }
diff -puN init/do_mounts_rd.c~devfs-initrd-fix init/do_mounts_rd.c
--- 25/init/do_mounts_rd.c~devfs-initrd-fix	2003-10-18 16:26:48.000000000 -0700
+++ 25-akpm/init/do_mounts_rd.c	2003-10-18 16:26:48.000000000 -0700
@@ -185,7 +185,7 @@ int __init rd_load_image(char *from)
 	else
 		devblocks >>= 1;
 
-	if (strcmp(from, "/dev/initrd") == 0)
+	if (strcmp(from, "/initrd.image") == 0)
 		devblocks = nblocks;
 
 	if (devblocks == 0) {
diff -puN init/initramfs.c~devfs-initrd-fix init/initramfs.c
--- 25/init/initramfs.c~devfs-initrd-fix	2003-10-18 16:26:48.000000000 -0700
+++ 25-akpm/init/initramfs.c	2003-10-18 16:26:48.000000000 -0700
@@ -497,7 +497,7 @@ void __init populate_rootfs(void)
 			return;
 		}
 		printk("it isn't (%s); looks like an initrd\n", err);
-		fd = sys_open("/dev/initrd", O_WRONLY|O_CREAT, 700);
+		fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 700);
 		if (fd >= 0) {
 			sys_write(fd, (char *)initrd_start,
 					initrd_end - initrd_start);

_