aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@suse.de>2005-12-13 18:17:34 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2006-01-04 19:18:09 -0500
commit8218ef80932aa7e5e3d20c929a640c8d82133a9a (patch)
tree73f2e7a972563cf536a7dae0fa02d99c4041d893
parent874c6241b2e49e52680d32a50d4909c7768d5cb9 (diff)
[PATCH] 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>
-rw-r--r--fs/partitions/check.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/fs/partitions/check.c b/fs/partitions/check.c
index 7187a57d51e8..7881ce05daef 100644
--- a/fs/partitions/check.c
+++ b/fs/partitions/check.c
@@ -336,12 +336,31 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
336 disk->part[part-1] = p; 336 disk->part[part-1] = p;
337} 337}
338 338
339static char *make_block_name(struct gendisk *disk)
340{
341 char *name;
342 static char *block_str = "block:";
343 int size;
344
345 size = strlen(block_str) + strlen(disk->disk_name) + 1;
346 name = kmalloc(size, GFP_KERNEL);
347 if (!name)
348 return NULL;
349 strcpy(name, block_str);
350 strcat(name, disk->disk_name);
351 return name;
352}
353
339static void disk_sysfs_symlinks(struct gendisk *disk) 354static void disk_sysfs_symlinks(struct gendisk *disk)
340{ 355{
341 struct device *target = get_device(disk->driverfs_dev); 356 struct device *target = get_device(disk->driverfs_dev);
342 if (target) { 357 if (target) {
358 char *disk_name = make_block_name(disk);
343 sysfs_create_link(&disk->kobj,&target->kobj,"device"); 359 sysfs_create_link(&disk->kobj,&target->kobj,"device");
344 sysfs_create_link(&target->kobj,&disk->kobj,"block"); 360 if (disk_name) {
361 sysfs_create_link(&target->kobj,&disk->kobj,disk_name);
362 kfree(disk_name);
363 }
345 } 364 }
346} 365}
347 366
@@ -461,8 +480,12 @@ void del_gendisk(struct gendisk *disk)
461 devfs_remove_disk(disk); 480 devfs_remove_disk(disk);
462 481
463 if (disk->driverfs_dev) { 482 if (disk->driverfs_dev) {
483 char *disk_name = make_block_name(disk);
464 sysfs_remove_link(&disk->kobj, "device"); 484 sysfs_remove_link(&disk->kobj, "device");
465 sysfs_remove_link(&disk->driverfs_dev->kobj, "block"); 485 if (disk_name) {
486 sysfs_remove_link(&disk->driverfs_dev->kobj, disk_name);
487 kfree(disk_name);
488 }
466 put_device(disk->driverfs_dev); 489 put_device(disk->driverfs_dev);
467 } 490 }
468 kobject_uevent(&disk->kobj, KOBJ_REMOVE); 491 kobject_uevent(&disk->kobj, KOBJ_REMOVE);