public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH ] add "bus" symlink to class/block devices
@ 2005-02-15 20:53 Kay Sievers
  2005-02-15 22:04 ` [PATCH] " Kay Sievers
  0 siblings, 1 reply; 6+ messages in thread
From: Kay Sievers @ 2005-02-15 20:53 UTC (permalink / raw)
  To: linux-kernel; +Cc: Greg KH

Add a "bus" symlink to the class and block devices, just like the "driver"
and "device" links. This may be a huge speed gain for e.g. udev to determine
the bus value of a device, as we currently need to do a brute-force scan in
/sys/bus/* to find this value.

/sys
|-- block
|   |-- fd0
|   |   |-- bus -> ../../bus/platform
|   |   |-- dev
|   |   |-- device -> ../../devices/platform/floppy0
|   |   |-- queue
|   |   |   |-- iosched

|-- class
|   |-- net
|   |   |-- eth0
|   |   |   |-- addr_len
|   |   |   |-- address
|   |   |   |-- broadcast
|   |   |   |-- bus -> ../../../bus/pci
|   |   |   |-- carrier
...
|   |   |-- ttyS0
|   |   |   |-- bus -> ../../../bus/pnp
|   |   |   |-- dev
|   |   |   |-- device -> ../../../devices/pnp0/00:09
|   |   |   `-- driver -> ../../../bus/pnp/drivers/serial
...
|   |-- sound
|   |   |-- controlC0
|   |   |   |-- bus -> ../../../bus/pci
|   |   |   |-- dev
|   |   |   |-- device -> ../../../devices/pci0000:00/0000:00:1f.5
|   |   |   `-- driver -> ../../../bus/pci/drivers/Intel ICH

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>

===== drivers/base/class.c 1.58 vs edited =====
--- 1.58/drivers/base/class.c	2005-02-05 19:35:12 +01:00
+++ edited/drivers/base/class.c	2005-02-15 21:31:06 +01:00
@@ -196,33 +196,33 @@ void class_device_remove_bin_file(struct
 		sysfs_remove_bin_file(&class_dev->kobj, attr);
 }
 
-static int class_device_dev_link(struct class_device * class_dev)
+static void class_device_add_dev_symlinks(struct class_device *class_dev)
 {
-	if (class_dev->dev)
-		return sysfs_create_link(&class_dev->kobj,
-					 &class_dev->dev->kobj, "device");
-	return 0;
-}
+	if (!class_dev->dev)
+		return 0;
 
-static void class_device_dev_unlink(struct class_device * class_dev)
-{
-	sysfs_remove_link(&class_dev->kobj, "device");
-}
+	sysfs_create_link(&class_dev->kobj, &class_dev->dev->kobj, "device");
 
-static int class_device_driver_link(struct class_device * class_dev)
-{
-	if ((class_dev->dev) && (class_dev->dev->driver))
-		return sysfs_create_link(&class_dev->kobj,
-					 &class_dev->dev->driver->kobj, "driver");
-	return 0;
+	if (class_dev->dev->driver)
+		sysfs_create_link(&class_dev->kobj,
+				  &class_dev->dev->driver->kobj, "driver");
+
+	if (class_dev->dev->bus)
+		sysfs_create_link(&class_dev->kobj,
+				  &class_dev->dev->bus->subsys.kset.kobj,
+				  "bus");
 }
 
-static void class_device_driver_unlink(struct class_device * class_dev)
+static void class_device_remove_dev_symlinks(struct class_device *class_dev)
 {
+	if (!class_dev->dev)
+		return 0;
+
+	sysfs_remove_link(&class_dev->kobj, "device");
 	sysfs_remove_link(&class_dev->kobj, "driver");
+	sysfs_remove_link(&class_dev->kobj, "bus");
 }
 
-
 static ssize_t
 class_device_attr_show(struct kobject * kobj, struct attribute * attr,
 		       char * buf)
@@ -452,8 +452,7 @@ int class_device_add(struct class_device
 		class_device_create_file(class_dev, &class_device_attr_dev);
 
 	class_device_add_attrs(class_dev);
-	class_device_dev_link(class_dev);
-	class_device_driver_link(class_dev);
+	class_device_add_dev_symlinks(class_dev);
 
  register_done:
 	if (error && parent)
@@ -482,8 +481,7 @@ void class_device_del(struct class_devic
 		up_write(&parent->subsys.rwsem);
 	}
 
-	class_device_dev_unlink(class_dev);
-	class_device_driver_unlink(class_dev);
+	class_device_remove_dev_symlinks(class_dev);
 	class_device_remove_attrs(class_dev);
 
 	kobject_del(&class_dev->kobj);
===== fs/partitions/check.c 1.129 vs edited =====
--- 1.129/fs/partitions/check.c	2005-01-31 07:33:40 +01:00
+++ edited/fs/partitions/check.c	2005-02-15 21:14:43 +01:00
@@ -318,6 +318,8 @@ static void disk_sysfs_symlinks(struct g
 	struct device *target = get_device(disk->driverfs_dev);
 	if (target) {
 		sysfs_create_link(&disk->kobj,&target->kobj,"device");
+		if (target->bus)
+			sysfs_create_link(&disk->kobj,&target->bus->subsys.kset.kobj,"bus");
 		sysfs_create_link(&target->kobj,&disk->kobj,"block");
 	}
 }
@@ -438,6 +440,7 @@ void del_gendisk(struct gendisk *disk)
 
 	if (disk->driverfs_dev) {
 		sysfs_remove_link(&disk->kobj, "device");
+		sysfs_remove_link(&disk->kobj, "bus");
 		sysfs_remove_link(&disk->driverfs_dev->kobj, "block");
 		put_device(disk->driverfs_dev);
 	}


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2005-02-17 22:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-02-15 20:53 [PATCH ] add "bus" symlink to class/block devices Kay Sievers
2005-02-15 22:04 ` [PATCH] " Kay Sievers
2005-02-15 22:25   ` Dmitry Torokhov
2005-02-15 23:44     ` Greg KH
2005-02-16  3:18       ` Dmitry Torokhov
2005-02-17 21:35   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox