class core: export MAJOR/MINOR to the hotplug env
PATCH 1/7 class core: export MAJOR/MINOR to the hotplug env
Move the creation of the sysfs "dev" file of a class device into the driver core. The struct class_device contains a dev_t value now. If set, the driver core will create the "dev" file containing the major/minor numbers automatically.
Signed-off-by Kay Sievers <[email protected]>
===== drivers/base/class.c 1.57 vs edited =====
drivers/base/class.c +29 -10
@@ -15,6 +15,7 @@#include <linux/module.h> #include <linux/init.h> #include <linux/string.h> +#include <linux/kdev_t.h> #include "base.h" #define to_class_attr (_attr) container_of(_attr, struct class_attribute, attr)
@@ -298,9 +299,9 @@ static int class_hotplug(struct kset *ks int num_envp, char *buffer, int buffer_size) { struct class_device *class_dev = to_class_dev(kobj); -int retval =0 ;int i =0 ;int length =0 ; +int retval =0 ;pr_debug ("%s - name = %s\n" , __FUNCTION__, class_dev->class_id);
@@ -313,26 +314,34 @@ static int class_hotplug(struct kset *ks &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); -/* add driver name of physical device */ if (dev->driver)add_hotplug_env_var (envp, num_envp, &i, buffer, buffer_size, &length,"PHYSDEVDRIVER=%s" , dev->driver->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 (MAJOR (class_dev->devt)) { +add_hotplug_env_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"MAJOR=%u" ,MAJOR (class_dev->devt)); + +add_hotplug_env_var (envp, num_envp, &i, + buffer, buffer_size, &length, +"MINOR=%u" ,MINOR (class_dev->devt)); + } + +/* 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,
@@ -388,6 +397,12 @@ static void class_device_remove_attrs(st } } +static ssize_t show_dev (struct class_device *class_dev,char *buf) +{ +return print_dev_t (buf, class_dev->devt); +} +static CLASS_DEVICE_ATTR(dev, S_IRUGO, show_dev, NULL); +void class_device_initialize (struct class_device *class_dev) {kobj_set_kset_s (class_dev, class_obj_subsys);
@@ -432,6 +447,10 @@ int class_device_add(struct class_device class_intf->add (class_dev);up_write (&parent->subsys.rwsem); } + +if (MAJOR (class_dev->devt)) +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);
===== include/linux/device.h 1.135 vs edited =====
include/linux/device.h +1 -0
@@ -184,6 +184,7 @@ struct class_device {struct kobject kobj;struct class * class;/* required */ +dev_t devt;/* dev_t, creates the sysfs "dev" */ struct device * dev;/* not necessary, but nice to have */ void * class_data;/* class-specific data */