driver core fixes against 2.6.26-rc2
Subsystems (3)
PATCH 1/1 driver core fixes against 2.6.26-rc2
Here are two patches against your 2.6.26-rc2-git tree.
They do:
- remove an unused list head in struct class now that struct class_device is gone.
- fix a bug at boot time with raid partitions. This is a regression from 2.6.24 that is now finally fixed. Many thanks to Kay for doing this work. It will be added to the 2.6.25-stable tree as well.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-2.6.git/
Both of these patches have been in the -next and -mm trees for a while.
The patch will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
------------
block/genhd.c | 9 ++++++--- drivers/base/class.c | 1 - include/linux/device.h | 1 - include/linux/genhd.h | 4 ++-- init/do_mounts.c | 27 ++++++++++++++++++++++++++- 5 files changed, 34 insertions(+), 8 deletions(-)
---------------
Dave Young (1):
Driver core: struct class remove children list
Kay Sievers (1):
block: do_mounts - accept root=<non-existant partition>
PATCH 1/2 block: do_mounts - accept root=<non-existant partition>
From: Kay Sievers <[email protected]>
Some devices, like md, may create partitions only at first access, so allow root= to be set to a valid non-existant partition of an existing disk. This applies only to non-initramfs root mounting.
This fixes a regression from 2.6.24 which did allow this to happen and broke some users machines :(
--- block/genhd.c | 9 ++++++--- include/linux/genhd.h | 4 ++-- init/do_mounts.c | 27 ++++++++++++++++++++++++++- 3 files changed, 34 insertions(+), 6 deletions(-)
block/genhd.c +6 -3
@@ -653,7 +653,7 @@ void genhd_media_change_notify(struct gendisk *disk)EXPORT_SYMBOL_GPL (genhd_media_change_notify);#endif /* 0 */ -dev_t blk_lookup_devt (const char *name) +dev_t blk_lookup_devt (const char *name,int part) {struct device *dev;dev_t devt =MKDEV (0 ,0 );
@@ -661,7 +661,11 @@ dev_t blk_lookup_devt(const char *name)mutex_lock (&block_class_lock);list_for_each_entry (dev, &block_class.devices, node) {if (strcmp (dev->bus_id, name) ==0 ) { - devt = dev->devt; +struct gendisk *disk =dev_to_disk (dev); + +if (part < disk->minors) + devt =MKDEV (MAJOR (dev->devt), +MINOR (dev->devt) + part);break ; } }
@@ -669,7 +673,6 @@ dev_t blk_lookup_devt(const char *name)return devt; } -EXPORT_SYMBOL (blk_lookup_devt);struct gendisk *alloc_disk (int minors)
include/linux/genhd.h +2 -2
@@ -525,7 +525,7 @@ struct unixware_disklabel {#define ADDPART_FLAG_RAID 1#define ADDPART_FLAG_WHOLEDISK 2 -extern dev_t blk_lookup_devt (const char *name); +extern dev_t blk_lookup_devt (const char *name,int part);extern char *disk_name (struct gendisk *hd,int part,char *buf);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)static inline void printk_all_partitions (void ) { } -static inline dev_t blk_lookup_devt (const char *name) +static inline dev_t blk_lookup_devt (const char *name,int part) {dev_t devt =MKDEV (0 ,0 );return devt;
init/do_mounts.c +26 -1
@@ -76,6 +76,7 @@ dev_t name_to_dev_t(char *name)char s[32 ];char *p;dev_t res =0 ; +int part;if (strncmp (name,"/dev/" ,5 ) !=0 ) {unsigned maj, min;
@@ -106,7 +107,31 @@ dev_t name_to_dev_t(char *name)for (p = s; *p; p++)if (*p =='/' ) *p ='!' ; - res =blk_lookup_devt (s); + res =blk_lookup_devt (s,0 ); +if (res) + goto done; + +/* +* try non-existant, but valid partition, which may only exist +* after revalidating the disk, like partitioned md devices +*/ +while (p > s &&isdigit (p[-1 ])) + p--; +if (p == s || !*p || *p =='0' ) + goto fail; + +/* try disk name without <part number> */ + part =simple_strtoul (p,NULL ,10 ); + *p ='\0' ; + res =blk_lookup_devt (s, part); +if (res) + goto done; + +/* try disk name without p<part number> */ +if (p < s +2 || !isdigit (p[-2 ]) || p[-1 ] !='p' ) + goto fail; + p[-1 ] ='\0' ; + res =blk_lookup_devt (s, part);if (res) goto done;
Signature · 1 line
1.5.5.1
PATCH 2/2 Driver core: struct class remove children list
In reply to Greg KHFrom: Dave Young <[email protected]>
because of the class_device was removed, now do the children list removing
--- drivers/base/class.c | 1 - include/linux/device.h | 1 - 2 files changed, 0 insertions(+), 2 deletions(-)
drivers/base/class.c +0 -1
@@ -140,7 +140,6 @@ int class_register(struct class *cls)pr_debug ("device class '%s': registering\n" , cls->name); -INIT_LIST_HEAD (&cls->children);INIT_LIST_HEAD (&cls->devices);INIT_LIST_HEAD (&cls->interfaces);kset_init (&cls->class_dirs);
include/linux/device.h +0 -1
@@ -183,7 +183,6 @@ struct class {struct module *owner;struct kset subsys; -struct list_head children;struct list_head devices;struct list_head interfaces;struct kset class_dirs;
Signature · 1 line
1.5.5.1