2002-08-15 18:32:46

by Jeff Dike

[permalink] [raw]
Subject: [PATCH] Eliminate root_dev_names - part 2 of 2

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;


2002-08-16 13:43:18

by David Woodhouse

[permalink] [raw]
Subject: Re: [PATCH] Eliminate root_dev_names - part 2 of 2


[email protected] said:
> nfs - not a block device, but registering a dummy gendisk probably
> won't hurt

That will be done in userspace anyway -- no need to worry about that in the
long term, I suspect.

I'd like to fix JFFS2 mounting too -- currently we _pretend_ to mount on a
block device, because that was just easiest. Then we check the major number
== MTD_BLOCK_MAJOR and use the minor as an index to find the actual MTD
device, and don't use the mtdblock driver at all.

In 2.5, we also allow mounting by MTD device number or name, but not as
a root filesystem because the actual text of the 'root=' argument is not
passed to the file system in that case.

T'would be nice if that could be fixed.

--
dwmw2