option "root=" doesn't work with devfs device names

Per Lidén (per@fukt.bth.se)
Wed, 16 Oct 2002 21:42:00 +0200 (CEST)


Hi,

The "root=" kernel option doesn't work when used together with devfs
device names, e.g. root=/dev/discs/disc0/part1.

in do_mounts.c:

static int __init root_dev_setup(char *line)
{
int i;
char ch;

ROOT_DEV = name_to_kdev_t(line);
^^^^^^^^^^^^^^^^^^^^

The call to name_to_kdev_t() should return 0 if the device name starts
with "/dev/" but was not found in root_dev_names[] (which is the case if
e.g. root=/dev/discs/disc0/part1 is used as a kernel option). But instead
of returning 0, name_to_kdev_t() will treat "discs/disc0/part1" as a
hex-number, which results in "discs/disc0/part1" being passed to
simple_strtoul(). The returned value from name_to_kdev_t() will thus be
garbage, and later calls to create_dev() will fail to create the
appropriate devfs entries because ROOT_DEV is non-zero.

The end result is a kernel panic "VFS: Unable to mount root fs on ...".

This has been broken since 2.4.19.

The patch below fixes this problem. It would be nice if this problem was
solved before 2.4.20 was released.

/Per

--- linux-2.4.20-pre10/init/do_mounts.c.old 2002-10-09 23:04:59.000000000 +0200
+++ linux-2.4.20-pre10/init/do_mounts.c 2002-10-09 23:50:46.000000000
+0200
@@ -258,6 +258,8 @@
}
dev++;
} while (dev->name);
+ if (!(dev->name))
+ return to_kdev_t(0);
}
return to_kdev_t(base + simple_strtoul(line,NULL,base?10:16));
}

-
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/