Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id ; Mon, 21 Oct 2002 06:56:42 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id ; Mon, 21 Oct 2002 06:56:42 -0400 Received: from mail.ocs.com.au ([203.34.97.2]:17426 "HELO mail.ocs.com.au") by vger.kernel.org with SMTP id ; Mon, 21 Oct 2002 06:56:40 -0400 X-Mailer: exmh version 2.4 06/23/2000 with nmh-1.0.4 From: Keith Owens To: linux-kernel@vger.kernel.org Cc: rgooch@atnf.csiro.au, viro@math.psu.edu Subject: 2.4.19 breaks devfs mapping for root= Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Mon, 21 Oct 2002 21:02:29 +1000 Message-ID: <565.1035198149@ocs3.intra.ocs.com.au> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2036 Lines: 54 Resend #2 - no response to previous mails. A change from 2.4.18 to 2.4.19 has broken the way that devfs maps root=. 2.4.18 init/main.c::mount_root() has devfs_make_root (root_device_name); handle = devfs_find_handle (NULL, ROOT_DEVICE_NAME, MAJOR (ROOT_DEV), MINOR (ROOT_DEV), DEVFS_SPECIAL_BLK, 1); where ROOT_DEVICE_NAME maps to the value of root= for non-initrd. This allowed devfs to remap an entry such as sda3 to whatever driver was implementing sda3, even if that driver used a different major number. The correct major was returned in handle. 2.4.19 init/do_mounts.c::mount_root() has devfs_make_root(root_device_name); create_dev("/dev/root", ROOT_DEV, root_device_name); create_dev() has handle = devfs_find_handle(NULL, dev ? NULL : devfs_name, MAJOR(dev), MINOR(dev), DEVFS_SPECIAL_BLK, 1); The difference in 2.4.19 is that if dev is already set from root_dev_names[] then devfs does NOT get the value of root=, forcing the use of major from root_dev_names[]. If a driver reimplements one of the standard device names and uses a different major or minor number then it no longer works in 2.4.19 because devfs is given incomplete information. Quick and dirty workaround --- 2.4.19/init/do_mounts.c +++ 2.4.19/init/do_mounts.c @@ -368,7 +368,7 @@ if (!do_devfs) return sys_mknod(name, S_IFBLK|0600, kdev_t_to_nr(dev)); - handle = devfs_find_handle(NULL, dev ? NULL : devfs_name, + handle = devfs_find_handle(NULL, devfs_name, MAJOR(dev), MINOR(dev), DEVFS_SPECIAL_BLK, 1); if (!handle) return -1; But that probably breaks initrd. What should that code be doing to cope with both initrd and still allow devfs to remap root=? - 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/