aboutsummaryrefslogtreecommitdiffstats
path: root/driver
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-12-13 22:28:12 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2005-12-13 22:28:12 -0800
commitb7f2e6920c806ac9de4f562bc66320daf7594f6f (patch)
treea902d6f3901115942b4740ad794117781e4ddb70 /driver
parentc04f139e013e7a704395d932892433c6c17c994f (diff)
downloadpatches-b7f2e6920c806ac9de4f562bc66320daf7594f6f.tar.gz
add patch to fix block symlink to device issue
Diffstat (limited to 'driver')
-rw-r--r--driver/block-device-symlink-name-fix.patch67
1 files changed, 67 insertions, 0 deletions
diff --git a/driver/block-device-symlink-name-fix.patch b/driver/block-device-symlink-name-fix.patch
new file mode 100644
index 0000000000000..b3cd447678122
--- /dev/null
+++ b/driver/block-device-symlink-name-fix.patch
@@ -0,0 +1,67 @@
+From foo@baz.org Tue Dec 13 15:20:15 2005
+Date: Tue, 13 Dec 2005 15:17:34 -0800
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Driver core: Make block devices create the proper symlink name
+
+Block devices need to add the block device name to the symlink they put
+in the device directory, otherwise multiple symlinks of the same name
+can be created. This matches the class system, which works the same
+way, we just forgot to convert block at the same time.
+
+
+Cc: Pete Zaitcev <zaitcev@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/partitions/check.c | 27 +++++++++++++++++++++++++--
+ 1 file changed, 25 insertions(+), 2 deletions(-)
+
+--- gregkh-2.6.orig/fs/partitions/check.c
++++ gregkh-2.6/fs/partitions/check.c
+@@ -325,12 +325,31 @@ void add_partition(struct gendisk *disk,
+ disk->part[part-1] = p;
+ }
+
++static char *make_block_name(struct gendisk *disk)
++{
++ char *name;
++ static char *block_str = "block:";
++ int size;
++
++ size = strlen(block_str) + strlen(disk->disk_name) + 1;
++ name = kmalloc(size, GFP_KERNEL);
++ if (!name)
++ return NULL;
++ strcpy(name, block_str);
++ strcat(name, disk->disk_name);
++ return name;
++}
++
+ static void disk_sysfs_symlinks(struct gendisk *disk)
+ {
+ struct device *target = get_device(disk->driverfs_dev);
+ if (target) {
++ char *disk_name = make_block_name(disk);
+ sysfs_create_link(&disk->kobj,&target->kobj,"device");
+- sysfs_create_link(&target->kobj,&disk->kobj,"block");
++ if (disk_name) {
++ sysfs_create_link(&target->kobj,&disk->kobj,disk_name);
++ kfree(disk_name);
++ }
+ }
+ }
+
+@@ -444,8 +463,12 @@ void del_gendisk(struct gendisk *disk)
+ disk->stamp = 0;
+
+ if (disk->driverfs_dev) {
++ char *disk_name = make_block_name(disk);
+ sysfs_remove_link(&disk->kobj, "device");
+- sysfs_remove_link(&disk->driverfs_dev->kobj, "block");
++ if (disk_name) {
++ sysfs_remove_link(&disk->driverfs_dev->kobj, disk_name);
++ kfree(disk_name);
++ }
+ put_device(disk->driverfs_dev);
+ }
+ ndevfs_remove(kobject_name(&disk->kobj));