Re: 2.4.21 Floppy Fallback with NFS root ...

From: Herbert Poetzl (herbert@13thfloor.at)
Date: Thu Jun 19 2003 - 11:03:14 EST


on a deeper look at this issue, another astounding
(read confusing, erroneous) detail was revealed ...

consider a kernel boot cmdline like

  "root=/dev/vg/slash ro"

which could be used to boot from a LVM LV named slash
or, if you prefer a physical device (using devfs)

  "root=/dev/ide//host0/bus0/target0/lun0/part1 ro"

now what happens on boot is:

root_dev_setup() is called with "root=" and, in turn
calls name_to_kdev_t() which searches root_dev_names[]
for the given device names, which of course, can not
be found, because they are not listed, so ROOT_DEV
becomes (0:0)
 
if you have CONFIG_ROOT_NFS enabled, then mount_root()
will check if MAJOR(ROOT_DEV) == UNNAMED_MAJOR, which
will be true, although root=/dev/nfs (0:ff) wasn't
specified, leading directly to "Unable to mount root
fs via NFS, trying floppy." and the Floppy Fallback,
instead of booting from your specified root device.

  "root=/dev/hda1 ro"

will work as expected, because it will be found in
root_dev_names[] ...

I suggest to do one fix, and one improvement ...

and of course this _will_ break the current behaviour
you won't be able to use root=tux (or your favorite
pet name) to have root on nfs ...

what do you think?

best,
Herbert

------------------ FIX

diff -NurbP --minimal linux-2.4.21/init/do_mounts.c linux-2.4.21-ffb/init/do_mounts.c
--- linux-2.4.21/init/do_mounts.c Fri Jun 13 17:49:28 2003
+++ linux-2.4.21-ffb/init/do_mounts.c Thu Jun 19 17:41:35 2003
@@ -747,7 +747,8 @@
 static void __init mount_root(void)
 {
 #ifdef CONFIG_ROOT_NFS
- if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR) {
+ if (MAJOR(ROOT_DEV) == UNNAMED_MAJOR
+ && MINOR(ROOT_DEV) == 255) {
                 if (mount_nfs_root()) {
                         sys_chdir("/root");
                         ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev;

maybe a NFS_MAJOR, NFS_MINOR would be more descriptive here ...

------------------ SECURITY IMPROVEMENT ;)

diff -NurbP --minimal linux-2.4.21/fs/Config.in linux-2.4.21-ffb/fs/Config.in
--- linux-2.4.21/fs/Config.in Tue Dec 10 03:25:19 2002
+++ linux-2.4.21-ffb/fs/Config.in Thu Jun 19 17:42:35 2003
@@ -103,6 +103,7 @@
    dep_tristate 'NFS file system support' CONFIG_NFS_FS $CONFIG_INET
    dep_mbool ' Provide NFSv3 client support' CONFIG_NFS_V3 $CONFIG_NFS_FS
    dep_bool ' Root file system on NFS' CONFIG_ROOT_NFS $CONFIG_NFS_FS $CONFIG_IP_PNP
+ dep_bool ' Disable Floppy Fallback' CONFIG_NO_FLOPPY_FALLBACK $CONFIG_ROOT_NFS
 
    dep_tristate 'NFS server support' CONFIG_NFSD $CONFIG_INET
    dep_mbool ' Provide NFSv3 server support' CONFIG_NFSD_V3 $CONFIG_NFSD
diff -NurbP --minimal linux-2.4.21/init/do_mounts.c linux-2.4.21-ffb/init/do_mounts.c
--- linux-2.4.21/init/do_mounts.c Fri Jun 13 17:49:28 2003
+++ linux-2.4.21-ffb/init/do_mounts.c Thu Jun 19 17:41:35 2003
@@ -754,8 +754,10 @@
                         printk("VFS: Mounted root (nfs filesystem).\n");
                         return;
                 }
+# ifndef CONFIG_NO_FLOPPY_FALLBACK
                 printk(KERN_ERR "VFS: Unable to mount root fs via NFS, trying floppy.\n");
                 ROOT_DEV = MKDEV(FLOPPY_MAJOR, 0);
+# endif
         }
 #endif
         devfs_make_root(root_device_name);

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jun 23 2003 - 22:00:29 EST