driver core patches for .36
Subsystems (12)
PATCH 1/1 driver core patches for .36
Here's the big driver core merge for the .36 merge window.
Nothing major here, lot of little things around the driver-core area. Biggest is the firmware code rework to make things simpler and the addition of a stable place to mount cgroupfs that everyone has now agreed on (acked by the cgroup maintainers.)
Full details as to what is included is below in the shortlog.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git/
All of these patches have been in the linux-next and mm trees.
The patches will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
------------
Documentation/DocBook/device-drivers.tmpl | 1 + Documentation/filesystems/sysfs.txt | 46 +++-- Documentation/firmware_class/hotplug-script | 17 +- arch/powerpc/sysdev/mv64x60_pci.c | 1 - drivers/base/bus.c | 2 +- drivers/base/core.c | 2 +- drivers/base/dd.c | 4 + drivers/base/dma-coherent.c | 2 +- drivers/base/firmware_class.c | 262 +++++++++++++-------------- drivers/base/platform.c | 110 +++-------- drivers/firmware/dcdbas.c | 5 +- drivers/firmware/dmi-id.c | 4 +- drivers/leds/leds-bd2802.c | 4 +- drivers/regulator/core.c | 1 - drivers/scsi/arcmsr/arcmsr_attr.c | 3 - drivers/scsi/lpfc/lpfc_attr.c | 1 - drivers/uio/uio_cif.c | 2 +- drivers/uio/uio_pdrv_genirq.c | 1 - drivers/uio/uio_sercos3.c | 2 +- fs/sysfs/file.c | 3 +- include/linux/device.h | 15 +- include/linux/platform_device.h | 62 ++++++- include/linux/sysfs.h | 12 +- kernel/cgroup.c | 13 ++- kernel/sysctl.c | 2 +- lib/Kconfig.debug | 1 - 26 files changed, 288 insertions(+), 290 deletions(-)
---------------
Axel Lin (2):
dmi-id: fix a memory leak in dmi_id_init error path
dcdbas: remove a redundant smi_data_buf_free in dcdbas_exit
Bart Van Assche (1):
sysfs: fix discrepancies between implementation and documentation
Dmitry Torokhov (2):
firmware loader: use statically initialized data attribute firmware loader: embed device into firmware_priv structure
Greg Kroah-Hartman (1):
cgroupfs: create /sys/fs/cgroup to mount cgroupfs on
Guenter Roeck (6):
scsi: Remove owner field from attribute initialization in LPFC driver
scsi: Remove owner field from attribute initialization in ARCMSR driver
leds: Remove owner field from attribute initialization in bd2802 driver
regulator: Remove owner field from attribute initialization in regulator core driver powerpc/pci: Remove owner field from attribute initialization in PCI bridge init
sysfs: Remove owner field from sysfs struct attribute
Hans J. Koch (3):
uio: Remove IRQF_DISABLED flag from uio_pdrv_genirq.c
uio: Remove IRQF_DISABLED from uio_sercos3.c
uio: Remove IRQF_DISABLED flag from uio_cif.c
Ian Abbott (1):
hotplug: Support kernel/hotplug sysctl variable when !CONFIG_NET
Ira Weiny (1):
sysfs: Fix one more signature discrepancy between sysfs implementation and docs.
Jean Delvare (2):
Driver core: Drop __must_check from bus_for_each_drv()
sysfs: sysfs_chmod_file's attr can be const
Jike Song (1):
driver core: fix memory leak on one error path in bus_register()
Johannes Berg (1):
driver core: device_rename's new_name can be const
Magnus Damm (2):
firmware: Update hotplug script
Driver core: Add BUS_NOTIFY_BIND_DRIVER
Marin Mitov (1):
Driver core: internal struct dma_coherent_mem, change type of a member.
Randy Dunlap (1):
debugfs: no longer needs to depend on SYSFS
Uwe Kleine-König (3):
Driver core: use kmemdup in platform_device_add_resources
Driver core: reduce duplicated code for platform_device creation Driver core: move platform device creation helpers to .init.text (if MODULE=n)
PATCH 1/28 uio: Remove IRQF_DISABLED flag from uio_pdrv_genirq.c
From: Hans J. Koch <[email protected]>
Remove IRQF_DISABLED flag since it is deprecated and a no-op in the current kernel.
--- drivers/uio/uio_pdrv_genirq.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
drivers/uio/uio_pdrv_genirq.c +0 -1
@@ -155,7 +155,6 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)* Interrupt sharing is not supported. */ - uioinfo->irq_flags |=IRQF_DISABLED ; uioinfo->handler = uio_pdrv_genirq_handler; uioinfo->irqcontrol = uio_pdrv_genirq_irqcontrol; uioinfo->open = uio_pdrv_genirq_open;
Signature · 1 line
1.7.2
PATCH 2/28 uio: Remove IRQF_DISABLED from uio_sercos3.c
In reply to Greg KHFrom: Hans J. Koch <[email protected]>
Remove IRQF_DISABLED since it is deprecated and a no-op in the current kernel.
--- drivers/uio/uio_sercos3.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/uio/uio_sercos3.c +1 -1
@@ -154,7 +154,7 @@ static int __devinit sercos3_pci_probe(struct pci_dev *dev, info->name ="Sercos_III_PCI" ; info->version ="0.0.1" ; info->irq = dev->irq; - info->irq_flags =IRQF_DISABLED |IRQF_SHARED ; + info->irq_flags =IRQF_SHARED ; info->handler = sercos3_handler; info->irqcontrol = sercos3_irqcontrol;
Signature · 1 line
1.7.2
PATCH 3/28 uio: Remove IRQF_DISABLED flag from uio_cif.c
In reply to Greg KHFrom: Hans J. Koch <[email protected]>
Remove IRQF_DISABLED since it is deprecated and a no-op in the current kernel.
--- drivers/uio/uio_cif.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/uio/uio_cif.c +1 -1
@@ -79,7 +79,7 @@ static int __devinit hilscher_pci_probe(struct pci_dev *dev, } info->version ="0.0.1" ; info->irq = dev->irq; - info->irq_flags =IRQF_DISABLED |IRQF_SHARED ; + info->irq_flags =IRQF_SHARED ; info->handler = hilscher_handler;if (uio_register_device (&dev->dev, info))
Signature · 1 line
1.7.2
PATCH 4/28 hotplug: Support kernel/hotplug sysctl variable when !CONFIG_NET
In reply to Greg KHFrom: Ian Abbott <[email protected]>
The kernel/hotplug sysctl variable (/proc/sys/kernel/hotplug file) was made conditional on CONFIG_NET by commit f743ca5e10f4145e0b3e6d11b9b46171e16af7ce (applied in 2.6.18) to fix problems with undefined references in 2.6.16 when CONFIG_HOTPLUG=y && !CONFIG_NET, but this restriction is no longer needed.
This patch makes the kernel/hotplug sysctl variable depend only on CONFIG_HOTPLUG.
--- kernel/sysctl.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
kernel/sysctl.c +1 -1
@@ -562,7 +562,7 @@ static struct ctl_table kern_table[] = { .extra2 = &one, },#endif -#if defined(CONFIG_HOTPLUG ) && defined(CONFIG_NET ) +#ifdef CONFIG_HOTPLUG { .procname = "hotplug", .data = &uevent_helper,
Signature · 1 line
1.7.2
PATCH 5/28 Driver core: internal struct dma_coherent_mem, change type of a member.
In reply to Greg KHFrom: Marin Mitov <[email protected]>
struct dma_coherent_mem in drivers/base/dma-coherent.c has member 'device_base' that is of type u32, but is assigned value of type dma_addr_t, which may be 64 bits for x86_64. Change the type to dma_addr_t.
--- drivers/base/dma-coherent.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/dma-coherent.c +1 -1
@@ -8,7 +8,7 @@struct dma_coherent_mem {void *virt_base; -u32 device_base; +dma_addr_t device_base;int size;int flags;unsigned long *bitmap;
Signature · 1 line
1.7.2
PATCH 6/28 Driver core: Drop __must_check from bus_for_each_drv()
In reply to Greg KHFrom: Jean Delvare <[email protected]>
There is little rationale for marking bus_for_each_drv() __must_check. It is more of an iteration helper than a real function. You don't know in advance which callback it will be used on, so you have no clue how important it can be to check the returned value. In practice, this helper function can be used for best-effort tasks.
As a matter of fact, bus_for_each_dev() is not marked __must_check. So remove it from bus_for_each_drv() as well. This is the same that was done back in October 2006 by Russell King for device_for_each_child(), for exactly the same reasons.
--- include/linux/device.h | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
include/linux/device.h +2 -3
@@ -84,9 +84,8 @@ struct device *bus_find_device_by_name(struct bus_type *bus,struct device *start, const char *name); -int __must_check bus_for_each_drv (struct bus_type *bus, -struct device_driver *start,void *data, -int (*fn)(struct device_driver *,void *)); +int bus_for_each_drv (struct bus_type *bus,struct device_driver *start, +void *data,int (*fn)(struct device_driver *,void *)); void bus_sort_breadthfirst(struct bus_type *bus, int (*compare)(const struct device *a,
Signature · 1 line
1.7.2
PATCH 7/28 firmware loader: use statically initialized data attribute
In reply to Greg KHFrom: Dmitry Torokhov <[email protected]>
There is no reason why we are using a template for binary attribute and copying it into per-firmware data before registering. Using the original works as well.
--- drivers/base/firmware_class.c | 9 +++------ 1 files changed, 3 insertions(+), 6 deletions(-)
drivers/base/firmware_class.c +3 -6
@@ -87,7 +87,6 @@ static DEFINE_MUTEX(fw_lock);struct firmware_priv {struct completion completion; -struct bin_attribute attr_data;struct firmware *fw;unsigned long status;struct page **pages;
@@ -420,8 +419,8 @@ out:return retval; } -static struct bin_attribute firmware_attr_data_tmpl = { - .attr = {.name ="data" , .mode =0644 }, +static struct bin_attribute firmware_attr_data = { + .attr = { .name ="data" , .mode =0644 }, .size =0 , .read = firmware_data_read, .write = firmware_data_write,
@@ -452,7 +451,6 @@ static int fw_register_device(struct device **dev_p, const char *fw_name,strcpy (fw_priv->fw_id, fw_name);init_completion (&fw_priv->completion); - fw_priv->attr_data = firmware_attr_data_tmpl; fw_priv->timeout.function = firmware_class_timeout; fw_priv->timeout.data = (u_long ) fw_priv;init_timer (&fw_priv->timeout);
@@ -498,8 +496,7 @@ static int fw_setup_device(struct firmware *fw, struct device **dev_p, fw_priv->nowait = nowait; fw_priv->fw = fw; -sysfs_bin_attr_init (&fw_priv->attr_data); - retval =sysfs_create_bin_file (&f_dev->kobj, &fw_priv->attr_data); + retval =sysfs_create_bin_file (&f_dev->kobj, &firmware_attr_data);if (retval) {dev_err (device,"%s: sysfs_create_bin_file failed\n" , __func__); goto error_unreg;
Signature · 1 line
1.7.2
PATCH 8/28 firmware loader: embed device into firmware_priv structure
In reply to Greg KHFrom: Dmitry Torokhov <[email protected]>
Both these structures have the same lifetime rules so instead of allocating and managing them separately embed struct device into struct firmware_priv. Also make sure to delete sysfs attributes ourselves instead of expecting sysfs to clean up our mess.
--- drivers/base/firmware_class.c | 255 ++++++++++++++++++++--------------------- 1 files changed, 122 insertions(+), 133 deletions(-)
drivers/base/firmware_class.c +122 -133
@@ -93,22 +93,26 @@ struct firmware_priv {int nr_pages;int page_array_size;struct timer_list timeout; +struct device dev;bool nowait;char fw_id[]; }; -static void -fw_load_abort (struct firmware_priv *fw_priv) +static struct firmware_priv *to_firmware_priv (struct device *dev) +{ + return container_of(dev, struct firmware_priv, dev); +} + +static void fw_load_abort (struct firmware_priv *fw_priv) {set_bit (FW_STATUS_ABORT , &fw_priv->status);wmb ();complete (&fw_priv->completion); } -static ssize_t -firmware_timeout_show (struct class *class, -struct class_attribute *attr, -char *buf) +static ssize_t firmware_timeout_show (struct class *class, +struct class_attribute *attr, +char *buf) {return sprintf (buf,"%d\n" , loading_timeout); }
@@ -126,14 +130,14 @@ firmware_timeout_show(struct class *class,* * Note: zero means 'wait forever'. **/ -static ssize_t -firmware_timeout_store (struct class *class, -struct class_attribute *attr, -const char *buf,size_t count) +static ssize_t firmware_timeout_store (struct class *class, +struct class_attribute *attr, +const char *buf,size_t count) { loading_timeout =simple_strtol (buf,NULL ,10 );if (loading_timeout <0 ) loading_timeout =0 ; +return count; }
@@ -145,21 +149,20 @@ static struct class_attribute firmware_class_attrs[] = {static void fw_dev_release (struct device *dev) { -struct firmware_priv *fw_priv =dev_get_drvdata (dev); +struct firmware_priv *fw_priv =to_firmware_priv (dev);int i;for (i =0 ; i < fw_priv->nr_pages; i++)__free_page (fw_priv->pages[i]);kfree (fw_priv->pages);kfree (fw_priv); -kfree (dev);module_put (THIS_MODULE ); }static int firmware_uevent (struct device *dev,struct kobj_uevent_env *env) { -struct firmware_priv *fw_priv =dev_get_drvdata (dev); +struct firmware_priv *fw_priv =to_firmware_priv (dev);if (add_uevent_var (env,"FIRMWARE=%s" , fw_priv->fw_id))return -ENOMEM ;
@@ -181,8 +184,9 @@ static struct class firmware_class = {static ssize_t firmware_loading_show (struct device *dev,struct device_attribute *attr,char *buf) { -struct firmware_priv *fw_priv =dev_get_drvdata (dev); +struct firmware_priv *fw_priv =to_firmware_priv (dev);int loading =test_bit (FW_STATUS_LOADING , &fw_priv->status); +return sprintf (buf,"%d\n" , loading); }
@@ -218,7 +222,7 @@ static ssize_t firmware_loading_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count) { - struct firmware_priv *fw_priv = dev_get_drvdata(dev); + struct firmware_priv *fw_priv = to_firmware_priv(dev);int loading =simple_strtol (buf,NULL ,10 );int i;
@@ -276,13 +280,12 @@ static ssize_t firmware_loading_store(struct device *dev, static DEVICE_ATTR(loading, 0644, firmware_loading_show, firmware_loading_store); -static ssize_t -firmware_data_read (struct file *filp,struct kobject *kobj, -struct bin_attribute *bin_attr,char *buffer,loff_t offset, -size_t count) +static ssize_t firmware_data_read (struct file *filp,struct kobject *kobj, +struct bin_attribute *bin_attr, +char *buffer,loff_t offset,size_t count) {struct device *dev =to_dev (kobj); -struct firmware_priv *fw_priv =dev_get_drvdata (dev); +struct firmware_priv *fw_priv =to_firmware_priv (dev);struct firmware *fw;ssize_t ret_count;
@@ -321,8 +324,7 @@ out:return ret_count; } -static int -fw_realloc_buffer (struct firmware_priv *fw_priv,int min_size) +static int fw_realloc_buffer (struct firmware_priv *fw_priv,int min_size) {int pages_needed =ALIGN (min_size,PAGE_SIZE ) >>PAGE_SHIFT ;
@@ -372,13 +374,12 @@ fw_realloc_buffer(struct firmware_priv *fw_priv, int min_size)* Data written to the 'data' attribute will be later handed to * the driver as a firmware image. **/ -static ssize_t -firmware_data_write (struct file * filp,struct kobject *kobj, -struct bin_attribute *bin_attr,char *buffer, -loff_t offset,size_t count) +static ssize_t firmware_data_write (struct file *filp,struct kobject *kobj, +struct bin_attribute *bin_attr, +char *buffer,loff_t offset,size_t count) {struct device *dev =to_dev (kobj); -struct firmware_priv *fw_priv =dev_get_drvdata (dev); +struct firmware_priv *fw_priv =to_firmware_priv (dev);struct firmware *fw;ssize_t retval;
@@ -426,107 +427,96 @@ static struct bin_attribute firmware_attr_data = { .write = firmware_data_write, }; -static void -firmware_class_timeout (u_long data) +static void firmware_class_timeout (u_long data) {struct firmware_priv *fw_priv = (struct firmware_priv *) data; +fw_load_abort (fw_priv); } -static int fw_register_device (struct device **dev_p,const char *fw_name, -struct device *device) +static struct firmware_priv * +fw_create_instance (struct firmware *firmware,const char *fw_name, +struct device *device,bool uevent,bool nowait) { -int retval; -struct firmware_priv *fw_priv = -kzalloc (sizeof (*fw_priv) +strlen (fw_name) +1 ,GFP_KERNEL ); -struct device *f_dev =kzalloc (sizeof (*f_dev),GFP_KERNEL ); - - *dev_p =NULL ; +struct firmware_priv *fw_priv; +struct device *f_dev; +int error; -if (!fw_priv || !f_dev) { + fw_priv =kzalloc (sizeof (*fw_priv) +strlen (fw_name) +1 ,GFP_KERNEL ); +if (!fw_priv) {dev_err (device,"%s: kmalloc failed\n" , __func__); - retval = -ENOMEM ; - goto error_kfree; + error = -ENOMEM ; + goto err_out; } + fw_priv->fw = firmware; + fw_priv->nowait = nowait;strcpy (fw_priv->fw_id, fw_name);init_completion (&fw_priv->completion); - fw_priv->timeout.function = firmware_class_timeout; - fw_priv->timeout.data = (u_long ) fw_priv; -init_timer (&fw_priv->timeout); +setup_timer (&fw_priv->timeout, + firmware_class_timeout, (u_long ) fw_priv); + f_dev = &fw_priv->dev; + +device_initialize (f_dev);dev_set_name (f_dev,"%s" ,dev_name (device)); f_dev->parent = device; f_dev->class = &firmware_class; -dev_set_drvdata (f_dev, fw_priv); -dev_set_uevent_suppress (f_dev,1 ); - retval =device_register (f_dev); -if (retval) { -dev_err (device,"%s: device_register failed\n" , __func__); -put_device (f_dev); -return retval; - } - *dev_p = f_dev; -return 0 ; - -error_kfree: -kfree (f_dev); -kfree (fw_priv); -return retval; -} -static int fw_setup_device (struct firmware *fw,struct device **dev_p, -const char *fw_name,struct device *device, -int uevent,bool nowait) -{ -struct device *f_dev; -struct firmware_priv *fw_priv; -int retval; - - *dev_p =NULL ; - retval =fw_register_device (&f_dev, fw_name, device); -if (retval) - goto out; +dev_set_uevent_suppress (f_dev, true);/* Need to pin this module until class device is destroyed */ __module_get (THIS_MODULE ); - fw_priv =dev_get_drvdata (f_dev); - - fw_priv->nowait = nowait; + error =device_add (f_dev); +if (error) { +dev_err (device,"%s: device_register failed\n" , __func__); + goto err_put_dev; + } - fw_priv->fw = fw; - retval =sysfs_create_bin_file (&f_dev->kobj, &firmware_attr_data); -if (retval) { + error =device_create_bin_file (f_dev, &firmware_attr_data); +if (error) {dev_err (device,"%s: sysfs_create_bin_file failed\n" , __func__); - goto error_unreg; + goto err_del_dev; } - retval =device_create_file (f_dev, &dev_attr_loading); -if (retval) { + error =device_create_file (f_dev, &dev_attr_loading); +if (error) {dev_err (device,"%s: device_create_file failed\n" , __func__); - goto error_unreg; + goto err_del_bin_attr; }if (uevent) -dev_set_uevent_suppress (f_dev,0 ); - *dev_p = f_dev; - goto out; +dev_set_uevent_suppress (f_dev, false); + +return fw_priv; + +err_del_bin_attr: +device_remove_bin_file (f_dev, &firmware_attr_data); +err_del_dev: +device_del (f_dev); +err_put_dev: +put_device (f_dev); +err_out: +return ERR_PTR (error); +} + +static void fw_destroy_instance (struct firmware_priv *fw_priv) +{ +struct device *f_dev = &fw_priv->dev; -error_unreg: +device_remove_file (f_dev, &dev_attr_loading); +device_remove_bin_file (f_dev, &firmware_attr_data);device_unregister (f_dev); -out: -return retval; } -static int -_request_firmware (const struct firmware **firmware_p,const char *name, -struct device *device,int uevent,bool nowait) +static int _request_firmware (const struct firmware **firmware_p, +const char *name,struct device *device, +bool uevent,bool nowait) { -struct device *f_dev;struct firmware_priv *fw_priv;struct firmware *firmware; -int retval; +int retval =0 ;if (!firmware_p)return -EINVAL ;
@@ -547,41 +537,40 @@ _request_firmware(const struct firmware **firmware_p, const char *name,if (uevent)dev_dbg (device,"firmware: requesting %s\n" , name); - retval =fw_setup_device (firmware, &f_dev, name, device, - uevent, nowait); -if (retval) - goto error_kfree_fw; - - fw_priv =dev_get_drvdata (f_dev); + fw_priv =fw_create_instance (firmware, name, device, uevent, nowait); +if (IS_ERR (fw_priv)) { + retval =PTR_ERR (fw_priv); + goto out; + }if (uevent) { -if (loading_timeout >0 ) { - fw_priv->timeout.expires = jiffies + loading_timeout *HZ ; -add_timer (&fw_priv->timeout); - } +if (loading_timeout >0 ) +mod_timer (&fw_priv->timeout, +round_jiffies_up (jiffies + + loading_timeout *HZ )); + +kobject_uevent (&fw_priv->dev.kobj,KOBJ_ADD ); + } + +wait_for_completion (&fw_priv->completion); -kobject_uevent (&f_dev->kobj,KOBJ_ADD ); -wait_for_completion (&fw_priv->completion); -set_bit (FW_STATUS_DONE , &fw_priv->status); -del_timer_sync (&fw_priv->timeout); - }else -wait_for_completion (&fw_priv->completion); +set_bit (FW_STATUS_DONE , &fw_priv->status); +del_timer_sync (&fw_priv->timeout);mutex_lock (&fw_lock); -if (!fw_priv->fw->size ||test_bit (FW_STATUS_ABORT , &fw_priv->status)) { +if (!fw_priv->fw->size ||test_bit (FW_STATUS_ABORT , &fw_priv->status)) retval = -ENOENT ; -release_firmware (fw_priv->fw); - *firmware_p =NULL ; - } fw_priv->fw =NULL ;mutex_unlock (&fw_lock); -device_unregister (f_dev); - goto out; -error_kfree_fw: -kfree (firmware); - *firmware_p =NULL ; +fw_destroy_instance (fw_priv); + out: +if (retval) { +release_firmware (firmware); + firmware_p =NULL ; + } +return retval; }
@@ -632,23 +621,24 @@ struct firmware_work {int uevent; }; -static int -request_firmware_work_func (void *arg) +static int request_firmware_work_func (void *arg) {struct firmware_work *fw_work = arg;const struct firmware *fw;int ret; +if (!arg) {WARN_ON (1 );return 0 ; } - ret =_request_firmware (&fw, fw_work->name, fw_work->device, - fw_work->uevent, true); + ret =_request_firmware (&fw, fw_work->name, fw_work->device, + fw_work->uevent, true); fw_work->cont (fw, fw_work->context);module_put (fw_work->module);kfree (fw_work); +return ret; }
@@ -676,34 +666,33 @@ request_firmware_nowait( void (*cont)(const struct firmware *fw, void *context)) {struct task_struct *task; -struct firmware_work *fw_work =kmalloc (sizeof (struct firmware_work ), - gfp); +struct firmware_work *fw_work; + fw_work =kzalloc (sizeof (struct firmware_work ), gfp);if (!fw_work)return -ENOMEM ; + + fw_work->module = module; + fw_work->name = name; + fw_work->device = device; + fw_work->context = context; + fw_work->cont = cont; + fw_work->uevent = uevent; +if (!try_module_get (module)) {kfree (fw_work);return -EFAULT ; } - *fw_work = (struct firmware_work ) { - .module = module, - .name = name, - .device = device, - .context = context, - .cont = cont, - .uevent = uevent, - }; - task =kthread_run (request_firmware_work_func, fw_work,"firmware/%s" , name); -if (IS_ERR (task)) { fw_work->cont (NULL , fw_work->context);module_put (fw_work->module);kfree (fw_work);return PTR_ERR (task); } +return 0 ; }
Signature · 1 line
1.7.2
PATCH 9/28 Driver core: use kmemdup in platform_device_add_resources
In reply to Greg KHFrom: Uwe Kleine-König <[email protected]>
This makes platform_device_add_resources look like platform_device_add_data.
--- drivers/base/platform.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
drivers/base/platform.c +3 -3
@@ -191,13 +191,13 @@ int platform_device_add_resources(struct platform_device *pdev, {struct resource *r; - r =kmalloc (sizeof (struct resource ) * num,GFP_KERNEL ); + r =kmemdup (res,sizeof (struct resource ) * num,GFP_KERNEL );if (r) { -memcpy (r, res,sizeof (struct resource ) * num); pdev->resource = r; pdev->num_resources = num; +return 0 ; } -return r ?0 : -ENOMEM ; +return -ENOMEM ; }EXPORT_SYMBOL_GPL (platform_device_add_resources);
Signature · 1 line
1.7.2
PATCH 10/28 Driver core: reduce duplicated code for platform_device creation
In reply to Greg KHFrom: Uwe Kleine-König <[email protected]>
This makes the two similar functions platform_device_register_simple and platform_device_register_data one line inline functions using a new generic function platform_device_register_resndata.
--- Documentation/DocBook/device-drivers.tmpl | 1 + drivers/base/platform.c | 104 +++++++--------------------- include/linux/platform_device.h | 62 ++++++++++++++++- 3 files changed, 85 insertions(+), 82 deletions(-)
Documentation/DocBook/device-drivers.tmpl +1 -0
@@ -111,6 +111,7 @@ X!Edrivers/base/attribute_container.c <!-- X!Edrivers/base/interface.c --> +!Iinclude/linux/platform_device.h !Edrivers/base/platform.c !Edrivers/base/bus.c </sect1>
drivers/base/platform.c +26 -78
134 lines not on this page · raw message
include/linux/platform_device.h +58 -4
68 lines not on this page · raw message
Signature · 1 line
1.7.2
PATCH 11/28 Driver core: move platform device creation helpers to .init.text (if MODULE=n)
In reply to Greg KHFrom: Uwe Kleine-König <[email protected]>
Platform devices should only be called by init code, so it should be possible to move creation helpers to .init.text -- at least if modules are disabled.
--- drivers/base/platform.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/platform.c +1 -1
@@ -357,7 +357,7 @@ EXPORT_SYMBOL_GPL(platform_device_unregister);* * Returns &struct platform_device pointer on success, or ERR_PTR() on error. */ -struct platform_device *platform_device_register_resndata( +struct platform_device *__init_or_module platform_device_register_resndata( struct device *parent, const char *name, int id, const struct resource *res, unsigned int num,
Signature · 1 line
1.7.2
PATCH 12/28 firmware: Update hotplug script
In reply to Greg KHFrom: Magnus Damm <[email protected]>
Update the in-kernel hotplug example script to work properly with recent kernels. Without this fix the script may load the firmware twice - both at "add" and "remove" time.
The second load only triggers in the case when multiple firmware images are used. A good example is the b43 driver which does not work properly without this fix.
--- Documentation/firmware_class/hotplug-script | 17 +++++++++-------- 1 files changed, 9 insertions(+), 8 deletions(-)
Documentation/firmware_class/hotplug-script +9 -8
@@ -6,11 +6,12 @@ HOTPLUG_FW_DIR=/usr/lib/hotplug/firmware/ -echo 1 > /sys/$DEVPATH/loading -cat $HOTPLUG_FW_DIR/$FIRMWARE > /sys/$DEVPATH/data -echo 0 > /sys/$DEVPATH/loading - -# To cancel the load in case of error: -# -# echo -1 > /sys/$DEVPATH/loading -# +if [ "$SUBSYSTEM" == "firmware" -a "$ACTION" == "add" ]; then + if [ -f $HOTPLUG_FW_DIR/$FIRMWARE ]; then + echo 1 > /sys/$DEVPATH/loading + cat $HOTPLUG_FW_DIR/$FIRMWARE > /sys/$DEVPATH/data + echo 0 > /sys/$DEVPATH/loading + else + echo -1 > /sys/$DEVPATH/loading + fi +fi
Signature · 1 line
1.7.2
PATCH 13/28 sysfs: sysfs_chmod_file's attr can be const
In reply to Greg KHFrom: Jean Delvare <[email protected]>
sysfs_chmod_file doesn't change the attribute it operates on, so this attribute can be marked const.
--- fs/sysfs/file.c | 3 ++- include/linux/sysfs.h | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-)
fs/sysfs/file.c +2 -1
@@ -593,7 +593,8 @@ EXPORT_SYMBOL_GPL(sysfs_add_file_to_group);* @mode: file permissions. * */ -int sysfs_chmod_file (struct kobject *kobj,struct attribute *attr,mode_t mode) +int sysfs_chmod_file (struct kobject *kobj,const struct attribute *attr, +mode_t mode) {struct sysfs_dirent *sd;struct iattr newattrs;
include/linux/sysfs.h +3 -3
@@ -136,8 +136,8 @@ int __must_check sysfs_create_file(struct kobject *kobj, const struct attribute *attr);int __must_check sysfs_create_files (struct kobject *kobj,const struct attribute **attr); -int __must_check sysfs_chmod_file (struct kobject *kobj,struct attribute *attr, -mode_t mode); +int __must_check sysfs_chmod_file (struct kobject *kobj, +const struct attribute *attr,mode_t mode);void sysfs_remove_file (struct kobject *kobj,const struct attribute *attr);void sysfs_remove_files (struct kobject *kobj,const struct attribute **attr);
@@ -225,7 +225,7 @@ static inline int sysfs_create_files(struct kobject *kobj, }static inline int sysfs_chmod_file (struct kobject *kobj, -struct attribute *attr,mode_t mode) +const struct attribute *attr,mode_t mode) {return 0 ; }
Signature · 1 line
1.7.2
PATCH 14/28 dmi-id: fix a memory leak in dmi_id_init error path
In reply to Greg KHFrom: Axel Lin <[email protected]>
This patch adds a missing kfree(dmi_dev) in dmi_id_init error path.
--- drivers/firmware/dmi-id.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
drivers/firmware/dmi-id.c +3 -1
@@ -229,10 +229,12 @@ static int __init dmi_id_init(void) ret =device_register (dmi_dev);if (ret) - goto fail_class_unregister; + goto fail_free_dmi_dev;return 0 ; +fail_free_dmi_dev: +kfree (dmi_dev); fail_class_unregister:class_unregister (&dmi_class);
Signature · 1 line
1.7.2
PATCH 15/28 dcdbas: remove a redundant smi_data_buf_free in dcdbas_exit
In reply to Greg KHFrom: Axel Lin <[email protected]>
smi_data_buf_free is called twice in current implementation.
The second call simply return because smi_data_buf is set to NULL in first call. This patch removes the second smi_data_buf_free call.
--- drivers/firmware/dcdbas.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
drivers/firmware/dcdbas.c +2 -3
@@ -634,9 +634,6 @@ static void __exit dcdbas_exit(void)* before platform_device_unregister */ unregister_reboot_notifier (&dcdbas_reboot_nb); -smi_data_buf_free (); -platform_device_unregister (dcdbas_pdev); -platform_driver_unregister (&dcdbas_driver);/* * We have to free the buffer here instead of dcdbas_remove
@@ -645,6 +642,8 @@ static void __exit dcdbas_exit(void)* released. */ smi_data_buf_free (); +platform_device_unregister (dcdbas_pdev); +platform_driver_unregister (&dcdbas_driver); }module_init (dcdbas_init);
Signature · 1 line
1.7.2
PATCH 16/28 sysfs: fix discrepancies between implementation and documentation
In reply to Greg KHFrom: Bart Van Assche <[email protected]>
Fix all discrepancies I know of between the sysfs implementation and its documentation.
--- Documentation/filesystems/sysfs.txt | 44 +++++++++++++++++++--------------- 1 files changed, 25 insertions(+), 19 deletions(-)
Documentation/filesystems/sysfs.txt +25 -19
@@ -4,7 +4,7 @@ sysfs - _The_ filesystem for exporting kernel objects. Patrick Mochel <[email protected]> Mike Murphy <[email protected]> -Revised: 22 February 2009 +Revised: 10 July 2010 Original: 10 January 2003
@@ -124,7 +124,7 @@ show and store methods of the attribute owners. struct sysfs_ops { ssize_t (*show)(struct kobject *, struct attribute *, char *); - ssize_t (*store)(struct kobject *, struct attribute *, const char *); + ssize_t (*store)(struct kobject *, struct attribute *, const char *, size_t); }; [ Subsystems should have already defined a struct kobj_type as a
@@ -139,18 +139,22 @@ calls the associated methods. To illustrate: +#define to_dev(obj) container_of(obj, struct device, kobj) #define to_dev_attr(_attr) container_of(_attr, struct device_attribute, attr) -#define to_dev(d) container_of(d, struct device, kobj) -static ssize_t -dev_attr_show(struct kobject * kobj, struct attribute * attr, char * buf) +static ssize_t dev_attr_show(struct kobject *kobj, struct attribute *attr, + char *buf) { - struct device_attribute * dev_attr = to_dev_attr(attr); - struct device * dev = to_dev(kobj); - ssize_t ret = 0; + struct device_attribute *dev_attr = to_dev_attr(attr); + struct device *dev = to_dev(kobj); + ssize_t ret = -EIO; if (dev_attr->show) - ret = dev_attr->show(dev, buf); + ret = dev_attr->show(dev, dev_attr, buf); + if (ret >= (ssize_t)PAGE_SIZE) { + print_symbol("dev_attr_show: %s returned bad count\n", + (unsigned long)dev_attr->show); + } return ret; }
@@ -163,10 +167,9 @@ To read or write attributes, show() or store() methods must be specified when declaring the attribute. The method types should be as simple as those defined for device attributes: -ssize_t (*show)(struct device * dev, struct device_attribute * attr, - char * buf); -ssize_t (*store)(struct device * dev, struct device_attribute * attr, - const char * buf); +ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf); +ssize_t (*store)(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count); IOW, they should take only an object, an attribute, and a buffer as parameters.
@@ -209,8 +212,8 @@ Other notes: - show() should always use snprintf(). -- store() should return the number of bytes used from the buffer. This - can be done using strlen(). +- store() should return the number of bytes used from the buffer. If the + entire buffer has been used, just return the count argument. - show() or store() can always return errors. If a bad value comes through, be sure to return an error.
@@ -223,15 +226,18 @@ Other notes: A very simple (and naive) implementation of a device attribute is: -static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) +static ssize_t show_name(struct device *dev, struct device_attribute *attr, + char *buf) { return snprintf(buf, PAGE_SIZE, "%s\n", dev->name); } -static ssize_t store_name(struct device * dev, const char * buf) +static ssize_t store_name(struct device *dev, struct device_attribute *attr, + const char *buf, size_t count) { - sscanf(buf, "%20s", dev->name); - return strnlen(buf, PAGE_SIZE); + snprintf(dev->name, sizeof(dev->name), "%.*s", + (int)min(count, sizeof(dev->name) - 1), buf); + return count; } static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
Signature · 1 line
1.7.2
PATCH 17/28 sysfs: Fix one more signature discrepancy between sysfs implementation and docs.
In reply to Greg KHFrom: Ira Weiny <[email protected]>
--- Documentation/filesystems/sysfs.txt | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
Documentation/filesystems/sysfs.txt +2 -2
@@ -4,7 +4,7 @@ sysfs - _The_ filesystem for exporting kernel objects. Patrick Mochel <[email protected]> Mike Murphy <[email protected]> -Revised: 10 July 2010 +Revised: 15 July 2010 Original: 10 January 2003
@@ -333,7 +333,7 @@ Structure: struct bus_attribute { struct attribute attr; ssize_t (*show)(struct bus_type *, char * buf); - ssize_t (*store)(struct bus_type *, const char * buf); + ssize_t (*store)(struct bus_type *, const char * buf, size_t count); }; Declaring:
Signature · 1 line
1.7.2
PATCH 18/28 debugfs: no longer needs to depend on SYSFS
In reply to Greg KHFrom: Randy Dunlap <[email protected]>
debugfs no longer uses 'kernel_subsys' (which is gone), and other kernel/ksysfs.c code is always built, so DEBUG_FS does not need to depend on SYSFS.
Fixes this kconfig warning:
warning: (TREE_RCU_TRACE || AMD_IOMMU_STATS && AMD_IOMMU || MTD_UBI_DEBUG && MTD && SYSFS && MTD_UBI || UBIFS_FS_DEBUG && MISC_FILESYSTEMS && UBIFS_FS || DEBUG_KMEMLEAK && DEBUG_KERNEL && EXPERIMENTAL && !MEMORY_HOTPLUG && (X86 || ARM || PPC || S390 || SPARC64 || SUPERH || MICROBLAZE) && SYSFS || TRACING || X86_PTDUMP && DEBUG_KERNEL || BLK_DEV_IO_TRACE && TRACING_SUPPORT && FTRACE && SYSFS && BLOCK) selects DEBUG_FS which has unmet direct dependencies (SYSFS)
--- lib/Kconfig.debug | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
lib/Kconfig.debug +0 -1
@@ -76,7 +76,6 @@ config UNUSED_SYMBOLS config DEBUG_FS bool "Debug Filesystem" - depends on SYSFS help debugfs is a virtual file system that kernel developers use to put debugging files into. Enable this option to be able to read and
Signature · 1 line
1.7.2
PATCH 19/28 driver core: fix memory leak on one error path in bus_register()
In reply to Greg KHFrom: Jike Song <[email protected]>
--- drivers/base/bus.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/bus.c +1 -1
@@ -945,8 +945,8 @@ bus_devices_fail:bus_remove_file (bus, &bus_attr_uevent); bus_uevent_fail:kset_unregister (&bus->p->subsys); -kfree (bus->p); out: +kfree (bus->p); bus->p =NULL ;return retval; }
Signature · 1 line
1.7.2
PATCH 20/28 Driver core: Add BUS_NOTIFY_BIND_DRIVER
In reply to Greg KHFrom: Magnus Damm <[email protected]>
Add BUS_NOTIFY_BIND_DRIVER as a bus notifier event.
For driver binding/unbinding we with this in place have the following bus notifier events:
- BUS_NOTIFY_BIND_DRIVER - before ->probe()
- BUS_NOTIFY_BOUND_DRIVER - after ->probe()
- BUS_NOTIFY_UNBIND_DRIVER - before ->remove()
- BUS_NOTIFY_UNBOUND_DRIVER - after ->remove()
The event BUS_NOTIFY_BIND_DRIVER allows bus code to be notified that ->probe() is about to be called.
Useful for bus code that needs to setup hardware before the driver gets to run. With this in place platform drivers can be loaded and unloaded as modules and the new BIND event allows bus code to control for instance device clocks that must be enabled before the driver can be executed.
Without this patch there is no way for the bus code to get notified that a modular driver is about to be probed.
--- drivers/base/dd.c | 4 ++++ include/linux/device.h | 8 +++++--- 2 files changed, 9 insertions(+), 3 deletions(-)
drivers/base/dd.c +4 -0
@@ -51,6 +51,10 @@ static int driver_sysfs_add(struct device *dev) {int ret; +if (dev->bus) +blocking_notifier_call_chain (&dev->bus->p->bus_notifier, +BUS_NOTIFY_BIND_DRIVER , dev); + ret =sysfs_create_link (&dev->driver->p->kobj, &dev->kobj,kobject_name (&dev->kobj));if (ret ==0 ) {
include/linux/device.h +5 -3
@@ -109,10 +109,12 @@ extern int bus_unregister_notifier(struct bus_type *bus,*/ #define BUS_NOTIFY_ADD_DEVICE 0x00000001/* device added */ #define BUS_NOTIFY_DEL_DEVICE 0x00000002/* device removed */ -#define BUS_NOTIFY_BOUND_DRIVER 0x00000003/* driver bound to device */ -#define BUS_NOTIFY_UNBIND_DRIVER 0x00000004/* driver about to be +#define BUS_NOTIFY_BIND_DRIVER 0x00000003/* driver about to be +bound */ +#define BUS_NOTIFY_BOUND_DRIVER 0x00000004/* driver bound to device */ +#define BUS_NOTIFY_UNBIND_DRIVER 0x00000005/* driver about to be unbound */ -#define BUS_NOTIFY_UNBOUND_DRIVER 0x00000005/* driver is unbound +#define BUS_NOTIFY_UNBOUND_DRIVER 0x00000006/* driver is unbound from the device */ extern struct kset *bus_get_kset (struct bus_type *bus);
Signature · 1 line
1.7.2
PATCH 21/28 cgroupfs: create /sys/fs/cgroup to mount cgroupfs on
In reply to Greg KHFrom: Greg KH <[email protected]>
We really shouldn't be asking userspace to create new root filesystems. So follow along with all of the other in-kernel filesystems, and provide a mount point in sysfs.
For cgroupfs, this should be in /sys/fs/cgroup/ This change provides that mount point when the cgroup filesystem is registered in the kernel.
--- kernel/cgroup.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-)
kernel/cgroup.c +12 -1
@@ -1623,6 +1623,8 @@ static struct file_system_type cgroup_fs_type = { .kill_sb = cgroup_kill_sb, }; +static struct kobject *cgroup_kobj; +static inline struct cgroup *__d_cgrp (struct dentry *dentry) {return dentry->d_fsdata;
@@ -3894,9 +3896,18 @@ int __init cgroup_init(void) hhead =css_set_hash (init_css_set.subsys);hlist_add_head (&init_css_set.hlist, hhead);BUG_ON (!init_root_id (&rootnode)); + + cgroup_kobj =kobject_create_and_add ("cgroup" , fs_kobj); +if (!cgroup_kobj) { + err = -ENOMEM ; + goto out; + } + err =register_filesystem (&cgroup_fs_type); -if (err <0 ) +if (err <0 ) { +kobject_put (cgroup_kobj); goto out; + }proc_create ("cgroups" ,0 ,NULL , &proc_cgroupstats_operations);
Signature · 1 line
1.7.2
PATCH 22/28 scsi: Remove owner field from attribute initialization in LPFC driver
In reply to Greg KHFrom: Guenter Roeck <[email protected]>
--- drivers/scsi/lpfc/lpfc_attr.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +0 -1
@@ -2778,7 +2778,6 @@ static struct bin_attribute sysfs_drvr_stat_data_attr = { .attr = { .name = "lpfc_drvr_stat_data", .mode = S_IRUSR, - .owner = THIS_MODULE, }, .size = LPFC_MAX_TARGET * MAX_STAT_DATA_SIZE_PER_TARGET, .read = sysfs_drvr_stat_data_read,
Signature · 1 line
1.7.2
PATCH 23/28 scsi: Remove owner field from attribute initialization in ARCMSR driver
In reply to Greg KHFrom: Guenter Roeck <[email protected]>
--- drivers/scsi/arcmsr/arcmsr_attr.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-)
drivers/scsi/arcmsr/arcmsr_attr.c +0 -3
@@ -192,7 +192,6 @@ static struct bin_attribute arcmsr_sysfs_message_read_attr = { .attr = { .name = "mu_read", .mode = S_IRUSR , - .owner = THIS_MODULE, }, .size = 1032, .read = arcmsr_sysfs_iop_message_read,
@@ -202,7 +201,6 @@ static struct bin_attribute arcmsr_sysfs_message_write_attr = { .attr = { .name = "mu_write", .mode = S_IWUSR, - .owner = THIS_MODULE, }, .size = 1032, .write = arcmsr_sysfs_iop_message_write,
@@ -212,7 +210,6 @@ static struct bin_attribute arcmsr_sysfs_message_clear_attr = { .attr = { .name = "mu_clear", .mode = S_IWUSR, - .owner = THIS_MODULE, }, .size = 1, .write = arcmsr_sysfs_iop_message_clear,
Signature · 1 line
1.7.2
PATCH 24/28 leds: Remove owner field from attribute initialization in bd2802 driver
In reply to Greg KHFrom: Guenter Roeck <[email protected]>
--- drivers/leds/leds-bd2802.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-)
drivers/leds/leds-bd2802.c +1 -3
@@ -351,7 +351,7 @@ static ssize_t bd2802_store_reg##reg_addr(struct device *dev, \return count; \ } \ static struct device_attribute bd2802_reg##reg_addr##_attr = { \ - .attr = {.name = reg_name, .mode = 0644, .owner = THIS_MODULE}, \ + .attr = {.name = reg_name, .mode = 0644}, \ .store = bd2802_store_reg##reg_addr, \ };
@@ -482,7 +482,6 @@ static struct device_attribute bd2802_adv_conf_attr = { .attr = { .name = "advanced_configuration", .mode = 0644, - .owner =THIS_MODULE }, .show = bd2802_show_adv_conf, .store = bd2802_store_adv_conf,
@@ -519,7 +518,6 @@ static struct device_attribute bd2802_##attr_name##_attr = { \ .attr = { \ .name = name_str, \ .mode = 0644, \ - .owner = THIS_MODULE \ }, \ .show = bd2802_show_##attr_name, \ .store = bd2802_store_##attr_name, \
Signature · 1 line
1.7.2
PATCH 25/28 regulator: Remove owner field from attribute initialization in regulator core driver
In reply to Greg KHFrom: Guenter Roeck <[email protected]>
--- drivers/regulator/core.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
drivers/regulator/core.c +0 -1
@@ -1025,7 +1025,6 @@ static struct regulator *create_regulator(struct regulator_dev *rdev,if (regulator->dev_attr.attr.name ==NULL ) goto attr_name_err; - regulator->dev_attr.attr.owner =THIS_MODULE ; regulator->dev_attr.attr.mode =0444 ; regulator->dev_attr.show = device_requested_uA_show; err =device_create_file (dev, ®ulator->dev_attr);
Signature · 1 line
1.7.2
PATCH 26/28 powerpc/pci: Remove owner field from attribute initialization in PCI bridge init
In reply to Greg KHFrom: Guenter Roeck <[email protected]>
--- arch/powerpc/sysdev/mv64x60_pci.c | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
arch/powerpc/sysdev/mv64x60_pci.c +0 -1
@@ -73,7 +73,6 @@ static struct bin_attribute mv64x60_hs_reg_attr = { /* Hotswap register */ .attr = { .name = "hs_reg", .mode = S_IRUGO | S_IWUSR, - .owner = THIS_MODULE, }, .size = MV64X60_VAL_LEN_MAX, .read = mv64x60_hs_reg_read,
Signature · 1 line
1.7.2
PATCH 27/28 sysfs: Remove owner field from sysfs struct attribute
In reply to Greg KHFrom: Guenter Roeck <[email protected]>
--- include/linux/sysfs.h | 6 ------ 1 files changed, 0 insertions(+), 6 deletions(-)
include/linux/sysfs.h +0 -6
@@ -22,14 +22,8 @@ struct kobject;struct module ;enum kobj_ns_type ; -/* FIXME -* The *owner field is no longer used. -* x86 tree has been cleaned up. The owner -* attribute is still left for other arches. -*/ struct attribute {const char *name; -struct module *owner;mode_t mode;#ifdef CONFIG_DEBUG_LOCK_ALLOC struct lock_class_key *key;
Signature · 1 line
1.7.2
PATCH 28/28 driver core: device_rename's new_name can be const
In reply to Greg KHFrom: Johannes Berg <[email protected]>
The new_name argument to device_rename() can be
const as kobject_rename's new_name argument is.
--- drivers/base/core.c | 2 +- include/linux/device.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/base/core.c +1 -1
@@ -1599,7 +1599,7 @@ EXPORT_SYMBOL_GPL(device_destroy);* on the same device to ensure that new_name is valid and * won't conflict with other devices. */ -int device_rename (struct device *dev,char *new_name) +int device_rename (struct device *dev,const char *new_name) {char *old_class_name =NULL ;char *new_class_name =NULL ;
include/linux/device.h +1 -1
@@ -552,7 +552,7 @@ extern int device_for_each_child(struct device *dev, void *data, int (*fn)(struct device *dev, void *data));extern struct device *device_find_child (struct device *dev,void *data,int (*match)(struct device *dev,void *data)); -extern int device_rename (struct device *dev,char *new_name); +extern int device_rename (struct device *dev,const char *new_name);extern int device_move (struct device *dev,struct device *new_parent,enum dpm_order dpm_order); extern const char *device_get_devnode(struct device *dev,
Signature · 1 line
1.7.2