[PATCH] Driver core: Make block devices create the proper symlink name
authorGreg Kroah-Hartman <gregkh@suse.de>
Tue, 13 Dec 2005 23:17:34 +0000 (15:17 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 5 Jan 2006 00:18:09 +0000 (16:18 -0800)
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

index 7187a57d51e8dbcbc8b73d65a85bbe142757e401..7881ce05daef359ef012a139c2046e712969d38a 100644 (file)
@@ -336,12 +336,31 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
        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);
+               }
        }
 }
 
@@ -461,8 +480,12 @@ void del_gendisk(struct gendisk *disk)
        devfs_remove_disk(disk);
 
        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);
        }
        kobject_uevent(&disk->kobj, KOBJ_REMOVE);