* add the physical device and the bus to the hotplug environment
@ 2004-11-04 2:44 Kay Sievers
2004-11-04 18:18 ` Greg KH
0 siblings, 1 reply; 2+ messages in thread
From: Kay Sievers @ 2004-11-04 2:44 UTC (permalink / raw)
To: linux-hotplug
Add the sysfs path of the physical device to the hotplug event of class
and block devices. This should solve the userspace issue not to know if
the device is a virtual one and the "device" symlink will never be created,
but we sit there and wait for it to show up not knowing when we should
give up.
Also the bus name is added to the hotplug event, so we don't need to
reverse lookup in the /sys/bus/* directory which bus our physical
device belongs to. This is e.g. the value matched against the BUS= key,
that may be used in an udev rule.
This is a PCI network card:
ACTIONd
SUBSYSTEM=net
DEVPATH=/class/net/eth0
PHYSDEVPATH=/devices/pci0000:00/0000:00:1e.0/0000:02:01.0
PHYSDEVBUS=pci
INTERFACE=eth0
SEQNUM‚7
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
This is a IDE CDROM:
ACTIONd
SUBSYSTEM=block
DEVPATH=/block/hdc
PHYSDEVPATH=/devices/pci0000:00/0000:00:1f.1/ide1/1.0
PHYSDEVBUS=ide
SEQNUM\x1017
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
This is an USB-stick partition:
ACTIONd
SUBSYSTEM=block
DEVPATH=/block/sda/sda1
PHYSDEVPATH=/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/host1/target1:0:0/1:0:0:0
PHYSDEVBUS=scsi
SEQNUM\x1032
PATH=/sbin:/bin:/usr/sbin:/usr/bin
HOME=/
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
=== drivers/base/class.c 1.54 vs edited ==--- 1.54/drivers/base/class.c 2004-10-08 20:32:52 +02:00
+++ edited/drivers/base/class.c 2004-11-04 01:57:19 +01:00
@@ -283,8 +283,34 @@ static int class_hotplug(struct kset *ks
{
struct class_device *class_dev = to_class_dev(kobj);
int retval = 0;
+ int i = 0;
+ int length = 0;
pr_debug("%s - name = %s\n", __FUNCTION__, class_dev->class_id);
+
+ if (class_dev->dev) {
+ /* add physical device, backing this device */
+ struct device *dev = class_dev->dev;
+ char *path = kobject_get_path(&dev->kobj, GFP_KERNEL);
+
+ add_hotplug_env_var(envp, num_envp, &i, buffer, buffer_size,
+ &length, "PHYSDEVPATH=%s", path);
+ kfree(path);
+
+ /* add bus name of physical device */
+ if (dev->bus)
+ add_hotplug_env_var(envp, num_envp, &i,
+ buffer, buffer_size, &length,
+ "PHYSDEVBUS=%s", dev->bus->name);
+
+ /* terminate, set to next free slot, shrink available space */
+ envp[i] = NULL;
+ envp = &envp[i];
+ num_envp -= i;
+ buffer = &buffer[length];
+ buffer_size -= length;
+ }
+
if (class_dev->class->hotplug) {
/* have the bus specific function add its stuff */
retval = class_dev->class->hotplug (class_dev, envp, num_envp,
=== drivers/block/genhd.c 1.104 vs edited ==--- 1.104/drivers/block/genhd.c 2004-09-22 22:35:24 +02:00
+++ edited/drivers/block/genhd.c 2004-11-04 02:53:28 +01:00
@@ -438,8 +438,46 @@ static int block_hotplug_filter(struct k
return ((ktype = &ktype_block) || (ktype = &ktype_part));
}
+static int block_hotplug(struct kset *kset, struct kobject *kobj, char **envp,
+ int num_envp, char *buffer, int buffer_size)
+{
+ struct device *dev = NULL;
+ struct kobj_type *ktype = get_ktype(kobj);
+ int length = 0;
+ int i = 0;
+
+ /* get physical device backing disk or partition */
+ if (ktype = &ktype_block) {
+ struct gendisk *disk = container_of(kobj, struct gendisk, kobj);
+ dev = disk->driverfs_dev;
+ } else if (ktype = &ktype_part) {
+ struct gendisk *disk = container_of(kobj->parent, struct gendisk, kobj);
+ dev = disk->driverfs_dev;
+ }
+
+ if (dev) {
+ /* add physical device, backing this device */
+ char *path = kobject_get_path(&dev->kobj, GFP_KERNEL);
+
+ add_hotplug_env_var(envp, num_envp, &i, buffer, buffer_size,
+ &length, "PHYSDEVPATH=%s", path);
+ kfree(path);
+
+ /* add bus name of physical device */
+ if (dev->bus)
+ add_hotplug_env_var(envp, num_envp, &i,
+ buffer, buffer_size, &length,
+ "PHYSDEVBUS=%s", dev->bus->name);
+
+ envp[i] = NULL;
+ }
+
+ return 0;
+}
+
static struct kset_hotplug_ops block_hotplug_ops = {
- .filter = block_hotplug_filter,
+ .filter = block_hotplug_filter,
+ .hotplug = block_hotplug,
};
/* declare block_subsys. */
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_idU88&alloc_id\x12065&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: add the physical device and the bus to the hotplug environment
2004-11-04 2:44 add the physical device and the bus to the hotplug environment Kay Sievers
@ 2004-11-04 18:18 ` Greg KH
0 siblings, 0 replies; 2+ messages in thread
From: Greg KH @ 2004-11-04 18:18 UTC (permalink / raw)
To: linux-hotplug
On Thu, Nov 04, 2004 at 03:44:28AM +0100, Kay Sievers wrote:
> Add the sysfs path of the physical device to the hotplug event of class
> and block devices. This should solve the userspace issue not to know if
> the device is a virtual one and the "device" symlink will never be created,
> but we sit there and wait for it to show up not knowing when we should
> give up.
>
> Also the bus name is added to the hotplug event, so we don't need to
> reverse lookup in the /sys/bus/* directory which bus our physical
> device belongs to. This is e.g. the value matched against the BUS= key,
> that may be used in an udev rule.
>
> This is a PCI network card:
> ACTIONd
> SUBSYSTEM=net
> DEVPATH=/class/net/eth0
> PHYSDEVPATH=/devices/pci0000:00/0000:00:1e.0/0000:02:01.0
> PHYSDEVBUS=pci
> INTERFACE=eth0
> SEQNUM‚7
> PATH=/sbin:/bin:/usr/sbin:/usr/bin
> HOME=/
>
> This is a IDE CDROM:
> ACTIONd
> SUBSYSTEM=block
> DEVPATH=/block/hdc
> PHYSDEVPATH=/devices/pci0000:00/0000:00:1f.1/ide1/1.0
> PHYSDEVBUS=ide
> SEQNUM\x1017
> PATH=/sbin:/bin:/usr/sbin:/usr/bin
> HOME=/
>
> This is an USB-stick partition:
> ACTIONd
> SUBSYSTEM=block
> DEVPATH=/block/sda/sda1
> PHYSDEVPATH=/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/host1/target1:0:0/1:0:0:0
> PHYSDEVBUS=scsi
> SEQNUM\x1032
> PATH=/sbin:/bin:/usr/sbin:/usr/bin
> HOME=/
>
>
> Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Very nice, I like this a lot. Should make userspace logic a lot simpler
now. I've applied this to my trees.
thanks,
greg k-h
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_idU88&alloc_id\x12065&op=click
_______________________________________________
Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net
Linux-hotplug-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2004-11-04 18:18 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-11-04 2:44 add the physical device and the bus to the hotplug environment Kay Sievers
2004-11-04 18:18 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).