diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-14 14:13:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-05-14 14:13:44 -0400 |
commit | fc99824c427ed998e3c5e376bd9c640fde1c407c (patch) | |
tree | ae8167c0ac824d76cd63f443c631d8a101d18666 | |
parent | e90a4e475a8b34adbefe189c9d0932fa0b7b750f (diff) | |
parent | 0a3ad00ca09632c6d0675f606276e92bdf1b306c (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.c | 9 | ||||
-rw-r--r-- | drivers/base/class.c | 1 | ||||
-rw-r--r-- | include/linux/device.h | 1 | ||||
-rw-r--r-- | include/linux/genhd.h | 4 | ||||
-rw-r--r-- | init/do_mounts.c | 27 |
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) | |||
653 | EXPORT_SYMBOL_GPL(genhd_media_change_notify); | 653 | EXPORT_SYMBOL_GPL(genhd_media_change_notify); |
654 | #endif /* 0 */ | 654 | #endif /* 0 */ |
655 | 655 | ||
656 | dev_t blk_lookup_devt(const char *name) | 656 | dev_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 | |||
673 | EXPORT_SYMBOL(blk_lookup_devt); | 676 | EXPORT_SYMBOL(blk_lookup_devt); |
674 | 677 | ||
675 | struct gendisk *alloc_disk(int minors) | 678 | struct 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 | ||
528 | extern dev_t blk_lookup_devt(const char *name); | 528 | extern dev_t blk_lookup_devt(const char *name, int part); |
529 | extern char *disk_name (struct gendisk *hd, int part, char *buf); | 529 | extern char *disk_name (struct gendisk *hd, int part, char *buf); |
530 | 530 | ||
531 | extern int rescan_partitions(struct gendisk *disk, struct block_device *bdev); | 531 | extern 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 | ||
554 | static inline void printk_all_partitions(void) { } | 554 | static inline void printk_all_partitions(void) { } |
555 | 555 | ||
556 | static inline dev_t blk_lookup_devt(const char *name) | 556 | static 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 | ||