[PATCH] Eliminate root_dev_names - part 2 of 2

Jeff Dike (jdike@karaya.com)
Thu, 15 Aug 2002 14:39:05 -0500


This patch removes root_dev_names.

get_gendisk_by_name is added to genhd.c.

root_dev_setup now only initializes root_device_name.

name_to_kdev_t is called from prepare_namespace in order to initialize
ROOT_DEV.

With this patch applied, a number of devices will fail to boot. For the
most part, they need to register gendisks. My plan is to launder patches
through the maintainers.

nfs - not a block device, but registering a dummy gendisk probably won't hurt

loop - I didn't know you could boot from a loop device, needs a dummy gendisk

ram - needs a dummy gendisk

fd, mcd, cdu535, aztcd, gscd, sbpcd, pcd, pf, jsfd, mtdblock, scd, cm206cd - need gendisks

sonycd - synonym for cdu535, needs an extra gendisk

apblock, ddv - can't find these anywhere in the pool, I think they need to
be garbage-collected out of existence

Jeff

diff -Naur um-31-2/drivers/block/genhd.c um/drivers/block/genhd.c
--- um-31-2/drivers/block/genhd.c Thu Aug 15 11:33:59 2002
+++ um/drivers/block/genhd.c Thu Aug 15 11:24:00 2002
@@ -124,6 +124,29 @@

EXPORT_SYMBOL(get_gendisk_by_kdev_t);

+/**
+ * get_gendisk_by_name - get partitioning information for a given device
+ * @name: device name to get partitioning information for
+ *
+ * This function gets the structure containing partitioning
+ * information for the given device name @name.
+ */
+struct gendisk *
+get_gendisk_by_name(char *name)
+{
+ struct gendisk *gp = NULL;
+
+ read_lock(&gendisk_lock);
+ for (gp = gendisk_head; gp; gp = gp->next) {
+ if (strncmp(name, gp->major_name, strlen(gp->major_name)))
+ continue;
+ read_unlock(&gendisk_lock);
+ return gp;
+ }
+ read_unlock(&gendisk_lock);
+ return NULL;
+}
+
#ifdef CONFIG_PROC_FS
/* iterator */
static void *part_start(struct seq_file *part, loff_t *pos)
diff -Naur um-31-2/include/linux/genhd.h um/include/linux/genhd.h
--- um-31-2/include/linux/genhd.h Thu Aug 15 13:06:49 2002
+++ um/include/linux/genhd.h Thu Aug 15 11:24:59 2002
@@ -90,6 +90,7 @@
extern void add_gendisk(struct gendisk *gp);
extern void del_gendisk(struct gendisk *gp);
extern struct gendisk *get_gendisk_by_kdev_t(kdev_t dev);
+extern struct gendisk *get_gendisk_by_name(char *name);
static inline unsigned long get_start_sect(struct block_device *bdev)
{
return bdev->bd_offset;
diff -Naur um-31-2/init/do_mounts.c um/init/do_mounts.c
--- um-31-2/init/do_mounts.c Thu Aug 15 11:37:29 2002
+++ um/init/do_mounts.c Thu Aug 15 13:01:20 2002
@@ -6,6 +6,7 @@
#include <linux/devfs_fs_kernel.h>
#include <linux/unistd.h>
#include <linux/ctype.h>
+#include <linux/genhd.h>
#include <linux/blk.h>
#include <linux/fd.h>
#include <linux/tty.h>
@@ -86,153 +87,17 @@
__setup("ro", readonly);
__setup("rw", readwrite);

-static struct dev_name_struct {
- const char *name;
- const int num;
-} root_dev_names[] __initdata = {
- { "nfs", 0x00ff },
- { "hda", 0x0300 },
- { "hdb", 0x0340 },
- { "loop", 0x0700 },
- { "hdc", 0x1600 },
- { "hdd", 0x1640 },
- { "hde", 0x2100 },
- { "hdf", 0x2140 },
- { "hdg", 0x2200 },
- { "hdh", 0x2240 },
- { "hdi", 0x3800 },
- { "hdj", 0x3840 },
- { "hdk", 0x3900 },
- { "hdl", 0x3940 },
- { "hdm", 0x5800 },
- { "hdn", 0x5840 },
- { "hdo", 0x5900 },
- { "hdp", 0x5940 },
- { "hdq", 0x5A00 },
- { "hdr", 0x5A40 },
- { "hds", 0x5B00 },
- { "hdt", 0x5B40 },
- { "sda", 0x0800 },
- { "sdb", 0x0810 },
- { "sdc", 0x0820 },
- { "sdd", 0x0830 },
- { "sde", 0x0840 },
- { "sdf", 0x0850 },
- { "sdg", 0x0860 },
- { "sdh", 0x0870 },
- { "sdi", 0x0880 },
- { "sdj", 0x0890 },
- { "sdk", 0x08a0 },
- { "sdl", 0x08b0 },
- { "sdm", 0x08c0 },
- { "sdn", 0x08d0 },
- { "sdo", 0x08e0 },
- { "sdp", 0x08f0 },
- { "ada", 0x1c00 },
- { "adb", 0x1c10 },
- { "adc", 0x1c20 },
- { "add", 0x1c30 },
- { "ade", 0x1c40 },
- { "fd", 0x0200 },
- { "md", 0x0900 },
- { "xda", 0x0d00 },
- { "xdb", 0x0d40 },
- { "ram", 0x0100 },
- { "scd", 0x0b00 },
- { "mcd", 0x1700 },
- { "cdu535", 0x1800 },
- { "sonycd", 0x1800 },
- { "aztcd", 0x1d00 },
- { "cm206cd", 0x2000 },
- { "gscd", 0x1000 },
- { "sbpcd", 0x1900 },
- { "eda", 0x2400 },
- { "edb", 0x2440 },
- { "pda", 0x2d00 },
- { "pdb", 0x2d10 },
- { "pdc", 0x2d20 },
- { "pdd", 0x2d30 },
- { "pcd", 0x2e00 },
- { "pf", 0x2f00 },
- { "apblock", APBLOCK_MAJOR << 8},
- { "ddv", DDV_MAJOR << 8},
- { "jsfd", JSFD_MAJOR << 8},
-#if defined(CONFIG_ARCH_S390)
- { "dasda", (DASD_MAJOR << MINORBITS) },
- { "dasdb", (DASD_MAJOR << MINORBITS) + (1 << 2) },
- { "dasdc", (DASD_MAJOR << MINORBITS) + (2 << 2) },
- { "dasdd", (DASD_MAJOR << MINORBITS) + (3 << 2) },
- { "dasde", (DASD_MAJOR << MINORBITS) + (4 << 2) },
- { "dasdf", (DASD_MAJOR << MINORBITS) + (5 << 2) },
- { "dasdg", (DASD_MAJOR << MINORBITS) + (6 << 2) },
- { "dasdh", (DASD_MAJOR << MINORBITS) + (7 << 2) },
-#endif
-#if defined(CONFIG_BLK_CPQ_DA) || defined(CONFIG_BLK_CPQ_DA_MODULE)
- { "ida/c0d0p",0x4800 },
- { "ida/c0d1p",0x4810 },
- { "ida/c0d2p",0x4820 },
- { "ida/c0d3p",0x4830 },
- { "ida/c0d4p",0x4840 },
- { "ida/c0d5p",0x4850 },
- { "ida/c0d6p",0x4860 },
- { "ida/c0d7p",0x4870 },
- { "ida/c0d8p",0x4880 },
- { "ida/c0d9p",0x4890 },
- { "ida/c0d10p",0x48A0 },
- { "ida/c0d11p",0x48B0 },
- { "ida/c0d12p",0x48C0 },
- { "ida/c0d13p",0x48D0 },
- { "ida/c0d14p",0x48E0 },
- { "ida/c0d15p",0x48F0 },
-#endif
-#if defined(CONFIG_BLK_CPQ_CISS_DA) || defined(CONFIG_BLK_CPQ_CISS_DA_MODULE)
- { "cciss/c0d0p",0x6800 },
- { "cciss/c0d1p",0x6810 },
- { "cciss/c0d2p",0x6820 },
- { "cciss/c0d3p",0x6830 },
- { "cciss/c0d4p",0x6840 },
- { "cciss/c0d5p",0x6850 },
- { "cciss/c0d6p",0x6860 },
- { "cciss/c0d7p",0x6870 },
- { "cciss/c0d8p",0x6880 },
- { "cciss/c0d9p",0x6890 },
- { "cciss/c0d10p",0x68A0 },
- { "cciss/c0d11p",0x68B0 },
- { "cciss/c0d12p",0x68C0 },
- { "cciss/c0d13p",0x68D0 },
- { "cciss/c0d14p",0x68E0 },
- { "cciss/c0d15p",0x68F0 },
-#endif
- { "nftla", 0x5d00 },
- { "nftlb", 0x5d10 },
- { "nftlc", 0x5d20 },
- { "nftld", 0x5d30 },
- { "ftla", 0x2c00 },
- { "ftlb", 0x2c08 },
- { "ftlc", 0x2c10 },
- { "ftld", 0x2c18 },
- { "mtdblock", 0x1f00 },
- { NULL, 0 }
-};
-
-kdev_t __init name_to_kdev_t(char *line)
+kdev_t name_to_kdev_t(char *dev)
{
+ struct gendisk *gp = get_gendisk_by_name(dev);
int base = 0;

- if (strncmp(line,"/dev/",5) == 0) {
- struct dev_name_struct *dev = root_dev_names;
- line += 5;
- do {
- int len = strlen(dev->name);
- if (strncmp(line,dev->name,len) == 0) {
- line += len;
- base = dev->num;
- break;
- }
- dev++;
- } while (dev->name);
- }
- return to_kdev_t(base + simple_strtoul(line,NULL,base?10:16));
+ if(gp != NULL){
+ base = MKDEV(gp->major, gp->first_minor);
+ dev += strlen(gp->major_name);
+ }
+
+ return to_kdev_t(base + simple_strtoul(dev, NULL, base ? 10 : 16));
}

static int __init root_dev_setup(char *line)
@@ -240,7 +105,6 @@
int i;
char ch;

- ROOT_DEV = kdev_t_to_nr(name_to_kdev_t(line));
memset (root_device_name, 0, sizeof root_device_name);
if (strncmp (line, "/dev/", 5) == 0) line += 5;
for (i = 0; i < sizeof root_device_name - 1; ++i)
@@ -814,7 +678,10 @@
*/
void prepare_namespace(void)
{
- int is_floppy = MAJOR(ROOT_DEV) == FLOPPY_MAJOR;
+ int is_floppy;
+
+ ROOT_DEV = kdev_t_to_nr(name_to_kdev_t(root_device_name));
+ is_floppy = (MAJOR(ROOT_DEV) == FLOPPY_MAJOR);
#ifdef CONFIG_BLK_DEV_INITRD
if (!initrd_start)
mount_initrd = 0;

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