kinit problem with cciss root device

From: Bjorn Helgaas
Date: Tue Jun 06 2006 - 18:40:08 EST


kinit converts "root=/dev/cciss/c0d0p1" to "cciss.c0d0", which
doesn't exist under /sys/block because register_disk() converts
"cciss/c0d0" to "cciss!c0d0" (note "!", not ".").

I don't know whether it's the *right* fix, but the patch below
makes things work. It still doesn't make kinit exactly match
the register_disk() behavior because register_disk() only changes
the first "/" in the string.

This was a nuisance to debug because when it failed, the only
output I got was this:

...
Adding console on ttyS0 at I/O port 0x3f8 (options '115200')
Time: tsc clocksource has been installed.
Freeing unused kernel memory: 260k freed
argc == 4
Kernel panic - not syncing: Attempted to kill init!
argv[0]: "/ini

So you might consider something like the "drain output" hunk below,
which allowed all the useful messages to get out.


Index: work-mm8/usr/kinit/kinit.c
===================================================================
--- work-mm8.orig/usr/kinit/kinit.c 2006-06-05 19:04:46.000000000 -0600
+++ work-mm8/usr/kinit/kinit.c 2006-06-06 14:19:59.000000000 -0600
@@ -317,5 +317,10 @@
if (mnt_sysfs)
umount2("/sys", 0);

+ /*
+ * Allow time for messages to drain before kernel panics
+ * because init is exiting.
+ * */
+ sleep(10);
exit(ret);
}
Index: work-mm8/usr/kinit/name_to_dev.c
===================================================================
--- work-mm8.orig/usr/kinit/name_to_dev.c 2006-06-05 19:04:46.000000000 -0600
+++ work-mm8/usr/kinit/name_to_dev.c 2006-06-06 14:19:02.000000000 -0600
@@ -151,7 +151,7 @@

for (p = s; *p; p++)
if (*p == '/')
- *p = '.';
+ *p = '!';
res = try_name(s, 0);
if (res)
return res;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/