2.4.19 breaks devfs mapping for root=
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
init/do_mounts.c +1 -1
@@ -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=?