diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2005-12-13 22:28:12 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-12-13 22:28:12 -0800 |
commit | b7f2e6920c806ac9de4f562bc66320daf7594f6f (patch) | |
tree | a902d6f3901115942b4740ad794117781e4ddb70 /driver | |
parent | c04f139e013e7a704395d932892433c6c17c994f (diff) | |
download | patches-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.patch | 67 |
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)); |