[PATCH ] add "bus" symlink to class/block devices

From: Kay Sievers
Date: Tue Feb 15 2005 - 16:00:59 EST


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@xxxxxxxx>

===== 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);
}

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/