aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2008-05-14 14:13:44 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2008-05-14 14:13:44 -0400
commitfc99824c427ed998e3c5e376bd9c640fde1c407c (patch)
treeae8167c0ac824d76cd63f443c631d8a101d18666
parente90a4e475a8b34adbefe189c9d0932fa0b7b750f (diff)
parent0a3ad00ca09632c6d0675f606276e92bdf1b306c (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6: Driver core: struct class remove children list block: do_mounts - accept root=<non-existant partition>
-rw-r--r--block/genhd.c9
-rw-r--r--drivers/base/class.c1
-rw-r--r--include/linux/device.h1
-rw-r--r--include/linux/genhd.h4
-rw-r--r--init/do_mounts.c27
5 files changed, 34 insertions, 8 deletions
diff --git a/block/genhd.c b/block/genhd.c
index fda9c7a63c29..129ad939f9dd 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -653,7 +653,7 @@ void genhd_media_change_notify(struct gendisk *disk)
653EXPORT_SYMBOL_GPL(genhd_media_change_notify); 653EXPORT_SYMBOL_GPL(genhd_media_change_notify);
654#endif /* 0 */ 654#endif /* 0 */
655 655
656dev_t blk_lookup_devt(const char *name) 656dev_t blk_lookup_devt(const char *name, int part)
657{ 657{
658 struct device *dev; 658 struct device *dev;
659 dev_t devt = MKDEV(0, 0); 659 dev_t devt = MKDEV(0, 0);
@@ -661,7 +661,11 @@ dev_t blk_lookup_devt(const char *name)
661 mutex_lock(&block_class_lock); 661 mutex_lock(&block_class_lock);
662 list_for_each_entry(dev, &block_class.devices, node) { 662 list_for_each_entry(dev, &block_class.devices, node) {
663 if (strcmp(dev->bus_id, name) == 0) { 663 if (strcmp(dev->bus_id, name) == 0) {
664 devt = dev->devt; 664 struct gendisk *disk = dev_to_disk(dev);
665
666 if (part < disk->minors)
667 devt = MKDEV(MAJOR(dev->devt),
668 MINOR(dev->devt) + part);
665 break; 669 break;
666 } 670 }
667 } 671 }
@@ -669,7 +673,6 @@ dev_t blk_lookup_devt(const char *name)
669 673
670 return devt; 674 return devt;
671} 675}
672
673EXPORT_SYMBOL(blk_lookup_devt); 676EXPORT_SYMBOL(blk_lookup_devt);
674 677
675struct gendisk *alloc_disk(int minors) 678struct gendisk *alloc_disk(int minors)
diff --git a/drivers/base/class.c b/drivers/base/class.c
index 0ef00e8d4153..e085af0ff94f 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -140,7 +140,6 @@ int class_register(struct class *cls)
140 140
141 pr_debug("device class '%s': registering\n", cls->name); 141 pr_debug("device class '%s': registering\n", cls->name);
142 142
143 INIT_LIST_HEAD(&cls->children);
144 INIT_LIST_HEAD(&cls->devices); 143 INIT_LIST_HEAD(&cls->devices);
145 INIT_LIST_HEAD(&cls->interfaces); 144 INIT_LIST_HEAD(&cls->interfaces);
146 kset_init(&cls->class_dirs); 145 kset_init(&cls->class_dirs);
diff --git a/include/linux/device.h b/include/linux/device.h
index 8c23e3dfe3ac..15e9fa3ad3af 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -183,7 +183,6 @@ struct class {
183 struct module *owner; 183 struct module *owner;
184 184
185 struct kset subsys; 185 struct kset subsys;
186 struct list_head children;
187 struct list_head devices; 186 struct list_head devices;
188 struct list_head interfaces; 187 struct list_head interfaces;
189 struct kset class_dirs; 188 struct kset class_dirs;
diff --git a/include/linux/genhd.h b/include/linux/genhd.h
index e9874e7fcdf9..ae7aec3cabee 100644
--- a/include/linux/genhd.h
+++ b/include/linux/genhd.h
@@ -525,7 +525,7 @@ struct unixware_disklabel {
525#define ADDPART_FLAG_RAID 1 525#define ADDPART_FLAG_RAID 1
526#define ADDPART_FLAG_WHOLEDISK 2 526#define ADDPART_FLAG_WHOLEDISK 2
527 527
528extern dev_t blk_lookup_devt(const char *name); 528extern dev_t blk_lookup_devt(const char *name, int part);
529extern char *disk_name (struct gendisk *hd, int part, char *buf); 529extern char *disk_name (struct gendisk *hd, int part, char *buf);
530 530
531extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); 531extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev);
@@ -553,7 +553,7 @@ static inline struct block_device *bdget_disk(struct gendisk *disk, int index)
553 553
554static inline void printk_all_partitions(void) { } 554static inline void printk_all_partitions(void) { }
555 555
556static inline dev_t blk_lookup_devt(const char *name) 556static inline dev_t blk_lookup_devt(const char *name, int part)
557{ 557{
558 dev_t devt = MKDEV(0, 0); 558 dev_t devt = MKDEV(0, 0);
559 return devt; 559 return devt;
diff --git a/init/do_mounts.c b/init/do_mounts.c
index 3885e70e7759..660c1e50c91b 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -76,6 +76,7 @@ dev_t name_to_dev_t(char *name)
76 char s[32]; 76 char s[32];
77 char *p; 77 char *p;
78 dev_t res = 0; 78 dev_t res = 0;
79 int part;
79 80
80 if (strncmp(name, "/dev/", 5) != 0) { 81 if (strncmp(name, "/dev/", 5) != 0) {
81 unsigned maj, min; 82 unsigned maj, min;
@@ -106,7 +107,31 @@ dev_t name_to_dev_t(char *name)
106 for (p = s; *p; p++) 107 for (p = s; *p; p++)
107 if (*p == '/') 108 if (*p == '/')
108 *p = '!'; 109 *p = '!';
109 res = blk_lookup_devt(s); 110 res = blk_lookup_devt(s, 0);
111 if (res)
112 goto done;
113
114 /*
115 * try non-existant, but valid partition, which may only exist
116 * after revalidating the disk, like partitioned md devices
117 */
118 while (p > s && isdigit(p[-1]))
119 p--;
120 if (p == s || !*p || *p == '0')
121 goto fail;
122
123 /* try disk name without <part number> */
124 part = simple_strtoul(p, NULL, 10);
125 *p = '\0';
126 res = blk_lookup_devt(s, part);
127 if (res)
128 goto done;
129
130 /* try disk name without p<part number> */
131 if (p < s + 2 || !isdigit(p[-2]) || p[-1] != 'p')
132 goto fail;
133 p[-1] = '\0';
134 res = blk_lookup_devt(s, part);
110 if (res) 135 if (res)
111 goto done; 136 goto done;
112 137