Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8218ef80 authored by Greg Kroah-Hartman's avatar Greg Kroah-Hartman
Browse files

[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: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 874c6241
Loading
Loading
Loading
Loading
+25 −2
Original line number Original line Diff line number Diff line
@@ -336,12 +336,31 @@ void add_partition(struct gendisk *disk, int part, sector_t start, sector_t len)
	disk->part[part-1] = p;
	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)
static void disk_sysfs_symlinks(struct gendisk *disk)
{
{
	struct device *target = get_device(disk->driverfs_dev);
	struct device *target = get_device(disk->driverfs_dev);
	if (target) {
	if (target) {
		char *disk_name = make_block_name(disk);
		sysfs_create_link(&disk->kobj,&target->kobj,"device");
		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);
	devfs_remove_disk(disk);


	if (disk->driverfs_dev) {
	if (disk->driverfs_dev) {
		char *disk_name = make_block_name(disk);
		sysfs_remove_link(&disk->kobj, "device");
		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);
		put_device(disk->driverfs_dev);
	}
	}
	kobject_uevent(&disk->kobj, KOBJ_REMOVE);
	kobject_uevent(&disk->kobj, KOBJ_REMOVE);