driver core patches for your 2.6-git tree
Subsystems (48)
PATCH 1/1 driver core patches for your 2.6-git tree
Here is the driver core patchset for your 2.6-git tree.
Highlights include:
- device_create_drvdata is finally removed as it's no longer used, device_create is all that is needed. This went through a 2 kernel release cycle to flush everything out properly.
- dynamic dev_printk() patch, allows debugging to be turned on the fly, instead of at build time. This is very good and has been in the opensuse beta releases already with much success.
- the usb gadget drivers had to be reworked to fix linker errors that the dynamic dev_printk() patches exposed. They are in this tree as the dev_printk() patches require them in order to not break the build.
- uio cleanups and a new uio driver
- sysfs field added to oops messages from Andrew. This has been in the -mm tree for years and in the SuSE kernel releases for almost the same ammount of time and has been very helpful.
- minor bugfixes all over the place
All of these have been in the -next trees and the -mm releases for a while now.
Please pull from:
master.kernel.org:/pub/scm/linux/kernel/git/gregkh/driver-core-2.6.git/
The patches will be sent as a follow-on to this message to lkml for people to see.
thanks,
greg k-h
------------
Documentation/kernel-parameters.txt | 5 + Documentation/kobject.txt | 4 + arch/mips/kernel/rtlx.c | 4 +- arch/mips/sibyte/common/sb_tbprof.c | 3 +- arch/x86/kernel/cpuid.c | 4 +- arch/x86/kernel/dumpstack_32.c | 2 + arch/x86/kernel/dumpstack_64.c | 2 + arch/x86/kernel/msr.c | 4 +- block/bsg.c | 3 +- drivers/base/bus.c | 54 +++- drivers/base/core.c | 30 ++- drivers/base/dd.c | 3 + drivers/base/platform.c | 49 +++- drivers/base/power/main.c | 2 +- drivers/block/aoe/aoechr.c | 6 +- drivers/block/paride/pg.c | 5 +- drivers/block/paride/pt.c | 10 +- drivers/block/pktcdvd.c | 5 +- drivers/char/bsr.c | 5 +- drivers/char/dsp56k.c | 4 +- drivers/char/ip2/ip2main.c | 12 +- drivers/char/ipmi/ipmi_devintf.c | 2 +- drivers/char/istallion.c | 5 +- drivers/char/lp.c | 4 +- drivers/char/mem.c | 6 +- drivers/char/misc.c | 4 +- drivers/char/pcmcia/cm4000_cs.c | 2 +- drivers/char/pcmcia/cm4040_cs.c | 3 +- drivers/char/ppdev.c | 5 +- drivers/char/raw.c | 7 +- drivers/char/snsc.c | 4 +- drivers/char/stallion.c | 4 +- drivers/char/tty_io.c | 2 +- drivers/char/vc_screen.c | 12 +- drivers/char/viotape.c | 8 +- drivers/char/xilinx_hwicap/xilinx_hwicap.c | 3 +- drivers/dca/dca-sysfs.c | 8 +- drivers/firmware/iscsi_ibft.c | 18 +- drivers/hid/hidraw.c | 5 +- drivers/hwmon/hwmon.c | 4 +- drivers/i2c/i2c-dev.c | 6 +- drivers/ide/ide-probe.c | 4 +- drivers/ide/ide-tape.c | 11 +- drivers/ieee1394/dv1394.c | 8 +- drivers/ieee1394/raw1394.c | 8 +- drivers/ieee1394/video1394.c | 5 +- drivers/infiniband/core/cm.c | 6 +- drivers/infiniband/core/user_mad.c | 12 +- drivers/infiniband/core/uverbs_main.c | 9 +- drivers/infiniband/hw/ipath/ipath_file_ops.c | 2 +- drivers/isdn/capi/capi.c | 3 +- drivers/leds/led-class.c | 4 +- drivers/macintosh/adb.c | 3 +- drivers/media/dvb/dvb-core/dvbdev.c | 2 +- drivers/misc/phantom.c | 6 +- drivers/mtd/mtdchar.c | 10 +- drivers/net/phy/phy_device.c | 8 +- drivers/net/ppp_generic.c | 4 +- drivers/net/wan/cosa.c | 4 +- drivers/net/wireless/mac80211_hwsim.c | 6 +- drivers/pci/probe.c | 50 +--- drivers/pnp/base.h | 2 +- drivers/pnp/core.c | 10 +- drivers/pnp/driver.c | 1 + drivers/pnp/interface.c | 37 +-- drivers/power/power_supply_core.c | 4 +- drivers/s390/char/raw3270.c | 14 +- drivers/s390/char/tape_class.c | 6 +- drivers/s390/char/vmlogrdr.c | 8 +- drivers/s390/char/vmur.c | 5 +- drivers/scsi/ch.c | 6 +- drivers/scsi/dpt_i2o.c | 2 +- drivers/scsi/osst.c | 3 +- drivers/scsi/sg.c | 10 +- drivers/scsi/st.c | 11 +- drivers/spi/spidev.c | 7 +- drivers/uio/Kconfig | 13 + drivers/uio/Makefile | 1 + drivers/uio/uio.c | 26 ++- drivers/uio/uio_pdrv.c | 2 +- drivers/uio/uio_sercos3.c | 243 +++++++++++++++ drivers/usb/core/devio.c | 6 +- drivers/usb/core/file.c | 6 +- drivers/usb/core/hcd.c | 5 +- drivers/usb/gadget/Makefile | 23 +- drivers/usb/gadget/cdc2.c | 25 ++- drivers/usb/gadget/ether.c | 28 ++- drivers/usb/gadget/f_ecm.c | 108 ++++---- drivers/usb/gadget/f_loopback.c | 34 ++- drivers/usb/gadget/f_subset.c | 44 ++-- drivers/usb/gadget/file_storage.c | 12 + drivers/usb/gadget/gmidi.c | 15 + drivers/usb/gadget/printer.c | 18 +- drivers/usb/gadget/rndis.c | 115 ++++---- drivers/usb/gadget/serial.c | 18 ++ drivers/usb/gadget/u_ether.c | 4 +- drivers/usb/gadget/zero.c | 17 + drivers/usb/host/uhci-q.c | 24 +- drivers/usb/misc/phidgetkit.c | 5 +- drivers/usb/misc/phidgetmotorcontrol.c | 5 +- drivers/usb/misc/phidgetservo.c | 5 +- drivers/usb/mon/mon_bin.c | 6 +- drivers/video/console/fbcon.c | 4 +- drivers/video/display/display-sysfs.c | 9 +- drivers/video/fbmem.c | 5 +- fs/coda/psdev.c | 5 +- fs/sysfs/bin.c | 42 ++- fs/sysfs/dir.c | 24 +- fs/sysfs/file.c | 46 ++- fs/sysfs/mount.c | 15 + fs/sysfs/sysfs.h | 6 +- include/asm-generic/vmlinux.lds.h | 10 +- include/linux/device.h | 18 +- include/linux/dynamic_printk.h | 93 ++++++ include/linux/kernel.h | 7 +- include/linux/module.h | 1 - include/linux/platform_device.h | 2 + include/linux/sysfs.h | 36 ++- kernel/module.c | 33 ++- lib/Kconfig.debug | 55 ++++ lib/Makefile | 2 + lib/dynamic_printk.c | 418 ++++++++++++++++++++++++++ lib/kobject.c | 35 ++- net/netfilter/nf_conntrack_pptp.c | 2 +- scripts/Makefile.lib | 11 +- scripts/basic/Makefile | 2 +- scripts/basic/hash.c | 64 ++++ sound/core/init.c | 6 +- sound/core/sound.c | 5 +- sound/oss/soundcard.c | 15 +- sound/sound_core.c | 5 +- 131 files changed, 1786 insertions(+), 617 deletions(-) create mode 100644 drivers/uio/uio_sercos3.c create mode 100644 include/linux/dynamic_printk.h create mode 100644 lib/dynamic_printk.c create mode 100644 scripts/basic/hash.c
---------------
Adrian Bunk (2):
driver core: make struct platform_pm_ops static drivers/firmware/iscsi_ibft.c: make 3 functions static
Alexey Dobriyan (1):
modules: fix module "notes" kobject leak
Andrew G. Harvey (1):
UIO: Fix mapping of logical and virtual memory
Andrew Morton (1):
sysfs: crash debugging
Arjan van de Ven (4):
device model: Do a quickcheck for driver binding before doing an expensive check
debug: Introduce a dev_WARN() function
debug: use dev_WARN() rather than WARN_ON() in device_pm_add()
usb: turn dev_warn+WARN_ON combos into dev_WARN
Cornelia Huck (2):
Driver core: Clarify device cleanup. Driver core: Fix cleanup in device_create_vargs().
David Brownell (7):
usb gadget: link fixes for serial gadget usb gadget: link fixes for gadget zero usb gadget: link fixes for MIDI gadget usb gadget: link fixes for printer gadget usb gadget: link fixes for storage gadget usb gadget: link fixes for cdc composite gadget usb gadget: link fixes for network gadget
Dmitry Baryshkov (1):
platform: add new device registration helper
Drew Moseley (1):
PNP: create device attributes via default device attributes
Eric W. Biederman (2):
kobject: Fix kobject_rename and !CONFIG_SYSFS
kobject: Cleanup kobject_rename and !CONFIG_SYSFS
Greg Kroah-Hartman (15):
device create: block: convert device_create_drvdata to device_create device create: char: convert device_create_drvdata to device_create device create: ieee1394: convert device_create_drvdata to device_create device create: infiniband: convert device_create_drvdata to device_create device create: misc: convert device_create_drvdata to device_create device create: net: convert device_create_drvdata to device_create device create: s390: convert device_create_drvdata to device_create device create: scsi: convert device_create_drvdata to device_create device create: sound: convert device_create_drvdata to device_create device create: usb: convert device_create_drvdata to device_create device create: video: convert device_create_drvdata to device_create device create: ide: convert device_create_drvdata to device_create device create: remove device_create_drvdata
NET: convert the phy_device file to use bus_find_device_by_name Driver core: add bus_sort_breadthfirst() function
Hans J. Koch (2):
UIO: Add alignment warnings for uio-mem
UIO: Change driver name of uio_pdrv
Jason Baron (1):
driver core: basic infrastructure for per-module dynamic debug messages
John Ogness (1):
UIO: add automata sercos3 pci card support
Neil Brown (1):
sysfs: Support sysfs_notify from atomic context with new sysfs_notify_dirent
Nick Piggin (1):
sysfs: fix deadlock
Peter Korsgaard (1):
Driver core: make bus_find_device_by_name() more robust
Tejun Heo (1):
sysfs: use ilookup5() instead of ilookup5_nowait()
Trent Piepho (1):
sysfs: Make dir and name args to sysfs_notify() const
PATCH 1/46 modules: fix module "notes" kobject leak
From: Alexey Dobriyan <[email protected]>
Fix "notes" kobject leak
It happens every rmmod if KALLSYMS=y and SYSFS=y.
# modprobe foo
kobject: 'foo' (ffffffffa00743d0): kobject_add_internal: parent: 'module', set: 'module'
kobject: 'holders' (ffff88017e7c5770): kobject_add_internal: parent: 'foo', set: '<NULL>'
kobject: 'foo' (ffffffffa00743d0): kobject_uevent_env
kobject: 'foo' (ffffffffa00743d0): fill_kobj_path: path = '/module/foo'
kobject: 'notes' (ffff88017fa9b668): kobject_add_internal: parent: 'foo', set: '<NULL>'
^^^^^ # rmmod foo
kobject: 'holders' (ffff88017e7c5770): kobject_cleanup
kobject: 'holders' (ffff88017e7c5770): auto cleanup kobject_del
kobject: 'holders' (ffff88017e7c5770): calling ktype release
kobject: (ffff88017e7c5770): dynamic_kobj_release
kobject: 'holders': free name
kobject: 'foo' (ffffffffa00743d0): kobject_cleanup
kobject: 'foo' (ffffffffa00743d0): does not have a release() function, it is broken and must be fixed.
kobject: 'foo' (ffffffffa00743d0): auto cleanup 'remove' event
kobject: 'foo' (ffffffffa00743d0): kobject_uevent_env
kobject: 'foo' (ffffffffa00743d0): fill_kobj_path: path = '/module/foo'
kobject: 'foo' (ffffffffa00743d0): auto cleanup kobject_del
kobject: 'foo': free name
[whooops]
--- kernel/module.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
kernel/module.c +1 -1
@@ -1173,7 +1173,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,while (i-- >0 )sysfs_remove_bin_file (notes_attrs->dir, ¬es_attrs->attrs[i]); -kobject_del (notes_attrs->dir); +kobject_put (notes_attrs->dir); }kfree (notes_attrs); }
Signature · 1 line
1.6.0.2
PATCH 2/46 sysfs: crash debugging
In reply to Greg KHFrom: Andrew Morton <[email protected]>
Print the name of the last-accessed sysfs file when we oops, to help track down oopses which occur in sysfs store/read handlers. Because these oopses tend to not leave any trace of the offending code in the stack traces.
--- arch/x86/kernel/dumpstack_32.c | 2 ++ arch/x86/kernel/dumpstack_64.c | 2 ++ fs/sysfs/file.c | 13 +++++++++++++ include/linux/sysfs.h | 6 ++++++ 4 files changed, 23 insertions(+), 0 deletions(-)
arch/x86/kernel/dumpstack_32.c +2 -0
@@ -13,6 +13,7 @@#include <linux/kexec.h> #include <linux/bug.h> #include <linux/nmi.h> +#include <linux/sysfs.h> #include <asm/stacktrace.h>
@@ -343,6 +344,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)printk ("DEBUG_PAGEALLOC" );#endif printk ("\n" ); +sysfs_printk_last_file ();if (notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV ) ==NOTIFY_STOP )return 1 ;
arch/x86/kernel/dumpstack_64.c +2 -0
@@ -13,6 +13,7 @@#include <linux/kexec.h> #include <linux/bug.h> #include <linux/nmi.h> +#include <linux/sysfs.h> #include <asm/stacktrace.h>
@@ -489,6 +490,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)printk ("DEBUG_PAGEALLOC" );#endif printk ("\n" ); +sysfs_printk_last_file ();if (notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV ) ==NOTIFY_STOP )return 1 ;
fs/sysfs/file.c +13 -0
@@ -19,10 +19,18 @@#include <linux/poll.h> #include <linux/list.h> #include <linux/mutex.h> +#include <linux/limits.h> #include <asm/uaccess.h> #include "sysfs.h" +/* used in crash dumps to help with debugging */ +static char last_sysfs_file[PATH_MAX ]; +void sysfs_printk_last_file (void ) +{ +printk (KERN_EMERG "last sysfs file: %s\n" , last_sysfs_file); +} +/* * There's one sysfs_buffer for each open file and one * sysfs_open_dirent for each sysfs_dirent with one or more open
@@ -328,6 +336,11 @@ static int sysfs_open_file(struct inode *inode, struct file *file)struct sysfs_buffer *buffer;struct sysfs_ops *ops;int error = -EACCES ; +char *p; + + p =d_path (&file->f_path, last_sysfs_file,sizeof (last_sysfs_file)); +if (p) +memmove (last_sysfs_file, p,strlen (p) +1 );/* need attr_sd for attr and ops, its parent for kobj */ if (!sysfs_get_active_two (attr_sd))
include/linux/sysfs.h +6 -0
@@ -119,6 +119,8 @@ void sysfs_remove_file_from_group(struct kobject *kobj,void sysfs_notify (struct kobject *kobj,char *dir,char *attr); +void sysfs_printk_last_file (void ); +extern int __must_check sysfs_init (void );#else /* CONFIG_SYSFS */
@@ -231,6 +233,10 @@ static inline int __must_check sysfs_init(void)return 0 ; } +static inline void sysfs_printk_last_file (void ) +{ +} +#endif /* CONFIG_SYSFS */ #endif /* _SYSFS_H_ */
Signature · 1 line
1.6.0.2
Re: [PATCH 02/46] sysfs: crash debugging
Quoted 81 lines · * Greg Kroah-Hartman ([email protected]) wrote:
From: Andrew Morton <[email protected]>
Print the name of the last-accessed sysfs file when we oops, to help track down oopses which occur in sysfs store/read handlers. Because these oopses tend to not leave any trace of the offending code in the stack traces.
Cc Kay Sievers <[email protected]>Cc Mathieu Desnoyers <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- arch/x86/kernel/dumpstack_32.c | 2 ++ arch/x86/kernel/dumpstack_64.c | 2 ++ fs/sysfs/file.c | 13 +++++++++++++ include/linux/sysfs.h | 6 ++++++ 4 files changed, 23 insertions(+), 0 deletions(-)arch/x86/kernel/dumpstack_32.c +2
-0@@ -13,6 +13,7 @@#include <linux/kexec.h> #include <linux/bug.h> #include <linux/nmi.h> +#include <linux/sysfs.h> #include <asm/stacktrace.h> @@ -343,6 +344,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)printk ("DEBUG_PAGEALLOC" );#endif printk ("\n" ); +sysfs_printk_last_file ();if (notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV ) ==NOTIFY_STOP )return 1 ;arch/x86/kernel/dumpstack_64.c +2
-0@@ -13,6 +13,7 @@#include <linux/kexec.h> #include <linux/bug.h> #include <linux/nmi.h> +#include <linux/sysfs.h> #include <asm/stacktrace.h> @@ -489,6 +490,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)printk ("DEBUG_PAGEALLOC" );#endif printk ("\n" ); +sysfs_printk_last_file ();if (notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV ) ==NOTIFY_STOP )return 1 ;fs/sysfs/file.c +8
-0@@ -19,10 +19,18 @@#include <linux/poll.h> #include <linux/list.h> #include <linux/mutex.h> +#include <linux/limits.h> #include <asm/uaccess.h> #include "sysfs.h" +/* used in crash dumps to help with debugging */ +static char last_sysfs_file[PATH_MAX ]; +void sysfs_printk_last_file (void ) +{ +printk (KERN_EMERG "last sysfs file: %s\n" , last_sysfs_file); +} +/* * There's one sysfs_buffer for each open file and one * sysfs_open_dirent for each sysfs_dirent with one or more open
fs/sysfs/file.c static int sysfs_open_file(struct inode *inode, struct file *file) · line 342
Quoted 7 lines
fs/sysfs/file.c +4
-0@@ -328,6 +336,11 @@ static int sysfs_open_file(struct inode *inode, struct file *file)struct sysfs_buffer *buffer;struct sysfs_ops *ops;int error = -EACCES ; +char *p; + + p =d_path (&file->f_path, last_sysfs_file,sizeof (last_sysfs_file)); +if (p)
if (!IS_ERR(p)) ?
fs/sysfs/file.c static int sysfs_open_file(struct inode *inode, struct file *file) · line 344
Quoted 2 lines
fs/sysfs/file.c +1
-0+memmove (last_sysfs_file, p,strlen (p) +1 );
Given we do a strlen() here anyway, shouldn't we just use strcpy ?
Mathieu
Quoted 29 lines
fs/sysfs/file.c +0
-0/* need attr_sd for attr and ops, its parent for kobj */ if (!sysfs_get_active_two (attr_sd))include/linux/sysfs.h +6
-0@@ -119,6 +119,8 @@ void sysfs_remove_file_from_group(struct kobject *kobj,void sysfs_notify (struct kobject *kobj,char *dir,char *attr); +void sysfs_printk_last_file (void ); +extern int __must_check sysfs_init (void );#else /* CONFIG_SYSFS */ @@ -231,6 +233,10 @@ static inline int __must_check sysfs_init(void)return 0 ; } +static inline void sysfs_printk_last_file (void ) +{ +} +#endif /* CONFIG_SYSFS */ #endif /* _SYSFS_H_ */ Signature · 1 line
1.6.0.2
Signature · 2 lines
Mathieu Desnoyers OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
Re: [PATCH 02/46] sysfs: crash debugging
Quoted 92 lines · Mathieu Desnoyers
Quoted 81 lines · * Greg Kroah-Hartman ([email protected]) wrote:
From: Andrew Morton <[email protected]>
Print the name of the last-accessed sysfs file when we oops, to help track down oopses which occur in sysfs store/read handlers. Because these oopses tend to not leave any trace of the offending code in the stack traces.
Cc Kay Sievers <[email protected]>Cc Mathieu Desnoyers <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- arch/x86/kernel/dumpstack_32.c | 2 ++ arch/x86/kernel/dumpstack_64.c | 2 ++ fs/sysfs/file.c | 13 +++++++++++++ include/linux/sysfs.h | 6 ++++++ 4 files changed, 23 insertions(+), 0 deletions(-)arch/x86/kernel/dumpstack_32.c +2
-0@@ -13,6 +13,7 @@#include <linux/kexec.h> #include <linux/bug.h> #include <linux/nmi.h> +#include <linux/sysfs.h> #include <asm/stacktrace.h> @@ -343,6 +344,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)printk ("DEBUG_PAGEALLOC" );#endif printk ("\n" ); +sysfs_printk_last_file ();if (notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV ) ==NOTIFY_STOP )return 1 ;arch/x86/kernel/dumpstack_64.c +2
-0@@ -13,6 +13,7 @@#include <linux/kexec.h> #include <linux/bug.h> #include <linux/nmi.h> +#include <linux/sysfs.h> #include <asm/stacktrace.h> @@ -489,6 +490,7 @@ int __kprobes __die(const char *str, struct pt_regs *regs, long err)printk ("DEBUG_PAGEALLOC" );#endif printk ("\n" ); +sysfs_printk_last_file ();if (notify_die (DIE_OOPS , str, regs, err, current->thread.trap_no,SIGSEGV ) ==NOTIFY_STOP )return 1 ;fs/sysfs/file.c +8
-0@@ -19,10 +19,18 @@#include <linux/poll.h> #include <linux/list.h> #include <linux/mutex.h> +#include <linux/limits.h> #include <asm/uaccess.h> #include "sysfs.h" +/* used in crash dumps to help with debugging */ +static char last_sysfs_file[PATH_MAX ]; +void sysfs_printk_last_file (void ) +{ +printk (KERN_EMERG "last sysfs file: %s\n" , last_sysfs_file); +} +/* * There's one sysfs_buffer for each open file and one * sysfs_open_dirent for each sysfs_dirent with one or more open fs/sysfs/file.c static int sysfs_open_file(struct inode *inode, struct file *file) · line 342
Quoted 7 lines
fs/sysfs/file.c +4
-0@@ -328,6 +336,11 @@ static int sysfs_open_file(struct inode *inode, struct file *file)struct sysfs_buffer *buffer;struct sysfs_ops *ops;int error = -EACCES ; +char *p; + + p =d_path (&file->f_path, last_sysfs_file,sizeof (last_sysfs_file)); +if (p)if (!IS_ERR(p)) ?
Quoted 4 lines
fs/sysfs/file.c static int sysfs_open_file(struct inode *inode, struct file *file) · line 344
Quoted 2 lines
fs/sysfs/file.c +1
-0+memmove (last_sysfs_file, p,strlen (p) +1 );Given we do a
strlen()here anyway, shouldn't we just use strcpy ?
Probably would be good.
Care to send a patch for both of these?
thanks,
greg k-h
PATCH 3/46 device create: block: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- block/bsg.c | 3 +-- drivers/block/aoe/aoechr.c | 6 +++--- drivers/block/paride/pg.c | 5 ++--- drivers/block/paride/pt.c | 10 ++++------ drivers/block/pktcdvd.c | 5 ++--- 5 files changed, 12 insertions(+), 17 deletions(-)
block/bsg.c +1 -2
@@ -1024,8 +1024,7 @@ int bsg_register_queue(struct request_queue *q, struct device *parent, bcd->release = release;kref_init (&bcd->ref); dev =MKDEV (bsg_major, bcd->minor); - class_dev =device_create_drvdata (bsg_class, parent, dev,NULL , -"%s" , devname); + class_dev =device_create (bsg_class, parent, dev,NULL ,"%s" , devname);if (IS_ERR (class_dev)) { ret =PTR_ERR (class_dev); goto put_dev;
drivers/block/aoe/aoechr.c +3 -3
@@ -284,9 +284,9 @@ aoechr_init(void)return PTR_ERR (aoe_class); }for (i =0 ; i <ARRAY_SIZE (chardevs); ++i) -device_create_drvdata (aoe_class,NULL , -MKDEV (AOE_MAJOR , chardevs[i].minor), -NULL , chardevs[i].name); +device_create (aoe_class,NULL , +MKDEV (AOE_MAJOR , chardevs[i].minor),NULL , + chardevs[i].name);return 0 ; }
drivers/block/paride/pg.c +2 -3
@@ -686,9 +686,8 @@ static int __init pg_init(void)for (unit =0 ; unit <PG_UNITS ; unit++) {struct pg *dev = &devices[unit];if (dev->present) -device_create_drvdata (pg_class,NULL , -MKDEV (major, unit),NULL , -"pg%u" , unit); +device_create (pg_class,NULL ,MKDEV (major, unit),NULL , +"pg%u" , unit); } err =0 ; goto out;
drivers/block/paride/pt.c +4 -6
@@ -979,12 +979,10 @@ static int __init pt_init(void)for (unit =0 ; unit <PT_UNITS ; unit++)if (pt[unit].present) { -device_create_drvdata (pt_class,NULL , -MKDEV (major, unit),NULL , -"pt%d" , unit); -device_create_drvdata (pt_class,NULL , -MKDEV (major, unit +128 ),NULL , -"pt%dn" , unit); +device_create (pt_class,NULL ,MKDEV (major, unit),NULL , +"pt%d" , unit); +device_create (pt_class,NULL ,MKDEV (major, unit +128 ), +NULL ,"pt%dn" , unit); } goto out;
drivers/block/pktcdvd.c +2 -3
@@ -302,9 +302,8 @@ static struct kobj_type kobj_pkt_type_wqueue = {static void pkt_sysfs_dev_new (struct pktcdvd_device *pd) {if (class_pktcdvd) { - pd->dev =device_create_drvdata (class_pktcdvd,NULL , - pd->pkt_dev,NULL , -"%s" , pd->name); + pd->dev =device_create (class_pktcdvd,NULL , pd->pkt_dev,NULL , +"%s" , pd->name);if (IS_ERR (pd->dev)) pd->dev =NULL ; }
Signature · 1 line
1.6.0.2
PATCH 4/46 device create: char: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/char/bsr.c | 5 ++--- drivers/char/dsp56k.c | 4 ++-- drivers/char/ip2/ip2main.c | 12 ++++++------ drivers/char/ipmi/ipmi_devintf.c | 2 +- drivers/char/istallion.c | 5 ++--- drivers/char/lp.c | 4 ++-- drivers/char/mem.c | 6 +++--- drivers/char/misc.c | 4 ++-- drivers/char/pcmcia/cm4000_cs.c | 2 +- drivers/char/pcmcia/cm4040_cs.c | 3 +-- drivers/char/ppdev.c | 5 ++--- drivers/char/raw.c | 7 +++---- drivers/char/snsc.c | 4 ++-- drivers/char/stallion.c | 4 ++-- drivers/char/tty_io.c | 2 +- drivers/char/vc_screen.c | 12 ++++++------ drivers/char/viotape.c | 8 ++++---- drivers/char/xilinx_hwicap/xilinx_hwicap.c | 3 +-- 18 files changed, 43 insertions(+), 49 deletions(-)
drivers/char/bsr.c +2 -3
@@ -229,9 +229,8 @@ static int bsr_create_devs(struct device_node *bn)if (result) goto out_err; - cur->bsr_device =device_create_drvdata (bsr_class,NULL , - cur->bsr_dev, - cur, cur->bsr_name); + cur->bsr_device =device_create (bsr_class,NULL , cur->bsr_dev, + cur, cur->bsr_name);if (!cur->bsr_device) {printk (KERN_ERR "device_create failed for %s\n" , cur->bsr_name);
drivers/char/dsp56k.c +2 -2
@@ -508,8 +508,8 @@ static int __init dsp56k_init_driver(void) err =PTR_ERR (dsp56k_class); goto out_chrdev; } -device_create_drvdata (dsp56k_class,NULL ,MKDEV (DSP56K_MAJOR ,0 ), -NULL ,"dsp56k" ); +device_create (dsp56k_class,NULL ,MKDEV (DSP56K_MAJOR ,0 ),NULL , +"dsp56k" );printk (banner); goto out;
drivers/char/ip2/ip2main.c +6 -6
@@ -745,12 +745,12 @@ static int __init ip2_loadmain(void) pB = i2BoardPtrTable[i];if (pB !=NULL ) { -device_create_drvdata (ip2_class,NULL , -MKDEV (IP2_IPL_MAJOR ,4 * i), -NULL ,"ipl%d" , i); -device_create_drvdata (ip2_class,NULL , -MKDEV (IP2_IPL_MAJOR ,4 * i +1 ), -NULL ,"stat%d" , i); +device_create (ip2_class,NULL , +MKDEV (IP2_IPL_MAJOR ,4 * i), +NULL ,"ipl%d" , i); +device_create (ip2_class,NULL , +MKDEV (IP2_IPL_MAJOR ,4 * i +1 ), +NULL ,"stat%d" , i);for (box =0 ; box <ABS_MAX_BOXES ; box++)for (j =0 ; j <ABS_BIGGEST_BOX ; j++)
drivers/char/ipmi/ipmi_devintf.c +1 -1
@@ -871,7 +871,7 @@ static void ipmi_new_smi(int if_num, struct device *device) entry->dev = dev;mutex_lock (®_list_mutex); -device_create_drvdata (ipmi_class, device, dev,NULL ,"ipmi%d" , if_num); +device_create (ipmi_class, device, dev,NULL ,"ipmi%d" , if_num);list_add (&entry->link, ®_list);mutex_unlock (®_list_mutex); }
drivers/char/istallion.c +2 -3
@@ -4600,9 +4600,8 @@ static int __init istallion_module_init(void) istallion_class =class_create (THIS_MODULE ,"staliomem" );for (i =0 ; i <4 ; i++) -device_create_drvdata (istallion_class,NULL , -MKDEV (STL_SIOMEMMAJOR , i), -NULL ,"staliomem%d" , i); +device_create (istallion_class,NULL ,MKDEV (STL_SIOMEMMAJOR , i), +NULL ,"staliomem%d" , i);return 0 ; err_deinit:
drivers/char/lp.c +2 -2
@@ -813,8 +813,8 @@ static int lp_register(int nr, struct parport *port)if (reset)lp_reset (nr); -device_create_drvdata (lp_class, port->dev,MKDEV (LP_MAJOR , nr),NULL , -"lp%d" , nr); +device_create (lp_class, port->dev,MKDEV (LP_MAJOR , nr),NULL , +"lp%d" , nr);printk (KERN_INFO "lp%d: using %s (%s).\n" , nr, port->name, (port->irq ==PARPORT_IRQ_NONE )?"polling" :"interrupt-driven" );
drivers/char/mem.c +3 -3
@@ -992,9 +992,9 @@ static int __init chr_dev_init(void) mem_class =class_create (THIS_MODULE ,"mem" );for (i =0 ; i <ARRAY_SIZE (devlist); i++) -device_create_drvdata (mem_class,NULL , -MKDEV (MEM_MAJOR , devlist[i].minor), -NULL , devlist[i].name); +device_create (mem_class,NULL , +MKDEV (MEM_MAJOR , devlist[i].minor),NULL , + devlist[i].name);return 0 ; }
drivers/char/misc.c +2 -2
@@ -217,8 +217,8 @@ int misc_register(struct miscdevice * misc) misc_minors[misc->minor >>3 ] |=1 << (misc->minor &7 ); dev =MKDEV (MISC_MAJOR , misc->minor); - misc->this_device =device_create_drvdata (misc_class, misc->parent, - dev,NULL ,"%s" , misc->name); + misc->this_device =device_create (misc_class, misc->parent, dev,NULL , +"%s" , misc->name);if (IS_ERR (misc->this_device)) { err =PTR_ERR (misc->this_device); goto out;
drivers/char/pcmcia/cm4000_cs.c +1 -1
@@ -1871,7 +1871,7 @@ static int cm4000_probe(struct pcmcia_device *link)return ret; } -device_create_drvdata (cmm_class,NULL ,MKDEV (major, i),NULL ,"cmm%d" , i); +device_create (cmm_class,NULL ,MKDEV (major, i),NULL ,"cmm%d" , i);return 0 ; }
drivers/char/pcmcia/cm4040_cs.c +1 -2
@@ -637,8 +637,7 @@ static int reader_probe(struct pcmcia_device *link)return ret; } -device_create_drvdata (cmx_class,NULL ,MKDEV (major, i),NULL , -"cmx%d" , i); +device_create (cmx_class,NULL ,MKDEV (major, i),NULL ,"cmx%d" , i);return 0 ; }
drivers/char/ppdev.c +2 -3
@@ -760,9 +760,8 @@ static const struct file_operations pp_fops = {static void pp_attach (struct parport *port) { -device_create_drvdata (ppdev_class, port->dev, -MKDEV (PP_MAJOR , port->number), -NULL ,"parport%d" , port->number); +device_create (ppdev_class, port->dev,MKDEV (PP_MAJOR , port->number), +NULL ,"parport%d" , port->number); }static void pp_detach (struct parport *port)
drivers/char/raw.c +3 -4
@@ -131,8 +131,8 @@ raw_ioctl(struct inode *inode, struct file *filp,static void bind_device (struct raw_config_request *rq) {device_destroy (raw_class,MKDEV (RAW_MAJOR , rq->raw_minor)); -device_create_drvdata (raw_class,NULL ,MKDEV (RAW_MAJOR , rq->raw_minor), -NULL ,"raw%d" , rq->raw_minor); +device_create (raw_class,NULL ,MKDEV (RAW_MAJOR , rq->raw_minor),NULL , +"raw%d" , rq->raw_minor); }/*
@@ -283,8 +283,7 @@ static int __init raw_init(void) ret =PTR_ERR (raw_class); goto error_region; } -device_create_drvdata (raw_class,NULL ,MKDEV (RAW_MAJOR ,0 ),NULL , -"rawctl" ); +device_create (raw_class,NULL ,MKDEV (RAW_MAJOR ,0 ),NULL ,"rawctl" );return 0 ;
drivers/char/snsc.c +2 -2
@@ -444,8 +444,8 @@ scdrv_init(void)continue ; } -device_create_drvdata (snsc_class,NULL , dev,NULL , -"%s" , devname); +device_create (snsc_class,NULL , dev,NULL , +"%s" , devname); ia64_sn_irtr_intr_enable(scd->scd_nasid, 0 /*ignored */ ,
drivers/char/stallion.c +2 -2
@@ -4743,8 +4743,8 @@ static int __init stallion_module_init(void)if (IS_ERR (stallion_class))printk ("STALLION: failed to create class\n" );for (i =0 ; i <4 ; i++) -device_create_drvdata (stallion_class,NULL ,MKDEV (STL_SIOMEMMAJOR , i), -NULL ,"staliomem%d" , i); +device_create (stallion_class,NULL ,MKDEV (STL_SIOMEMMAJOR , i), +NULL ,"staliomem%d" , i);return 0 ; err_unrtty:
drivers/char/tty_io.c +1 -1
@@ -2850,7 +2850,7 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,else tty_line_name (driver, index, name); -return device_create_drvdata (tty_class, device, dev,NULL , name); +return device_create (tty_class, device, dev,NULL , name); }EXPORT_SYMBOL (tty_register_device);
drivers/char/vc_screen.c +6 -6
@@ -481,10 +481,10 @@ static struct class *vc_class;void vcs_make_sysfs (struct tty_struct *tty) { -device_create_drvdata (vc_class,NULL ,MKDEV (VCS_MAJOR , tty->index +1 ), -NULL ,"vcs%u" , tty->index +1 ); -device_create_drvdata (vc_class,NULL ,MKDEV (VCS_MAJOR , tty->index +129 ), -NULL ,"vcsa%u" , tty->index +1 ); +device_create (vc_class,NULL ,MKDEV (VCS_MAJOR , tty->index +1 ),NULL , +"vcs%u" , tty->index +1 ); +device_create (vc_class,NULL ,MKDEV (VCS_MAJOR , tty->index +129 ),NULL , +"vcsa%u" , tty->index +1 ); }void vcs_remove_sysfs (struct tty_struct *tty)
@@ -499,7 +499,7 @@ int __init vcs_init(void)panic ("unable to get major %d for vcs device" ,VCS_MAJOR ); vc_class =class_create (THIS_MODULE ,"vc" ); -device_create_drvdata (vc_class,NULL ,MKDEV (VCS_MAJOR ,0 ),NULL ,"vcs" ); -device_create_drvdata (vc_class,NULL ,MKDEV (VCS_MAJOR ,128 ),NULL ,"vcsa" ); +device_create (vc_class,NULL ,MKDEV (VCS_MAJOR ,0 ),NULL ,"vcs" ); +device_create (vc_class,NULL ,MKDEV (VCS_MAJOR ,128 ),NULL ,"vcsa" );return 0 ; }
drivers/char/viotape.c +4 -4
@@ -886,10 +886,10 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id) state[i].cur_part =0 ;for (j =0 ; j <MAX_PARTITIONS ; ++j) state[i].part_stat_rwi[j] =VIOT_IDLE ; -device_create_drvdata (tape_class,NULL ,MKDEV (VIOTAPE_MAJOR , i), -NULL ,"iseries!vt%d" , i); -device_create_drvdata (tape_class,NULL ,MKDEV (VIOTAPE_MAJOR , i |0x80 ), -NULL ,"iseries!nvt%d" , i); +device_create (tape_class,NULL ,MKDEV (VIOTAPE_MAJOR , i),NULL , +"iseries!vt%d" , i); +device_create (tape_class,NULL ,MKDEV (VIOTAPE_MAJOR , i |0x80 ),NULL , +"iseries!nvt%d" , i); printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries " "resource %10.10s type %4.4s, model %3.3s\n", i, viotape_unitinfo[i].rsrcname,
drivers/char/xilinx_hwicap/xilinx_hwicap.c +1 -2
@@ -657,8 +657,7 @@ static int __devinit hwicap_setup(struct device *dev, int id, goto failed3; } -device_create_drvdata (icap_class, dev, devt,NULL , -"%s%d" ,DRIVER_NAME , id); +device_create (icap_class, dev, devt,NULL ,"%s%d" ,DRIVER_NAME , id);return 0 ;/* success */ failed3:
Signature · 1 line
1.6.0.2
PATCH 5/46 device create: ieee1394: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/ieee1394/dv1394.c | 8 ++++---- drivers/ieee1394/raw1394.c | 8 ++++---- drivers/ieee1394/video1394.c | 5 ++--- 3 files changed, 10 insertions(+), 11 deletions(-)
drivers/ieee1394/dv1394.c +4 -4
@@ -2296,10 +2296,10 @@ static void dv1394_add_host(struct hpsb_host *host) ohci = (struct ti_ohci *)host->hostdata; -device_create_drvdata (hpsb_protocol_class,NULL , -MKDEV (IEEE1394_MAJOR , -IEEE1394_MINOR_BLOCK_DV1394 *16 + (id<<2 )),NULL , -"dv1394-%d" , id); +device_create (hpsb_protocol_class,NULL , +MKDEV (IEEE1394_MAJOR , +IEEE1394_MINOR_BLOCK_DV1394 *16 + (id<<2 )), +NULL ,"dv1394-%d" , id);dv1394_init (ohci,DV1394_NTSC ,MODE_RECEIVE );dv1394_init (ohci,DV1394_NTSC ,MODE_TRANSMIT );
drivers/ieee1394/raw1394.c +4 -4
@@ -3010,10 +3010,10 @@ static int __init init_raw1394(void)hpsb_register_highlevel (&raw1394_highlevel);if (IS_ERR - (device_create_drvdata ( - hpsb_protocol_class,NULL , -MKDEV (IEEE1394_MAJOR ,IEEE1394_MINOR_BLOCK_RAW1394 *16 ), -NULL ,RAW1394_DEVICE_NAME ))) { + (device_create (hpsb_protocol_class,NULL , +MKDEV (IEEE1394_MAJOR , +IEEE1394_MINOR_BLOCK_RAW1394 *16 ), +NULL ,RAW1394_DEVICE_NAME ))) { ret = -EFAULT ; goto out_unreg; }
drivers/ieee1394/video1394.c +2 -3
@@ -1341,9 +1341,8 @@ static void video1394_add_host (struct hpsb_host *host)hpsb_set_hostinfo_key (&video1394_highlevel, host, ohci->host->id); minor =IEEE1394_MINOR_BLOCK_VIDEO1394 *16 + ohci->host->id; -device_create_drvdata (hpsb_protocol_class,NULL , -MKDEV (IEEE1394_MAJOR , minor),NULL , -"%s-%d" ,VIDEO1394_DRIVER_NAME , ohci->host->id); +device_create (hpsb_protocol_class,NULL ,MKDEV (IEEE1394_MAJOR , minor), +NULL ,"%s-%d" ,VIDEO1394_DRIVER_NAME , ohci->host->id); }
Signature · 1 line
1.6.0.2
PATCH 6/46 device create: infiniband: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/infiniband/core/cm.c | 6 +++--- drivers/infiniband/core/user_mad.c | 12 ++++++------ drivers/infiniband/core/uverbs_main.c | 9 +++------ drivers/infiniband/hw/ipath/ipath_file_ops.c | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-)
drivers/infiniband/core/cm.c +3 -3
@@ -3691,9 +3691,9 @@ static void cm_add_one(struct ib_device *ib_device) cm_dev->ib_device = ib_device;cm_get_ack_delay (cm_dev); - cm_dev->device =device_create_drvdata (&cm_class, &ib_device->dev, -MKDEV (0 ,0 ),NULL , -"%s" , ib_device->name); + cm_dev->device =device_create (&cm_class, &ib_device->dev, +MKDEV (0 ,0 ),NULL , +"%s" , ib_device->name);if (!cm_dev->device) {kfree (cm_dev);return ;
drivers/infiniband/core/user_mad.c +6 -6
@@ -1016,9 +1016,9 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,if (cdev_add (port->cdev, base_dev + port->dev_num,1 )) goto err_cdev; - port->dev =device_create_drvdata (umad_class, device->dma_device, - port->cdev->dev, port, -"umad%d" , port->dev_num); + port->dev =device_create (umad_class, device->dma_device, + port->cdev->dev, port, +"umad%d" , port->dev_num);if (IS_ERR (port->dev)) goto err_cdev;
@@ -1036,9 +1036,9 @@ static int ib_umad_init_port(struct ib_device *device, int port_num,if (cdev_add (port->sm_cdev, base_dev + port->dev_num +IB_UMAD_MAX_PORTS ,1 )) goto err_sm_cdev; - port->sm_dev =device_create_drvdata (umad_class, device->dma_device, - port->sm_cdev->dev, port, -"issm%d" , port->dev_num); + port->sm_dev =device_create (umad_class, device->dma_device, + port->sm_cdev->dev, port, +"issm%d" , port->dev_num);if (IS_ERR (port->sm_dev)) goto err_sm_cdev;
drivers/infiniband/core/uverbs_main.c +3 -6
@@ -764,12 +764,9 @@ static void ib_uverbs_add_one(struct ib_device *device)if (cdev_add (uverbs_dev->cdev,IB_UVERBS_BASE_DEV + uverbs_dev->devnum,1 )) goto err_cdev; - uverbs_dev->dev =device_create_drvdata (uverbs_class, - device->dma_device, - uverbs_dev->cdev->dev, - uverbs_dev, -"uverbs%d" , - uverbs_dev->devnum); + uverbs_dev->dev =device_create (uverbs_class, device->dma_device, + uverbs_dev->cdev->dev, uverbs_dev, +"uverbs%d" , uverbs_dev->devnum);if (IS_ERR (uverbs_dev->dev)) goto err_cdev;
drivers/infiniband/hw/ipath/ipath_file_ops.c +1 -1
@@ -2455,7 +2455,7 @@ static int init_cdev(int minor, char *name, const struct file_operations *fops, goto err_cdev; } - device =device_create_drvdata (ipath_class,NULL , dev,NULL , name); + device =device_create (ipath_class,NULL , dev,NULL , name);if (IS_ERR (device)) { ret =PTR_ERR (device);
Signature · 1 line
1.6.0.2
PATCH 7/46 device create: misc: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- arch/mips/kernel/rtlx.c | 4 ++-- arch/mips/sibyte/common/sb_tbprof.c | 3 +-- arch/x86/kernel/cpuid.c | 4 ++-- arch/x86/kernel/msr.c | 4 ++-- drivers/dca/dca-sysfs.c | 8 +++----- drivers/hid/hidraw.c | 5 ++--- drivers/hwmon/hwmon.c | 4 ++-- drivers/i2c/i2c-dev.c | 6 +++--- drivers/isdn/capi/capi.c | 3 +-- drivers/leds/led-class.c | 4 ++-- drivers/macintosh/adb.c | 3 +-- drivers/media/dvb/dvb-core/dvbdev.c | 2 +- drivers/misc/phantom.c | 6 +++--- drivers/mtd/mtdchar.c | 10 ++++------ drivers/power/power_supply_core.c | 4 ++-- drivers/spi/spidev.c | 7 +++---- drivers/uio/uio.c | 6 +++--- fs/coda/psdev.c | 5 ++--- 18 files changed, 39 insertions(+), 49 deletions(-)
arch/mips/kernel/rtlx.c +2 -2
@@ -522,8 +522,8 @@ static int __init rtlx_module_init(void)atomic_set (&channel_wqs[i].in_open,0 );mutex_init (&channel_wqs[i].mutex); - dev =device_create_drvdata (mt_class,NULL ,MKDEV (major, i), -NULL ,"%s%d" , module_name, i); + dev =device_create (mt_class,NULL ,MKDEV (major, i),NULL , +"%s%d" , module_name, i);if (IS_ERR (dev)) { err =PTR_ERR (dev); goto out_chrdev;
arch/mips/sibyte/common/sb_tbprof.c +1 -2
@@ -576,8 +576,7 @@ static int __init sbprof_tb_init(void) tb_class = tbc; - dev =device_create_drvdata (tbc,NULL ,MKDEV (SBPROF_TB_MAJOR ,0 ), -NULL ,"tb" ); + dev =device_create (tbc,NULL ,MKDEV (SBPROF_TB_MAJOR ,0 ),NULL ,"tb" );if (IS_ERR (dev)) { err =PTR_ERR (dev); goto out_class;
arch/x86/kernel/cpuid.c +2 -2
@@ -147,8 +147,8 @@ static __cpuinit int cpuid_device_create(int cpu) {struct device *dev; - dev =device_create_drvdata (cpuid_class,NULL ,MKDEV (CPUID_MAJOR , cpu), -NULL ,"cpu%d" , cpu); + dev =device_create (cpuid_class,NULL ,MKDEV (CPUID_MAJOR , cpu),NULL , +"cpu%d" , cpu);return IS_ERR (dev) ?PTR_ERR (dev) :0 ; }
arch/x86/kernel/msr.c +2 -2
@@ -163,8 +163,8 @@ static int __cpuinit msr_device_create(int cpu) {struct device *dev; - dev =device_create_drvdata (msr_class,NULL ,MKDEV (MSR_MAJOR , cpu), -NULL ,"msr%d" , cpu); + dev =device_create (msr_class,NULL ,MKDEV (MSR_MAJOR , cpu),NULL , +"msr%d" , cpu);return IS_ERR (dev) ?PTR_ERR (dev) :0 ; }
drivers/dca/dca-sysfs.c +3 -5
@@ -15,9 +15,8 @@ int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot)struct device *cd;static int req_count; - cd =device_create_drvdata (dca_class, dca->cd, -MKDEV (0 , slot +1 ),NULL , -"requester%d" , req_count++); + cd =device_create (dca_class, dca->cd,MKDEV (0 , slot +1 ),NULL , +"requester%d" , req_count++);if (IS_ERR (cd))return PTR_ERR (cd);return 0 ;
@@ -48,8 +47,7 @@ idr_try_again:return err; } - cd =device_create_drvdata (dca_class, dev,MKDEV (0 ,0 ),NULL , -"dca%d" , dca->id); + cd =device_create (dca_class, dev,MKDEV (0 ,0 ),NULL ,"dca%d" , dca->id);if (IS_ERR (cd)) {spin_lock (&dca_idr_lock);idr_remove (&dca_idr, dca->id);
drivers/hid/hidraw.c +2 -3
@@ -326,9 +326,8 @@ int hidraw_connect(struct hid_device *hid) goto out; } - dev->dev =device_create_drvdata (hidraw_class,NULL , -MKDEV (hidraw_major, minor),NULL , -"%s%d" ,"hidraw" , minor); + dev->dev =device_create (hidraw_class,NULL ,MKDEV (hidraw_major, minor), +NULL ,"%s%d" ,"hidraw" , minor);if (IS_ERR (dev->dev)) {spin_lock (&minors_lock);
drivers/hwmon/hwmon.c +2 -2
@@ -55,8 +55,8 @@ again:return ERR_PTR (err); id = id &MAX_ID_MASK ; - hwdev =device_create_drvdata (hwmon_class, dev,MKDEV (0 ,0 ),NULL , -HWMON_ID_FORMAT , id); + hwdev =device_create (hwmon_class, dev,MKDEV (0 ,0 ),NULL , +HWMON_ID_FORMAT , id);if (IS_ERR (hwdev)) {spin_lock (&idr_lock);
drivers/i2c/i2c-dev.c +3 -3
@@ -521,9 +521,9 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap)return PTR_ERR (i2c_dev);/* register this i2c device with the driver core */ - i2c_dev->dev =device_create_drvdata (i2c_dev_class, &adap->dev, -MKDEV (I2C_MAJOR , adap->nr), -NULL ,"i2c-%d" , adap->nr); + i2c_dev->dev =device_create (i2c_dev_class, &adap->dev, +MKDEV (I2C_MAJOR , adap->nr),NULL , +"i2c-%d" , adap->nr);if (IS_ERR (i2c_dev->dev)) { res =PTR_ERR (i2c_dev->dev); goto error;
drivers/isdn/capi/capi.c +1 -2
@@ -1553,8 +1553,7 @@ static int __init capi_init(void)return PTR_ERR (capi_class); } -device_create_drvdata (capi_class,NULL ,MKDEV (capi_major,0 ),NULL , -"capi" ); +device_create (capi_class,NULL ,MKDEV (capi_major,0 ),NULL ,"capi" );#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE if (capinc_tty_init () <0 ) {
drivers/leds/led-class.c +2 -2
@@ -103,8 +103,8 @@ int led_classdev_register(struct device *parent, struct led_classdev *led_cdev) {int rc; - led_cdev->dev =device_create_drvdata (leds_class, parent,0 , led_cdev, -"%s" , led_cdev->name); + led_cdev->dev =device_create (leds_class, parent,0 , led_cdev, +"%s" , led_cdev->name);if (IS_ERR (led_cdev->dev))return PTR_ERR (led_cdev->dev);
drivers/macintosh/adb.c +1 -2
@@ -862,8 +862,7 @@ adbdev_init(void) adb_dev_class =class_create (THIS_MODULE ,"adb" );if (IS_ERR (adb_dev_class))return ; -device_create_drvdata (adb_dev_class,NULL ,MKDEV (ADB_MAJOR ,0 ),NULL , -"adb" ); +device_create (adb_dev_class,NULL ,MKDEV (ADB_MAJOR ,0 ),NULL ,"adb" );platform_device_register (&adb_pfdev);platform_driver_probe (&adb_pfdrv, adb_dummy_probe);
drivers/media/dvb/dvb-core/dvbdev.c +1 -1
@@ -233,7 +233,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,mutex_unlock (&dvbdev_register_lock); - clsdev =device_create_drvdata (dvb_class, adap->device, + clsdev =device_create (dvb_class, adap->device,MKDEV (DVB_MAJOR ,nums2minor (adap->num, type, id)),NULL ,"dvb%d.%s%d" , adap->num, dnames[type], id);if (IS_ERR (clsdev)) {
drivers/misc/phantom.c +3 -3
@@ -399,9 +399,9 @@ static int __devinit phantom_probe(struct pci_dev *pdev, goto err_irq; } -if (IS_ERR (device_create_drvdata (phantom_class, &pdev->dev, -MKDEV (phantom_major, minor), -NULL ,"phantom%u" , minor))) +if (IS_ERR (device_create (phantom_class, &pdev->dev, +MKDEV (phantom_major, minor),NULL , +"phantom%u" , minor)))dev_err (&pdev->dev,"can't create device\n" );pci_set_drvdata (pdev, pht);
drivers/mtd/mtdchar.c +4 -6
@@ -26,13 +26,11 @@ static void mtd_notify_add(struct mtd_info* mtd)if (!mtd)return ; -device_create_drvdata (mtd_class,NULL , -MKDEV (MTD_CHAR_MAJOR , mtd->index*2 ), -NULL ,"mtd%d" , mtd->index); +device_create (mtd_class,NULL ,MKDEV (MTD_CHAR_MAJOR , mtd->index*2 ), +NULL ,"mtd%d" , mtd->index); -device_create_drvdata (mtd_class,NULL , -MKDEV (MTD_CHAR_MAJOR , mtd->index*2 +1 ), -NULL ,"mtd%dro" , mtd->index); +device_create (mtd_class,NULL ,MKDEV (MTD_CHAR_MAJOR , mtd->index*2 +1 ), +NULL ,"mtd%dro" , mtd->index); }static void mtd_notify_remove (struct mtd_info * mtd)
drivers/power/power_supply_core.c +2 -2
@@ -91,8 +91,8 @@ int power_supply_register(struct device *parent, struct power_supply *psy) {int rc =0 ; - psy->dev =device_create_drvdata (power_supply_class, parent,0 , - psy,"%s" , psy->name); + psy->dev =device_create (power_supply_class, parent,0 , psy, +"%s" , psy->name);if (IS_ERR (psy->dev)) { rc =PTR_ERR (psy->dev); goto dev_create_failed;
drivers/spi/spidev.c +3 -4
@@ -583,10 +583,9 @@ static int spidev_probe(struct spi_device *spi)struct device *dev; spidev->devt =MKDEV (SPIDEV_MAJOR , minor); - dev =device_create_drvdata (spidev_class, &spi->dev, - spidev->devt, spidev, -"spidev%d.%d" , - spi->master->bus_num, spi->chip_select); + dev =device_create (spidev_class, &spi->dev, spidev->devt, + spidev,"spidev%d.%d" , + spi->master->bus_num, spi->chip_select); status =IS_ERR (dev) ?PTR_ERR (dev) :0 ; }else {dev_dbg (&spi->dev,"no minor number available!\n" );
drivers/uio/uio.c +3 -3
@@ -682,9 +682,9 @@ int __uio_register_device(struct module *owner,if (ret) goto err_get_minor; - idev->dev =device_create_drvdata (uio_class->class, parent, -MKDEV (uio_major, idev->minor), idev, -"uio%d" , idev->minor); + idev->dev =device_create (uio_class->class, parent, +MKDEV (uio_major, idev->minor), idev, +"uio%d" , idev->minor);if (IS_ERR (idev->dev)) {printk (KERN_ERR "UIO: device register failed\n" ); ret =PTR_ERR (idev->dev);
fs/coda/psdev.c +2 -3
@@ -362,9 +362,8 @@ static int init_coda_psdev(void) goto out_chrdev; }for (i =0 ; i <MAX_CODADEVS ; i++) -device_create_drvdata (coda_psdev_class,NULL , -MKDEV (CODA_PSDEV_MAJOR , i), -NULL ,"cfs%d" , i); +device_create (coda_psdev_class,NULL , +MKDEV (CODA_PSDEV_MAJOR , i),NULL ,"cfs%d" , i);coda_sysctl_init (); goto out;
Signature · 1 line
1.6.0.2
PATCH 8/46 device create: net: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/net/ppp_generic.c | 4 ++-- drivers/net/wan/cosa.c | 4 ++-- drivers/net/wireless/mac80211_hwsim.c | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-)
drivers/net/ppp_generic.c +2 -2
@@ -866,8 +866,8 @@ static int __init ppp_init(void) err =PTR_ERR (ppp_class); goto out_chrdev; } -device_create_drvdata (ppp_class,NULL ,MKDEV (PPP_MAJOR ,0 ), -NULL ,"ppp" ); +device_create (ppp_class,NULL ,MKDEV (PPP_MAJOR ,0 ),NULL , +"ppp" ); } out:
drivers/net/wan/cosa.c +2 -2
@@ -388,8 +388,8 @@ static int __init cosa_init(void) goto out_chrdev; }for (i =0 ; i < nr_cards; i++) -device_create_drvdata (cosa_class,NULL ,MKDEV (cosa_major, i), -NULL ,"cosa%d" , i); +device_create (cosa_class,NULL ,MKDEV (cosa_major, i),NULL , +"cosa%d" , i); err =0 ; goto out;
drivers/net/wireless/mac80211_hwsim.c +3 -3
@@ -533,11 +533,11 @@ static int __init init_mac80211_hwsim(void) data = hw->priv; data->hw = hw; - data->dev =device_create_drvdata (hwsim_class,NULL ,0 , hw, -"hwsim%d" , i); + data->dev =device_create (hwsim_class,NULL ,0 , hw, +"hwsim%d" , i);if (IS_ERR (data->dev)) {printk (KERN_DEBUG -"mac80211_hwsim: device_create_drvdata " +"mac80211_hwsim: device_create " "failed (%ld)\n" ,PTR_ERR (data->dev)); err = -ENOMEM ; goto failed_drvdata;
Signature · 1 line
1.6.0.2
PATCH 9/46 device create: s390: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/s390/char/raw3270.c | 14 ++++++-------- drivers/s390/char/tape_class.c | 6 +++--- drivers/s390/char/vmlogrdr.c | 8 ++++---- drivers/s390/char/vmur.c | 5 ++--- 4 files changed, 15 insertions(+), 18 deletions(-)
drivers/s390/char/raw3270.c +6 -8
@@ -1168,19 +1168,17 @@ static int raw3270_create_attributes(struct raw3270 *rp)if (rc) goto out; - rp->clttydev =device_create_drvdata (class3270, &rp->cdev->dev, -MKDEV (IBM_TTY3270_MAJOR , rp->minor), -NULL , -"tty%s" ,dev_name (&rp->cdev->dev)); + rp->clttydev =device_create (class3270, &rp->cdev->dev, +MKDEV (IBM_TTY3270_MAJOR , rp->minor),NULL , +"tty%s" ,dev_name (&rp->cdev->dev));if (IS_ERR (rp->clttydev)) { rc =PTR_ERR (rp->clttydev); goto out_ttydev; } - rp->cltubdev =device_create_drvdata (class3270, &rp->cdev->dev, -MKDEV (IBM_FS3270_MAJOR , rp->minor), -NULL , -"tub%s" ,dev_name (&rp->cdev->dev)); + rp->cltubdev =device_create (class3270, &rp->cdev->dev, +MKDEV (IBM_FS3270_MAJOR , rp->minor),NULL , +"tub%s" ,dev_name (&rp->cdev->dev));if (!IS_ERR (rp->cltubdev)) goto out;
drivers/s390/char/tape_class.c +3 -3
@@ -69,9 +69,9 @@ struct tape_class_device *register_tape_dev(if (rc) goto fail_with_cdev; - tcd->class_device =device_create_drvdata (tape_class, device, - tcd->char_device->dev, -NULL ,"%s" , tcd->device_name); + tcd->class_device =device_create (tape_class, device, + tcd->char_device->dev,NULL , +"%s" , tcd->device_name); rc =IS_ERR (tcd->class_device) ?PTR_ERR (tcd->class_device) :0 ;if (rc) goto fail_with_cdev;
drivers/s390/char/vmlogrdr.c +4 -4
@@ -747,10 +747,10 @@ static int vmlogrdr_register_device(struct vmlogrdr_priv_t *priv)device_unregister (dev);return ret; } - priv->class_device =device_create_drvdata (vmlogrdr_class, dev, -MKDEV (vmlogrdr_major, - priv->minor_num), - priv,"%s" ,dev_name (dev)); + priv->class_device =device_create (vmlogrdr_class, dev, +MKDEV (vmlogrdr_major, + priv->minor_num), + priv,"%s" ,dev_name (dev));if (IS_ERR (priv->class_device)) { ret =PTR_ERR (priv->class_device); priv->class_device=NULL ;
drivers/s390/char/vmur.c +2 -3
@@ -896,9 +896,8 @@ static int ur_set_online(struct ccw_device *cdev) goto fail_free_cdev; } - urd->device =device_create_drvdata (vmur_class,NULL , - urd->char_device->dev,NULL , -"%s" , node_id); + urd->device =device_create (vmur_class,NULL , urd->char_device->dev, +NULL ,"%s" , node_id);if (IS_ERR (urd->device)) { rc =PTR_ERR (urd->device);TRACE ("ur_set_online: device_create rc=%d\n" , rc);
Signature · 1 line
1.6.0.2
PATCH 10/46 device create: scsi: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/scsi/ch.c | 6 +++--- drivers/scsi/dpt_i2o.c | 2 +- drivers/scsi/osst.c | 3 ++- drivers/scsi/sg.c | 10 ++++------ drivers/scsi/st.c | 11 ++++------- 5 files changed, 14 insertions(+), 18 deletions(-)
drivers/scsi/ch.c +3 -3
@@ -914,9 +914,9 @@ static int ch_probe(struct device *dev) ch->minor = minor;sprintf (ch->name,"ch%d" ,ch->minor); - class_dev =device_create_drvdata (ch_sysfs_class, dev, -MKDEV (SCSI_CHANGER_MAJOR , ch->minor), - ch,"s%s" , ch->name); + class_dev =device_create (ch_sysfs_class, dev, +MKDEV (SCSI_CHANGER_MAJOR , ch->minor), ch, +"s%s" , ch->name);if (IS_ERR (class_dev)) {printk (KERN_WARNING "ch%d: device_create failed\n" , ch->minor);
drivers/scsi/dpt_i2o.c +1 -1
@@ -271,7 +271,7 @@ rebuild_sys_tab: pHba->initialized = TRUE; pHba->state &= ~DPTI_STATE_RESET ;if (adpt_sysfs_class) { -struct device *dev =device_create_drvdata (adpt_sysfs_class, +struct device *dev =device_create (adpt_sysfs_class,NULL ,MKDEV (DPTI_I2O_MAJOR , pHba->unit),NULL ,"dpti%d" , pHba->unit);if (IS_ERR (dev)) {
drivers/scsi/osst.c +2 -1
@@ -5708,7 +5708,8 @@ static int osst_sysfs_add(dev_t dev, struct device *device, struct osst_tape * Sstruct device *osst_member;int err; - osst_member =device_create_drvdata (osst_sysfs_class, device, dev, STp,"%s" , name); + osst_member =device_create (osst_sysfs_class, device, dev, STp, +"%s" , name);if (IS_ERR (osst_member)) {printk (KERN_WARNING "osst :W: Unable to add sysfs class member %s\n" , name);return PTR_ERR (osst_member);
drivers/scsi/sg.c +4 -6
@@ -1450,12 +1450,10 @@ sg_add(struct device *cl_dev, struct class_interface *cl_intf)if (sg_sysfs_valid) {struct device *sg_class_member; - sg_class_member =device_create_drvdata (sg_sysfs_class, - cl_dev->parent, -MKDEV (SCSI_GENERIC_MAJOR , - sdp->index), - sdp, -"%s" , disk->disk_name); + sg_class_member =device_create (sg_sysfs_class, cl_dev->parent, +MKDEV (SCSI_GENERIC_MAJOR , + sdp->index), + sdp,"%s" , disk->disk_name);if (IS_ERR (sg_class_member)) {printk (KERN_ERR "sg_add: " "device_create failed\n" );
drivers/scsi/st.c +4 -7
@@ -4428,13 +4428,10 @@ static int do_create_class_files(struct scsi_tape *STp, int dev_num, int mode)snprintf (name,10 ,"%s%s%s" , rew ?"n" :"" , STp->disk->disk_name, st_formats[i]); st_class_member = -device_create_drvdata (st_sysfs_class, - &STp->device->sdev_gendev, -MKDEV (SCSI_TAPE_MAJOR , -TAPE_MINOR (dev_num, - mode, rew)), - &STp->modes[mode], -"%s" , name); +device_create (st_sysfs_class, &STp->device->sdev_gendev, +MKDEV (SCSI_TAPE_MAJOR , +TAPE_MINOR (dev_num, mode, rew)), + &STp->modes[mode],"%s" , name);if (IS_ERR (st_class_member)) {printk (KERN_WARNING "st%d: device_create failed\n" , dev_num);
Signature · 1 line
1.6.0.2
PATCH 11/46 device create: sound: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- sound/core/init.c | 6 +++--- sound/core/sound.c | 5 ++--- sound/oss/soundcard.c | 15 +++++++-------- sound/sound_core.c | 5 ++--- 4 files changed, 14 insertions(+), 17 deletions(-)
sound/core/init.c +3 -3
@@ -549,9 +549,9 @@ int snd_card_register(struct snd_card *card)return -EINVAL ;#ifndef CONFIG_SYSFS_DEPRECATED if (!card->card_dev) { - card->card_dev =device_create_drvdata (sound_class, card->dev, -MKDEV (0 ,0 ),NULL , -"card%i" , card->number); + card->card_dev =device_create (sound_class, card->dev, +MKDEV (0 ,0 ),NULL , +"card%i" , card->number);if (IS_ERR (card->card_dev)) card->card_dev =NULL ; }
sound/core/sound.c +2 -3
@@ -274,9 +274,8 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev,return minor; } snd_minors[minor] = preg; - preg->dev =device_create_drvdata (sound_class, device, -MKDEV (major, minor), - private_data,"%s" , name); + preg->dev =device_create (sound_class, device,MKDEV (major, minor), + private_data,"%s" , name);if (IS_ERR (preg->dev)) { snd_minors[minor] =NULL ;mutex_unlock (&sound_mutex);
sound/oss/soundcard.c +7 -8
@@ -560,19 +560,18 @@ static int __init oss_init(void) sound_dmap_flag = (dmabuf >0 ?1 :0 );for (i =0 ; i <ARRAY_SIZE (dev_list); i++) { -device_create_drvdata (sound_class,NULL , -MKDEV (SOUND_MAJOR , dev_list[i].minor), -NULL ,"%s" , dev_list[i].name); +device_create (sound_class,NULL , +MKDEV (SOUND_MAJOR , dev_list[i].minor),NULL , +"%s" , dev_list[i].name);if (!dev_list[i].num)continue ;for (j =1 ; j < *dev_list[i].num; j++) -device_create_drvdata (sound_class,NULL , -MKDEV (SOUND_MAJOR , - dev_list[i].minor + (j*0x10 )), -NULL , -"%s%d" , dev_list[i].name, j); +device_create (sound_class,NULL , +MKDEV (SOUND_MAJOR , + dev_list[i].minor + (j*0x10 )), +NULL ,"%s%d" , dev_list[i].name, j); }if (sound_nblocks >=1024 )
sound/sound_core.c +2 -3
@@ -220,9 +220,8 @@ static int sound_insert_unit(struct sound_unit **list, const struct file_operatielse sprintf (s->name,"sound/%s%d" , name, r /SOUND_STEP ); -device_create_drvdata (sound_class, dev, -MKDEV (SOUND_MAJOR , s->unit_minor), -NULL , s->name+6 ); +device_create (sound_class, dev,MKDEV (SOUND_MAJOR , s->unit_minor), +NULL , s->name+6 );return r; fail:
Signature · 1 line
1.6.0.2
PATCH 12/46 device create: usb: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/usb/core/devio.c | 6 +++--- drivers/usb/core/file.c | 6 +++--- drivers/usb/core/hcd.c | 5 ++--- drivers/usb/gadget/printer.c | 4 ++-- drivers/usb/misc/phidgetkit.c | 5 ++--- drivers/usb/misc/phidgetmotorcontrol.c | 5 ++--- drivers/usb/misc/phidgetservo.c | 5 ++--- drivers/usb/mon/mon_bin.c | 6 +++--- 8 files changed, 19 insertions(+), 23 deletions(-)
drivers/usb/core/devio.c +3 -3
@@ -1729,9 +1729,9 @@ static int usb_classdev_add(struct usb_device *dev) {struct device *cldev; - cldev =device_create_drvdata (usb_classdev_class, &dev->dev, - dev->dev.devt,NULL ,"usbdev%d.%d" , - dev->bus->busnum, dev->devnum); + cldev =device_create (usb_classdev_class, &dev->dev, dev->dev.devt, +NULL ,"usbdev%d.%d" , dev->bus->busnum, + dev->devnum);if (IS_ERR (cldev))return PTR_ERR (cldev); dev->usb_classdev = cldev;
drivers/usb/core/file.c +3 -3
@@ -196,9 +196,9 @@ int usb_register_dev(struct usb_interface *intf, ++temp; else temp = name; - intf->usb_dev =device_create_drvdata (usb_class->class, &intf->dev, -MKDEV (USB_MAJOR , minor),NULL , -"%s" , temp); + intf->usb_dev =device_create (usb_class->class, &intf->dev, +MKDEV (USB_MAJOR , minor),NULL , +"%s" , temp);if (IS_ERR (intf->usb_dev)) {down_write (&minor_rwsem); usb_minors[intf->minor] =NULL ;
drivers/usb/core/hcd.c +2 -3
@@ -818,9 +818,8 @@ static int usb_register_bus(struct usb_bus *bus)set_bit (busnum, busmap.busmap); bus->busnum = busnum; - bus->dev =device_create_drvdata (usb_host_class, bus->controller, -MKDEV (0 ,0 ), bus, -"usb_host%d" , busnum); + bus->dev =device_create (usb_host_class, bus->controller,MKDEV (0 ,0 ), + bus,"usb_host%d" , busnum); result =PTR_ERR (bus->dev);if (IS_ERR (bus->dev)) goto error_create_class_dev;
drivers/usb/gadget/printer.c +2 -2
@@ -1360,8 +1360,8 @@ printer_bind(struct usb_gadget *gadget)/* Setup the sysfs files for the printer gadget. */ - dev->pdev =device_create_drvdata (usb_gadget_class,NULL , - g_printer_devno,NULL ,"g_printer" ); + dev->pdev =device_create (usb_gadget_class,NULL , g_printer_devno, +NULL ,"g_printer" );if (IS_ERR (dev->pdev)) {ERROR (dev,"Failed to create device: g_printer\n" ); goto fail;
drivers/usb/misc/phidgetkit.c +2 -3
@@ -595,9 +595,8 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic }while (value); kit->dev_no = bit; - kit->dev =device_create_drvdata (phidget_class, &kit->udev->dev, -MKDEV (0 ,0 ), kit, -"interfacekit%d" , kit->dev_no); + kit->dev =device_create (phidget_class, &kit->udev->dev,MKDEV (0 ,0 ), + kit,"interfacekit%d" , kit->dev_no);if (IS_ERR (kit->dev)) { rc =PTR_ERR (kit->dev); kit->dev =NULL ;
drivers/usb/misc/phidgetmotorcontrol.c +2 -3
@@ -365,9 +365,8 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic }while (value); mc->dev_no = bit; - mc->dev =device_create_drvdata (phidget_class, &mc->udev->dev, -MKDEV (0 ,0 ), mc, -"motorcontrol%d" , mc->dev_no); + mc->dev =device_create (phidget_class, &mc->udev->dev,MKDEV (0 ,0 ), mc, +"motorcontrol%d" , mc->dev_no);if (IS_ERR (mc->dev)) { rc =PTR_ERR (mc->dev); mc->dev =NULL ;
drivers/usb/misc/phidgetservo.c +2 -3
@@ -275,9 +275,8 @@ servo_probe(struct usb_interface *interface, const struct usb_device_id *id) }while (value); dev->dev_no = bit; - dev->dev =device_create_drvdata (phidget_class, &dev->udev->dev, -MKDEV (0 ,0 ), dev, -"servo%d" , dev->dev_no); + dev->dev =device_create (phidget_class, &dev->udev->dev,MKDEV (0 ,0 ), + dev,"servo%d" , dev->dev_no);if (IS_ERR (dev->dev)) { rc =PTR_ERR (dev->dev); dev->dev =NULL ;
drivers/usb/mon/mon_bin.c +3 -3
@@ -1162,9 +1162,9 @@ int mon_bin_add(struct mon_bus *mbus, const struct usb_bus *ubus)if (minor >=MON_BIN_MAX_MINOR )return 0 ; - dev =device_create_drvdata (mon_bin_class, ubus? ubus->controller:NULL , -MKDEV (MAJOR (mon_bin_dev0), minor),NULL , -"usbmon%d" , minor); + dev =device_create (mon_bin_class, ubus ? ubus->controller :NULL , +MKDEV (MAJOR (mon_bin_dev0), minor),NULL , +"usbmon%d" , minor);if (IS_ERR (dev))return 0 ;
Signature · 1 line
1.6.0.2
PATCH 13/46 device create: video: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/video/console/fbcon.c | 4 ++-- drivers/video/display/display-sysfs.c | 9 +++------ drivers/video/fbmem.c | 5 ++--- 3 files changed, 7 insertions(+), 11 deletions(-)
drivers/video/console/fbcon.c +2 -2
@@ -3573,8 +3573,8 @@ static int __init fb_console_init(void)acquire_console_sem ();fb_register_client (&fbcon_event_notifier); - fbcon_device =device_create_drvdata (fb_class,NULL ,MKDEV (0 ,0 ), -NULL ,"fbcon" ); + fbcon_device =device_create (fb_class,NULL ,MKDEV (0 ,0 ),NULL , +"fbcon" );if (IS_ERR (fbcon_device)) { printk(KERN_WARNING "Unable to create device "
drivers/video/display/display-sysfs.c +3 -6
@@ -153,12 +153,9 @@ struct display_device *display_device_register(struct display_driver *driver,mutex_unlock (&allocated_dsp_lock);if (!ret) { - new_dev->dev =device_create_drvdata (display_class, - parent, -MKDEV (0 ,0 ), - new_dev, -"display%d" , - new_dev->idx); + new_dev->dev =device_create (display_class, parent, +MKDEV (0 ,0 ), new_dev, +"display%d" , new_dev->idx);if (!IS_ERR (new_dev->dev)) { new_dev->parent = parent; new_dev->driver = driver;
drivers/video/fbmem.c +2 -3
@@ -1443,9 +1443,8 @@ register_framebuffer(struct fb_info *fb_info)break ; fb_info->node = i; - fb_info->dev =device_create_drvdata (fb_class, fb_info->device, -MKDEV (FB_MAJOR , i),NULL , -"fb%d" , i); + fb_info->dev =device_create (fb_class, fb_info->device, +MKDEV (FB_MAJOR , i),NULL ,"fb%d" , i);if (IS_ERR (fb_info->dev)) {/* Not fatal */ printk (KERN_WARNING "Unable to create device for framebuffer %d; errno = %ld\n" , i,PTR_ERR (fb_info->dev));
Signature · 1 line
1.6.0.2
PATCH 14/46 device create: ide: convert device_create_drvdata to device_create
In reply to Greg KHNow that device_create() has been audited, rename things back to the original call to be sane.
--- drivers/ide/ide-probe.c | 4 ++-- drivers/ide/ide-tape.c | 11 +++++------ 2 files changed, 7 insertions(+), 8 deletions(-)
drivers/ide/ide-probe.c +2 -2
@@ -657,8 +657,8 @@ static int ide_register_port(ide_hwif_t *hwif) goto out; } - hwif->portdev =device_create_drvdata (ide_port_class, &hwif->gendev, -MKDEV (0 ,0 ), hwif, hwif->name); + hwif->portdev =device_create (ide_port_class, &hwif->gendev, +MKDEV (0 ,0 ), hwif, hwif->name);if (IS_ERR (hwif->portdev)) { ret =PTR_ERR (hwif->portdev);device_unregister (&hwif->gendev);
drivers/ide/ide-tape.c +5 -6
@@ -2420,12 +2420,11 @@ static int ide_tape_probe(ide_drive_t *drive)idetape_setup (drive, tape, minor); -device_create_drvdata (idetape_sysfs_class, &drive->gendev, -MKDEV (IDETAPE_MAJOR , minor),NULL , -"%s" , tape->name); -device_create_drvdata (idetape_sysfs_class, &drive->gendev, -MKDEV (IDETAPE_MAJOR , minor +128 ),NULL , -"n%s" , tape->name); +device_create (idetape_sysfs_class, &drive->gendev, +MKDEV (IDETAPE_MAJOR , minor),NULL ,"%s" , tape->name); +device_create (idetape_sysfs_class, &drive->gendev, +MKDEV (IDETAPE_MAJOR , minor +128 ),NULL , +"n%s" , tape->name); g->fops = &idetape_block_ops;ide_register_region (g);
Signature · 1 line
1.6.0.2
PATCH 15/46 device create: remove device_create_drvdata
In reply to Greg KHNow that the tree is cleaned up, device_create_drvdata can be safely removed.
--- include/linux/device.h | 1 - 1 files changed, 0 insertions(+), 1 deletions(-)
include/linux/device.h +0 -1
@@ -502,7 +502,6 @@ extern struct device *device_create(struct class *cls, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...) __attribute__((format(printf, 5, 6))); -#define device_create_drvdata device_createextern void device_destroy (struct class *cls,dev_t devt);/*
Signature · 1 line
1.6.0.2
PATCH 16/46 usb gadget: link fixes for serial gadget
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the serial gadget driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
--- drivers/usb/gadget/Makefile | 2 +- drivers/usb/gadget/serial.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletions(-)
drivers/usb/gadget/Makefile +1 -1
@@ -26,7 +26,7 @@ C_UTILS = composite.o usbstring.o config.o epautoconf.o g_zero-objs := zero.o f_sourcesink.o f_loopback.o $(C_UTILS) g_ether-objs := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS) -g_serial-objs := serial.o u_serial.o f_acm.o f_serial.o $(C_UTILS) +g_serial-objs := serial.o g_midi-objs := gmidi.o usbstring.o config.o epautoconf.o gadgetfs-objs := inode.o g_file_storage-objs := file_storage.o usbstring.o config.o \
drivers/usb/gadget/serial.c +18 -0
@@ -30,6 +30,24 @@/*-------------------------------------------------------------------------*/ +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ +#include "composite.c" +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" + +#include "f_acm.c" +#include "f_serial.c" +#include "u_serial.c" + +/*-------------------------------------------------------------------------*/ +/* Thanks to NetChip Technologies for donating this product ID. * * DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!!
Signature · 1 line
1.6.0.2
PATCH 17/46 usb gadget: link fixes for gadget zero
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the Gadget Zero driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
--- drivers/usb/gadget/Makefile | 2 +- drivers/usb/gadget/f_loopback.c | 34 ++++++++++++++++++---------------- drivers/usb/gadget/zero.c | 17 +++++++++++++++++ 3 files changed, 36 insertions(+), 17 deletions(-)
drivers/usb/gadget/Makefile +1 -1
@@ -24,7 +24,7 @@ obj-$(CONFIG_USB_M66592) += m66592-udc.o # C_UTILS = composite.o usbstring.o config.o epautoconf.o -g_zero-objs := zero.o f_sourcesink.o f_loopback.o $(C_UTILS) +g_zero-objs := zero.o g_ether-objs := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS) g_serial-objs := serial.o g_midi-objs := gmidi.o usbstring.o config.o epautoconf.o
drivers/usb/gadget/f_loopback.c +18 -16
@@ -70,7 +70,7 @@ static struct usb_interface_descriptor loopback_intf = {/* full speed support: */ -static struct usb_endpoint_descriptor fs_source_desc = { +static struct usb_endpoint_descriptor fs_loop_source_desc = { .bLength =USB_DT_ENDPOINT_SIZE , .bDescriptorType =USB_DT_ENDPOINT ,
@@ -78,7 +78,7 @@ static struct usb_endpoint_descriptor fs_source_desc = { .bmAttributes = USB_ENDPOINT_XFER_BULK, }; -static struct usb_endpoint_descriptor fs_sink_desc = { +static struct usb_endpoint_descriptor fs_loop_sink_desc = { .bLength =USB_DT_ENDPOINT_SIZE , .bDescriptorType =USB_DT_ENDPOINT ,
@@ -88,14 +88,14 @@ static struct usb_endpoint_descriptor fs_sink_desc = {static struct usb_descriptor_header *fs_loopback_descs[] = { (struct usb_descriptor_header *) &loopback_intf, - (struct usb_descriptor_header *) &fs_sink_desc, - (struct usb_descriptor_header *) &fs_source_desc, + (struct usb_descriptor_header *) &fs_loop_sink_desc, + (struct usb_descriptor_header *) &fs_loop_source_desc,NULL , };/* high speed support: */ -static struct usb_endpoint_descriptor hs_source_desc = { +static struct usb_endpoint_descriptor hs_loop_source_desc = { .bLength =USB_DT_ENDPOINT_SIZE , .bDescriptorType =USB_DT_ENDPOINT ,
@@ -103,7 +103,7 @@ static struct usb_endpoint_descriptor hs_source_desc = { .wMaxPacketSize = __constant_cpu_to_le16(512), }; -static struct usb_endpoint_descriptor hs_sink_desc = { +static struct usb_endpoint_descriptor hs_loop_sink_desc = { .bLength =USB_DT_ENDPOINT_SIZE , .bDescriptorType =USB_DT_ENDPOINT ,
@@ -113,8 +113,8 @@ static struct usb_endpoint_descriptor hs_sink_desc = {static struct usb_descriptor_header *hs_loopback_descs[] = { (struct usb_descriptor_header *) &loopback_intf, - (struct usb_descriptor_header *) &hs_source_desc, - (struct usb_descriptor_header *) &hs_sink_desc, + (struct usb_descriptor_header *) &hs_loop_source_desc, + (struct usb_descriptor_header *) &hs_loop_sink_desc,NULL , };
@@ -152,7 +152,7 @@ loopback_bind(struct usb_configuration *c, struct usb_function *f)/* allocate endpoints */ - loop->in_ep =usb_ep_autoconfig (cdev->gadget, &fs_source_desc); + loop->in_ep =usb_ep_autoconfig (cdev->gadget, &fs_loop_source_desc);if (!loop->in_ep) { autoconf_fail: ERROR(cdev, "%s: can't autoconfigure on %s\n",
@@ -161,17 +161,17 @@ autoconf_fail: } loop->in_ep->driver_data = cdev;/* claim */ - loop->out_ep =usb_ep_autoconfig (cdev->gadget, &fs_sink_desc); + loop->out_ep =usb_ep_autoconfig (cdev->gadget, &fs_loop_sink_desc);if (!loop->out_ep) goto autoconf_fail; loop->out_ep->driver_data = cdev;/* claim */ /* support high speed hardware */ if (gadget_is_dualspeed (c->cdev->gadget)) { - hs_source_desc.bEndpointAddress = - fs_source_desc.bEndpointAddress; - hs_sink_desc.bEndpointAddress = - fs_sink_desc.bEndpointAddress; + hs_loop_source_desc.bEndpointAddress = + fs_loop_source_desc.bEndpointAddress; + hs_loop_sink_desc.bEndpointAddress = + fs_loop_sink_desc.bEndpointAddress; f->hs_descriptors = hs_loopback_descs; }
@@ -255,8 +255,10 @@ enable_loopback(struct usb_composite_dev *cdev, struct f_loopback *loop)struct usb_request *req;unsigned i; - src =ep_choose (cdev->gadget, &hs_source_desc, &fs_source_desc); - sink =ep_choose (cdev->gadget, &hs_sink_desc, &fs_sink_desc); + src =ep_choose (cdev->gadget, + &hs_loop_source_desc, &fs_loop_source_desc); + sink =ep_choose (cdev->gadget, + &hs_loop_sink_desc, &fs_loop_sink_desc);/* one endpoint writes data back IN to the host */ ep = loop->in_ep;
drivers/usb/gadget/zero.c +17 -0
@@ -59,6 +59,23 @@/*-------------------------------------------------------------------------*/ +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ +#include "composite.c" +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" + +#include "f_sourcesink.c" +#include "f_loopback.c" + +/*-------------------------------------------------------------------------*/ +#define DRIVER_VERSION "Cinco de Mayo 2008"static const char longname[] ="Gadget Zero" ;
Signature · 1 line
1.6.0.2
PATCH 18/46 usb gadget: link fixes for MIDI gadget
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the MIDI gadget driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
--- drivers/usb/gadget/Makefile | 2 +- drivers/usb/gadget/gmidi.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletions(-)
drivers/usb/gadget/Makefile +1 -1
@@ -27,7 +27,7 @@ C_UTILS = composite.o usbstring.o config.o epautoconf.o g_zero-objs := zero.o g_ether-objs := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS) g_serial-objs := serial.o -g_midi-objs := gmidi.o usbstring.o config.o epautoconf.o +g_midi-objs := gmidi.o gadgetfs-objs := inode.o g_file_storage-objs := file_storage.o usbstring.o config.o \ epautoconf.o
drivers/usb/gadget/gmidi.c +15 -0
@@ -35,6 +35,21 @@#include "gadget_chips.h" + +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" + +/*-------------------------------------------------------------------------*/ + +MODULE_AUTHOR ("Ben Williamson" );MODULE_LICENSE ("GPL v2" );
Signature · 1 line
1.6.0.2
PATCH 19/46 usb gadget: link fixes for printer gadget
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the printer gadget driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
--- drivers/usb/gadget/Makefile | 3 +-- drivers/usb/gadget/printer.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-)
drivers/usb/gadget/Makefile +1 -2
@@ -31,8 +31,7 @@ g_midi-objs := gmidi.o gadgetfs-objs := inode.o g_file_storage-objs := file_storage.o usbstring.o config.o \ epautoconf.o -g_printer-objs := printer.o usbstring.o config.o \ - epautoconf.o +g_printer-objs := printer.o g_cdc-objs := cdc2.o u_ether.o f_ecm.o \ u_serial.o f_acm.o $(C_UTILS)
drivers/usb/gadget/printer.c +14 -0
@@ -53,6 +53,20 @@#include "gadget_chips.h" + +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" + +/*-------------------------------------------------------------------------*/ +#define DRIVER_DESC "Printer Gadget"#define DRIVER_VERSION "2007 OCT 06"
Signature · 1 line
1.6.0.2
PATCH 20/46 usb gadget: link fixes for storage gadget
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the file storage gadget driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
--- drivers/usb/gadget/Makefile | 3 +-- drivers/usb/gadget/file_storage.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-)
drivers/usb/gadget/Makefile +1 -2
@@ -29,8 +29,7 @@ g_ether-objs := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS) g_serial-objs := serial.o g_midi-objs := gmidi.o gadgetfs-objs := inode.o -g_file_storage-objs := file_storage.o usbstring.o config.o \ - epautoconf.o +g_file_storage-objs := file_storage.o g_printer-objs := printer.o g_cdc-objs := cdc2.o u_ether.o f_ecm.o \ u_serial.o f_acm.o $(C_UTILS)
drivers/usb/gadget/file_storage.c +12 -0
@@ -245,6 +245,18 @@#include "gadget_chips.h" + +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" +/*-------------------------------------------------------------------------*/ #define DRIVER_DESC "File-backed Storage Gadget"
Signature · 1 line
1.6.0.2
PATCH 21/46 usb gadget: link fixes for cdc composite gadget
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the CDC Composite gadget driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
--- drivers/usb/gadget/Makefile | 3 +-- drivers/usb/gadget/cdc2.c | 25 +++++++++++++++++++++++-- drivers/usb/gadget/u_ether.c | 4 ++-- 3 files changed, 26 insertions(+), 6 deletions(-)
drivers/usb/gadget/Makefile +1 -2
@@ -31,8 +31,7 @@ g_midi-objs := gmidi.o gadgetfs-objs := inode.o g_file_storage-objs := file_storage.o g_printer-objs := printer.o -g_cdc-objs := cdc2.o u_ether.o f_ecm.o \ - u_serial.o f_acm.o $(C_UTILS) +g_cdc-objs := cdc2.o ifeq ($(CONFIG_USB_ETH_RNDIS),y) g_ether-objs += f_rndis.o rndis.o
drivers/usb/gadget/cdc2.c +23 -2
@@ -43,6 +43,25 @@/*-------------------------------------------------------------------------*/ +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ + +#include "composite.c" +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" +#include "u_serial.c" +#include "f_acm.c" +#include "f_ecm.c" +#include "u_ether.c" + +/*-------------------------------------------------------------------------*/ +static struct usb_device_descriptor device_desc = { .bLength =sizeof device_desc, .bDescriptorType =USB_DT_DEVICE ,
@@ -148,7 +167,8 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)int status;if (!can_support_ecm (cdev->gadget)) { -ERROR (cdev,"controller '%s' not usable\n" , gadget->name); +dev_err (&gadget->dev,"controller '%s' not usable\n" , + gadget->name);return -EINVAL ; }
@@ -203,7 +223,8 @@ static int __init cdc_bind(struct usb_composite_dev *cdev)if (status <0 ) goto fail1; -INFO (cdev,"%s, version: " DRIVER_VERSION "\n" ,DRIVER_DESC ); +dev_info (&gadget->dev,"%s, version: " DRIVER_VERSION "\n" , +DRIVER_DESC );return 0 ;
drivers/usb/gadget/u_ether.c +2 -2
@@ -52,7 +52,7 @@* this single "physical" link to be used by multiple virtual links.) */ -#define DRIVER_VERSION "29-May-2008" +#define UETH__VERSION "29-May-2008"struct eth_dev {/* lock is held while accessing port_usb
@@ -170,7 +170,7 @@ static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)struct eth_dev *dev =netdev_priv (net);strlcpy (p->driver,"g_ether" ,sizeof p->driver); -strlcpy (p->version,DRIVER_VERSION ,sizeof p->version); +strlcpy (p->version,UETH__VERSION ,sizeof p->version);strlcpy (p->fw_version, dev->gadget->name,sizeof p->fw_version);strlcpy (p->bus_info,dev_name (&dev->gadget->dev),sizeof p->bus_info); }
Signature · 1 line
1.6.0.2
PATCH 22/46 usb gadget: link fixes for network gadget
In reply to Greg KHFrom: David Brownell <[email protected]>
Change how the Ethernet/RNDIS gadget driver builds: don't use separate compilation, since it works poorly when key parts are library code (with init sections etc). Instead be as close as we can to "gcc --combine ...".
This is a bit more complicated than most of the others because it had to resolve a few symbol collisions.
--- drivers/usb/gadget/Makefile | 8 +--- drivers/usb/gadget/ether.c | 28 +++++++++- drivers/usb/gadget/f_ecm.c | 108 +++++++++++++++++++------------------- drivers/usb/gadget/f_subset.c | 44 ++++++++-------- drivers/usb/gadget/rndis.c | 115 +++++++++++++++++++--------------------- 5 files changed, 158 insertions(+), 145 deletions(-)
drivers/usb/gadget/Makefile +1 -7
@@ -22,10 +22,8 @@ obj-$(CONFIG_USB_M66592) += m66592-udc.o # # USB gadget drivers # -C_UTILS = composite.o usbstring.o config.o epautoconf.o - g_zero-objs := zero.o -g_ether-objs := ether.o u_ether.o f_subset.o f_ecm.o $(C_UTILS) +g_ether-objs := ether.o g_serial-objs := serial.o g_midi-objs := gmidi.o gadgetfs-objs := inode.o
@@ -33,10 +31,6 @@ g_file_storage-objs := file_storage.o g_printer-objs := printer.o g_cdc-objs := cdc2.o -ifeq ($(CONFIG_USB_ETH_RNDIS),y) - g_ether-objs += f_rndis.o rndis.o -endif - obj-$(CONFIG_USB_ZERO) += g_zero.o obj-$(CONFIG_USB_ETH) += g_ether.o obj-$(CONFIG_USB_GADGETFS) += gadgetfs.o
drivers/usb/gadget/ether.c +26 -2
@@ -96,6 +96,28 @@ static inline bool has_rndis(void)/*-------------------------------------------------------------------------*/ +/* +* Kbuild is not very cooperative with respect to linking separately +* compiled library objects into one module. So for now we won't use +* separate compilation ... ensuring init/exit sections work to shrink +* the runtime footprint, and giving us at least some parts of what +* a "gcc --combine ... part1.c part2.c part3.c ... " build would. +*/ +#include "composite.c" +#include "usbstring.c" +#include "config.c" +#include "epautoconf.c" + +#include "f_ecm.c" +#include "f_subset.c" +#ifdef CONFIG_USB_ETH_RNDIS +#include "f_rndis.c" +#include "rndis.c" +#endif +#include "u_ether.c" + +/*-------------------------------------------------------------------------*/ +/* DO NOT REUSE THESE IDs with a protocol-incompatible driver!! Ever!! * Instead: allocate your own, using normal USB-IF procedures. */
@@ -293,7 +315,8 @@ static int __init eth_bind(struct usb_composite_dev *cdev)* but if the controller isn't recognized at all then * that assumption is a bit more likely to be wrong. */ -WARNING (cdev,"controller '%s' not recognized; trying %s\n" , +dev_warn (&gadget->dev, +"controller '%s' not recognized; trying %s\n" , gadget->name, eth_config_driver.label); device_desc.bcdDevice =
@@ -332,7 +355,8 @@ static int __init eth_bind(struct usb_composite_dev *cdev)if (status <0 ) goto fail; -INFO (cdev,"%s, version: " DRIVER_VERSION "\n" ,DRIVER_DESC ); +dev_info (&gadget->dev,"%s, version: " DRIVER_VERSION "\n" , +DRIVER_DESC );return 0 ;
drivers/usb/gadget/f_ecm.c +54 -54
256 lines not on this page · raw message
drivers/usb/gadget/f_subset.c +22 -22
121 lines not on this page · raw message
drivers/usb/gadget/rndis.c +55 -60
416 lines not on this page · raw message
Signature · 1 line
1.6.0.2
PATCH 23/46 driver core: basic infrastructure for per-module dynamic debug messages
In reply to Greg KHFrom: Jason Baron <[email protected]>
Base infrastructure to enable per-module debug messages.
I've introduced CONFIG_DYNAMIC_PRINTK_DEBUG, which when enabled centralizes control of debugging statements on a per-module basis in one /proc file, currently, <debugfs>/dynamic_printk/modules. When, CONFIG_DYNAMIC_PRINTK_DEBUG, is not set, debugging statements can still be enabled as before, often by defining 'DEBUG' for the proper compilation unit. Thus, this patch set has no affect when CONFIG_DYNAMIC_PRINTK_DEBUG is not set.
The infrastructure currently ties into all pr_debug() and dev_dbg() calls. That is, if CONFIG_DYNAMIC_PRINTK_DEBUG is set, all pr_debug() and dev_dbg() calls can be dynamically enabled/disabled on a per-module basis.
Future plans include extending this functionality to subsystems, that define their own debug levels and flags.
Usage:
Dynamic debugging is controlled by the debugfs file, <debugfs>/dynamic_printk/modules. This file contains a list of the modules that can be enabled. The format of the file is as follows:
<module_name> <enabled=0/1> . . . <module_name> : Name of the module in which the debug call resides <enabled=0/1> : whether the messages are enabled or not
For example:
snd_hda_intel enabled=0
fixup enabled=1
driver enabled=0
Enable a module:
$echo "set enabled=1 <module_name>" > dynamic_printk/modules
Disable a module:
$echo "set enabled=0 <module_name>" > dynamic_printk/modules
Enable all modules:
$echo "set enabled=1 all" > dynamic_printk/modules
Disable all modules:
$echo "set enabled=0 all" > dynamic_printk/modules
Finally, passing "dynamic_printk" at the command line enables debugging for all modules. This mode can be turned off via the above disable command.
[gkh: minor cleanups and tweaks to make the build work quietly]
--- Documentation/kernel-parameters.txt | 5 + include/asm-generic/vmlinux.lds.h | 10 +- include/linux/device.h | 6 +- include/linux/dynamic_printk.h | 93 ++++++++ include/linux/kernel.h | 7 +- include/linux/module.h | 1 - kernel/module.c | 31 +++ lib/Kconfig.debug | 55 +++++ lib/Makefile | 2 + lib/dynamic_printk.c | 418 +++++++++++++++++++++++++++++++++++ net/netfilter/nf_conntrack_pptp.c | 2 +- scripts/Makefile.lib | 11 +- scripts/basic/Makefile | 2 +- scripts/basic/hash.c | 64 ++++++ 14 files changed, 700 insertions(+), 7 deletions(-) create mode 100644 include/linux/dynamic_printk.h create mode 100644 lib/dynamic_printk.c create mode 100644 scripts/basic/hash.c
Documentation/kernel-parameters.txt +5 -0
@@ -1713,6 +1713,11 @@ and is between 256 and 4096 characters. It is defined in the file autoconfiguration. Ranges are in pairs (memory base and size). + dynamic_printk + Enables pr_debug()/dev_dbg() calls if + CONFIG_DYNAMIC_PRINTK_DEBUG has been enabled. These can also + be switched on/off via <debugfs>/dynamic_printk/modules + print-fatal-signals= [KNL] debug: print fatal signals print-fatal-signals=1: print segfault info to
include/asm-generic/vmlinux.lds.h +9 -1
@@ -268,7 +268,15 @@ CPU_DISCARD(init.data) \ CPU_DISCARD(init.rodata) \ MEM_DISCARD(init.data) \ - MEM_DISCARD(init.rodata) +MEM_DISCARD (init.rodata) \ + /* implement dynamic printk debug */ \ + VMLINUX_SYMBOL(__start___verbose_strings) = .; \ + *(__verbose_strings ) \ + VMLINUX_SYMBOL(__stop___verbose_strings) = .; \ + . = ALIGN(8); \ + VMLINUX_SYMBOL(__start___verbose) = .; \ + *(__verbose ) \ + VMLINUX_SYMBOL(__stop___verbose) = .;#define INIT_TEXT \ *(.init.text) \
include/linux/device.h +5 -1
@@ -550,7 +550,11 @@ extern const char *dev_driver_string(const struct device *dev); #define dev_info(dev, format, arg...) \ dev_printk(KERN_INFO , dev , format , ## arg) -#ifdef DEBUG +#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG ) +#define dev_dbg (dev, format, ...) do { \ + dynamic_dev_dbg(dev, format, ##__VA_ARGS__); \ + } while (0) +#elif defined(DEBUG ) #define dev_dbg(dev, format, arg...) \ dev_printk(KERN_DEBUG , dev , format , ## arg)#else
include/linux/dynamic_printk.h new file +93 -0
93 lines not on this page · raw message
include/linux/kernel.h +6 -1
@@ -16,6 +16,7 @@#include <linux/log2.h> #include <linux/typecheck.h> #include <linux/ratelimit.h> +#include <linux/dynamic_printk.h> #include <asm/byteorder.h> #include <asm/bug.h>
@@ -303,8 +304,12 @@ static inline char *pack_hex_byte(char *buf, u8 byte) #define pr_info(fmt, arg...) \ printk(KERN_INFO fmt, ##arg) -#ifdef DEBUG /* If you are writing a driver, please use dev_dbg instead */ +#if defined(CONFIG_DYNAMIC_PRINTK_DEBUG ) +#define pr_debug (fmt, ...) do { \ + dynamic_pr_debug(fmt, ##__VA_ARGS__); \ + } while (0) +#elif defined(DEBUG ) #define pr_debug(fmt, arg...) \ printk(KERN_DEBUG fmt, ##arg)#else
include/linux/module.h +0 -1
@@ -345,7 +345,6 @@ struct module/* Reference counts */ struct module_ref ref[NR_CPUS ];#endif - };#ifndef MODULE_ARCH_INIT #define MODULE_ARCH_INIT {}
kernel/module.c +31 -0
@@ -784,6 +784,7 @@ sys_delete_module(const char __user *name_user, unsigned int flags)mutex_lock (&module_mutex);/* Store the name of the last unloaded module for diagnostic purposes */ strlcpy (last_unloaded_module, mod->name,sizeof (last_unloaded_module)); +unregister_dynamic_debug_module (mod->name);free_module (mod); out:
@@ -1783,6 +1784,33 @@ static inline void add_kallsyms(struct module *mod, }#endif /* CONFIG_KALLSYMS */ +#ifdef CONFIG_DYNAMIC_PRINTK_DEBUG +static void dynamic_printk_setup (Elf_Shdr *sechdrs,unsigned int verboseindex) +{ +struct mod_debug *debug_info; +unsigned long pos, end; +unsigned int num_verbose; + + pos = sechdrs[verboseindex].sh_addr; + num_verbose = sechdrs[verboseindex].sh_size / +sizeof (struct mod_debug ); + end = pos + (num_verbose *sizeof (struct mod_debug )); + +for (; pos < end; pos +=sizeof (struct mod_debug )) { + debug_info = (struct mod_debug *)pos; +register_dynamic_debug_module (debug_info->modname, + debug_info->type, debug_info->logical_modname, + debug_info->flag_names, debug_info->hash, + debug_info->hash2); + } +} +#else +static inline void dynamic_printk_setup (Elf_Shdr *sechdrs, +unsigned int verboseindex) +{ +} +#endif /* CONFIG_DYNAMIC_PRINTK_DEBUG */ +static void *module_alloc_update_bounds (unsigned long size) {void *ret =module_alloc (size);
@@ -1831,6 +1859,7 @@ static noinline struct module *load_module(void __user *umod,#endif unsigned int markersindex;unsigned int markersstringsindex; +unsigned int verboseindex;struct module *mod;long err =0 ;void *percpu =NULL , *ptr =NULL ;/* Stops spurious gcc warning */
@@ -2117,6 +2146,7 @@ static noinline struct module *load_module(void __user *umod, markersindex =find_sec (hdr, sechdrs, secstrings,"__markers" ); markersstringsindex =find_sec (hdr, sechdrs, secstrings,"__markers_strings" ); + verboseindex =find_sec (hdr, sechdrs, secstrings,"__verbose" );/* Now do relocations. */ for (i =1 ; i < hdr->e_shnum; i++) {
@@ -2167,6 +2197,7 @@ static noinline struct module *load_module(void __user *umod,marker_update_probe_range (mod->markers, mod->markers + mod->num_markers);#endif +dynamic_printk_setup (sechdrs, verboseindex); err =module_finalize (hdr, sechdrs, mod);if (err <0 ) goto cleanup;
lib/Kconfig.debug +55 -0
61 lines not on this page · raw message
lib/Makefile +2 -0
@@ -81,6 +81,8 @@ obj-$(CONFIG_HAVE_LMB) += lmb.o obj-$(CONFIG_HAVE_ARCH_TRACEHOOK) += syscall.o +obj-$(CONFIG_DYNAMIC_PRINTK_DEBUG) += dynamic_printk.o + hostprogs-y := gen_crc32table clean-files := crc32table.h
lib/dynamic_printk.c new file +418 -0
418 lines not on this page · raw message
net/netfilter/nf_conntrack_pptp.c +1 -1
@@ -65,7 +65,7 @@ void struct nf_conntrack_expect *exp) __read_mostly;EXPORT_SYMBOL_GPL (nf_nat_pptp_hook_expectfn); -#ifdef DEBUG +#if defined(DEBUG ) || defined(CONFIG_DYNAMIC_PRINTK_DEBUG )/* PptpControlMessageType names */ const char *const pptp_msg_name[] = { "UNKNOWN_MESSAGE",
scripts/Makefile.lib +10 -1
@@ -96,6 +96,14 @@ basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" modname_flags = $(if $(filter 1,$(words $(modname))),\ -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") +#hash values +ifdef CONFIG_DYNAMIC_PRINTK_DEBUG +debug_flags = -D"DEBUG_HASH=$(shell ./scripts/basic/hash djb2 $(@D)$(modname))"\ + -D"DEBUG_HASH2=$(shell ./scripts/basic/hash r5 $(@D)$(modname))" +else +debug_flags = +endif + orig_c_flags = $(KBUILD_CFLAGS) $(ccflags-y) $(CFLAGS_$(basetarget).o) _c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) _a_flags = $(KBUILD_AFLAGS) $(asflags-y) $(AFLAGS_$(basetarget).o)
@@ -121,7 +129,8 @@ endif c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \ $(__c_flags) $(modkern_cflags) \ - -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) + -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) \ + $(debug_flags) a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(KBUILD_CPPFLAGS) \ $(__a_flags) $(modkern_aflags)
scripts/basic/Makefile +1 -1
@@ -9,7 +9,7 @@ # fixdep: Used to generate dependency information during build process # docproc: Used in Documentation/DocBook -hostprogs-y := fixdep docproc +hostprogs-y := fixdep docproc hash always := $(hostprogs-y) # fixdep is needed to compile other host programs
scripts/basic/hash.c new file +64 -0
64 lines not on this page · raw message
Signature · 1 line
1.6.0.2
PATCH 24/46 driver core: make struct platform_pm_ops static
In reply to Greg KHFrom: Adrian Bunk <[email protected]>
This patch makes the needlessly global struct platform_pm_ops static.
--- drivers/base/platform.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/platform.c +1 -1
@@ -862,7 +862,7 @@ static int platform_pm_restore_noirq(struct device *dev)#endif /* !CONFIG_HIBERNATION */ -struct pm_ext_ops platform_pm_ops = { +static struct pm_ext_ops platform_pm_ops = { .base = { .prepare = platform_pm_prepare, .complete = platform_pm_complete,
Signature · 1 line
1.6.0.2
PATCH 25/46 sysfs: Support sysfs_notify from atomic context with new sysfs_notify_dirent
In reply to Greg KHFrom: Neil Brown <[email protected]>
Support sysfs_notify from atomic context with new sysfs_notify_dirent
sysfs_notify currently takes sysfs_mutex.
This means that it cannot be called in atomic context. sysfs_mutex is sometimes held over a malloc (sysfs_rename_dir) so it can block on low memory.
In md I want to be able to notify on a sysfs attribute from atomic context, and I don't want to block on low memory because I could be in the writeout path for freeing memory.
So:
- export the "sysfs_dirent" structure along with sysfs_get, sysfs_put and sysfs_get_dirent so I can get the sysfs_dirent that I want to notify on and hold it in an md structure.
- split sysfs_notify_dirent out of sysfs_notify so the sysfs_dirent can be notified on with no blocking (just a spinlock).
--- fs/sysfs/dir.c | 1 + fs/sysfs/file.c | 31 ++++++++++++++++++------------- fs/sysfs/mount.c | 15 +++++++++++++++ fs/sysfs/sysfs.h | 6 ++++-- include/linux/sysfs.h | 27 ++++++++++++++++++++++++--- 5 files changed, 62 insertions(+), 18 deletions(-)
fs/sysfs/dir.c +1 -0
@@ -636,6 +636,7 @@ struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,return sd; } +EXPORT_SYMBOL_GPL (sysfs_get_dirent);static int create_dir (struct kobject *kobj,struct sysfs_dirent *parent_sd,const char *name,struct sysfs_dirent **p_sd)
fs/sysfs/file.c +18 -13
@@ -453,6 +453,22 @@ static unsigned int sysfs_poll(struct file *filp, poll_table *wait)return POLLERR |POLLPRI ; } +void sysfs_notify_dirent (struct sysfs_dirent *sd) +{ +struct sysfs_open_dirent *od; + +spin_lock (&sysfs_open_dirent_lock); + + od = sd->s_attr.open; +if (od) { +atomic_inc (&od->event); +wake_up_interruptible (&od->poll); + } + +spin_unlock (&sysfs_open_dirent_lock); +} +EXPORT_SYMBOL_GPL (sysfs_notify_dirent); +void sysfs_notify (struct kobject *k,char *dir,char *attr) {struct sysfs_dirent *sd = k->sd;
@@ -463,19 +479,8 @@ void sysfs_notify(struct kobject *k, char *dir, char *attr) sd =sysfs_find_dirent (sd, dir);if (sd && attr) sd =sysfs_find_dirent (sd, attr); -if (sd) { -struct sysfs_open_dirent *od; - -spin_lock (&sysfs_open_dirent_lock); - - od = sd->s_attr.open; -if (od) { -atomic_inc (&od->event); -wake_up_interruptible (&od->poll); - } - -spin_unlock (&sysfs_open_dirent_lock); - } +if (sd) +sysfs_notify_dirent (sd);mutex_unlock (&sysfs_mutex); }
fs/sysfs/mount.c +15 -0
@@ -16,6 +16,7 @@#include <linux/mount.h> #include <linux/pagemap.h> #include <linux/init.h> +#include <linux/module.h> #include "sysfs.h"
@@ -115,3 +116,17 @@ out_err: sysfs_dir_cachep =NULL ; goto out; } + +#undef sysfs_get +struct sysfs_dirent *sysfs_get (struct sysfs_dirent *sd) +{ +return __sysfs_get (sd); +} +EXPORT_SYMBOL_GPL (sysfs_get); + +#undef sysfs_put +void sysfs_put (struct sysfs_dirent *sd) +{ +__sysfs_put (sd); +} +EXPORT_SYMBOL_GPL (sysfs_put);
fs/sysfs/sysfs.h +4 -2
@@ -124,7 +124,7 @@ int sysfs_create_subdir(struct kobject *kobj, const char *name, struct sysfs_dirent **p_sd);void sysfs_remove_subdir (struct sysfs_dirent *sd); -static inline struct sysfs_dirent *sysfs_get (struct sysfs_dirent *sd) +static inline struct sysfs_dirent *__sysfs_get (struct sysfs_dirent *sd) {if (sd) {WARN_ON (!atomic_read (&sd->s_count));
@@ -132,12 +132,14 @@ static inline struct sysfs_dirent *sysfs_get(struct sysfs_dirent *sd) }return sd; } +#define sysfs_get (sd) __sysfs_get(sd) -static inline void sysfs_put (struct sysfs_dirent *sd) +static inline void __sysfs_put (struct sysfs_dirent *sd) {if (sd &&atomic_dec_and_test (&sd->s_count))release_sysfs_dirent (sd); } +#define sysfs_put (sd) __sysfs_put(sd)/* * inode.c
include/linux/sysfs.h +24 -3
@@ -78,6 +78,8 @@ struct sysfs_ops {ssize_t (*store)(struct kobject *,struct attribute *,const char *,size_t ); }; +struct sysfs_dirent ; +#ifdef CONFIG_SYSFS int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
@@ -118,10 +120,13 @@ void sysfs_remove_file_from_group(struct kobject *kobj, const struct attribute *attr, const char *group);void sysfs_notify (struct kobject *kobj,char *dir,char *attr); - +void sysfs_notify_dirent (struct sysfs_dirent *sd); +struct sysfs_dirent *sysfs_get_dirent (struct sysfs_dirent *parent_sd, +const unsigned char *name); +struct sysfs_dirent *sysfs_get (struct sysfs_dirent *sd); +void sysfs_put (struct sysfs_dirent *sd);void sysfs_printk_last_file (void ); - -extern int __must_check sysfs_init (void ); +int __must_check sysfs_init (void );#else /* CONFIG_SYSFS */
@@ -227,6 +232,22 @@ static inline void sysfs_remove_file_from_group(struct kobject *kobj,static inline void sysfs_notify (struct kobject *kobj,char *dir,char *attr) { } +static inline void sysfs_notify_dirent (struct sysfs_dirent *sd) +{ +} +static inline +struct sysfs_dirent *sysfs_get_dirent (struct sysfs_dirent *parent_sd, +const unsigned char *name) +{ +return NULL ; +} +static inline struct sysfs_dirent *sysfs_get (struct sysfs_dirent *sd) +{ +return NULL ; +} +static inline void sysfs_put (struct sysfs_dirent *sd) +{ +}static inline int __must_check sysfs_init (void ) {
Signature · 1 line
1.6.0.2
PATCH 26/46 drivers/firmware/iscsi_ibft.c: make 3 functions static
In reply to Greg KHFrom: Adrian Bunk <[email protected]>
This patch makes the following needlessly global functions static:
- ibft_attr_show_initiator()
- ibft_attr_show_nic()
- ibft_attr_show_target()
--- drivers/firmware/iscsi_ibft.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
drivers/firmware/iscsi_ibft.c +9 -9
@@ -334,9 +334,9 @@ static void ibft_release(struct kobject *kobj)/* * Routines for parsing the iBFT data to be human readable. */ -ssize_t ibft_attr_show_initiator (struct ibft_kobject *entry, -struct ibft_attribute *attr, -char *buf) +static ssize_t ibft_attr_show_initiator (struct ibft_kobject *entry, +struct ibft_attribute *attr, +char *buf) {struct ibft_initiator *initiator = entry->initiator;void *ibft_loc = entry->header;
@@ -376,9 +376,9 @@ ssize_t ibft_attr_show_initiator(struct ibft_kobject *entry,return str - buf; } -ssize_t ibft_attr_show_nic (struct ibft_kobject *entry, -struct ibft_attribute *attr, -char *buf) +static ssize_t ibft_attr_show_nic (struct ibft_kobject *entry, +struct ibft_attribute *attr, +char *buf) {struct ibft_nic *nic = entry->nic;void *ibft_loc = entry->header;
@@ -440,9 +440,9 @@ ssize_t ibft_attr_show_nic(struct ibft_kobject *entry,return str - buf; }; -ssize_t ibft_attr_show_target (struct ibft_kobject *entry, -struct ibft_attribute *attr, -char *buf) +static ssize_t ibft_attr_show_target (struct ibft_kobject *entry, +struct ibft_attribute *attr, +char *buf) {struct ibft_tgt *tgt = entry->tgt;void *ibft_loc = entry->header;
Signature · 1 line
1.6.0.2
PATCH 27/46 Driver core: Clarify device cleanup.
In reply to Greg KHFrom: Cornelia Huck <[email protected]>
Make the comments on how to use device_initialize(), device_add() and device_register() a bit clearer - in particular, explicitly note that put_device() must be used once we tried to add the device to the hierarchy.
--- drivers/base/core.c | 23 ++++++++++++++++++----- 1 files changed, 18 insertions(+), 5 deletions(-)
drivers/base/core.c +18 -5
@@ -523,11 +523,16 @@ static void klist_children_put(struct klist_node *n)* device_initialize - init device structure. * @dev: device. * -* This prepares the device for use by other layers, -* including adding it to the device hierarchy. +* This prepares the device for use by other layers by initializing +* its fields. * It is the first half of device_register(), if called by -* that, though it can also be called separately, so one -* may use @dev's fields (e.g. the refcount). +* that function, though it can also be called separately, so one +* may use @dev's fields. In particular, get_device()/put_device() +* may be used for reference counting of @dev after calling this +* function. +* +* NOTE: Use put_device() to give up your reference instead of freeing +* @dev directly once you have called this function. */ void device_initialize (struct device *dev) {
@@ -835,9 +840,13 @@ static void device_remove_sys_dev_entry(struct device *dev)* This is part 2 of device_register(), though may be called * separately _iff_ device_initialize() has been called separately. * -* This adds it to the kobject hierarchy via kobject_add(), adds it +* This adds @dev to the kobject hierarchy via kobject_add(), adds it * to the global and sibling lists for the device, then * adds it to the other relevant subsystems of the driver model. +* +* NOTE: _Never_ directly free @dev after calling this function, even +* if it returned an error! Always use put_device() to give up your +* reference instead. */ int device_add (struct device *dev) {
@@ -965,6 +974,10 @@ done:* I.e. you should only call the two helpers separately if * have a clearly defined need to use and refcount the device * before it is added to the hierarchy. +* +* NOTE: _Never_ directly free @dev after calling this function, even +* if it returned an error! Always use put_device() to give up the +* reference initialized in this function instead. */ int device_register (struct device *dev) {
Signature · 1 line
1.6.0.2
PATCH 28/46 Driver core: Fix cleanup in device_create_vargs().
In reply to Greg KHFrom: Cornelia Huck <[email protected]>
If device_register() in device_create_vargs() fails, the device must be cleaned up with put_device() (which is also fine on NULL) instead of kfree().
--- drivers/base/core.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/core.c +1 -1
@@ -1256,7 +1256,7 @@ struct device *device_create_vargs(struct class *class, struct device *parent,return dev; error: -kfree (dev); +put_device (dev);return ERR_PTR (retval); }EXPORT_SYMBOL_GPL (device_create_vargs);
Signature · 1 line
1.6.0.2
PATCH 29/46 device model: Do a quickcheck for driver binding before doing an expensive check
In reply to Greg KHFrom: Arjan van de Ven <[email protected]>
This patch adds a quick check for the driver<->device match before taking the locks and doin gthe expensive checks. Taking the lock hurts in asynchronous boot context where the device lock gets hit; one of the init functions takes the lock and goes to do an expensive hardware init; the other init functions walk the same PCI list and get stuck on the lock as a result.
For the common case, we can know there's no chance whatsoever of a match if the device isn't in the drivers ID table... so this patch does that check as a best-effort-avoid-the-lock approach.
Bootcharts for before and after can be seen at
http://www.fenrus.org/before.svg
http://www.fenrus.org/after.svg
Note the long time "agp_ali_init" takes in the first graph; my laptop doesn't even have an ALI chip in it! (the bootgraphs look a bit dissimilar, but that's the point, the first one has a bunch of arbitrary delays in it that cause it to look very different)
This reduces my kernel boot time by about 20%
--- drivers/base/dd.c | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
drivers/base/dd.c +3 -0
@@ -257,6 +257,9 @@ static int __driver_attach(struct device *dev, void *data)* is an error. */ +if (drv->bus->match && !drv->bus->match (dev, drv)) +return 0 ; +if (dev->parent)/* Needed for USB */ down (&dev->parent->sem);down (&dev->sem);
Signature · 1 line
1.6.0.2
PATCH 30/46 sysfs: fix deadlock
In reply to Greg KHFrom: Nick Piggin <[email protected]>
Quoted 71 lines · Ingo Molnar
and it's working fine on most boxes. One testbox found this new locking scenario:
PM: Adding info for No Bus:vcsa7
EDAC DEBUG: MC0:i82860_check()=======================================================
[ INFO: possible circular locking dependency detected ] 2.6.27-rc6-tip #1
-------------------------------------------------------
X/4873 is trying to acquire lock:
(&bb->mutex){--..}, at: [<c020ba20>]mmap+0x40/0xa0but task is already holding lock:
(&mm->mmap_sem){----}, at: [<c0125a1e>]sys_mmap2+0x8e/0xc0which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&mm->mmap_sem){----}:
[<c017dc96>] validate_chain+0xa96/0xf50 [<c017ef2b>] __lock_acquire+0x2cb/0x5b0 [<c017f299>] lock_acquire+0x89/0xc0 [<c01aa8fb>] might_fault+0x6b/0x90 [<c040b618>] copy_to_user+0x38/0x60 [<c020bcfb>] read+0xfb/0x170 [<c01c09a5>] vfs_read+0x95/0x110 [<c01c1443>] sys_pread64+0x63/0x80 [<c012146f>] sysenter_do_call+0x12/0x43 [<ffffffff>] 0xffffffff-> #0 (&bb->mutex){--..}:
[<c017d8b7>] validate_chain+0x6b7/0xf50 [<c017ef2b>] __lock_acquire+0x2cb/0x5b0 [<c017f299>] lock_acquire+0x89/0xc0 [<c0d6f2ab>] __mutex_lock_common+0xab/0x3c0 [<c0d6f698>] mutex_lock_nested+0x38/0x50 [<c020ba20>] mmap+0x40/0xa0 [<c01b111e>] mmap_region+0x14e/0x450 [<c01b170f>] do_mmap_pgoff+0x2ef/0x310 [<c0125a3d>] sys_mmap2+0xad/0xc0 [<c012146f>] sysenter_do_call+0x12/0x43 [<ffffffff>] 0xffffffffother info that might help us debug this:
1 lock held by X/4873:
#0: (&mm->mmap_sem){----}, at: [<c0125a1e>]sys_mmap2+0x8e/0xc0stack backtrace: Pid: 4873, comm: X Not tainted 2.6.27-rc6-tip #1 [<c017cd09>] print_circular_bug_tail+0x79/0xc0 [<c017d8b7>] validate_chain+0x6b7/0xf50 [<c017a5b5>] ? trace_hardirqs_off_caller+0x15/0xb0 [<c017ef2b>] __lock_acquire+0x2cb/0x5b0 [<c017f299>] lock_acquire+0x89/0xc0 [<c020ba20>] ? mmap+0x40/0xa0 [<c0d6f2ab>] __mutex_lock_common+0xab/0x3c0 [<c020ba20>] ? mmap+0x40/0xa0 [<c0d6f698>] mutex_lock_nested+0x38/0x50 [<c020ba20>] ? mmap+0x40/0xa0 [<c020ba20>] mmap+0x40/0xa0 [<c01b111e>] mmap_region+0x14e/0x450 [<c01afb88>] ? arch_get_unmapped_area_topdown+0xf8/0x160 [<c01b170f>] do_mmap_pgoff+0x2ef/0x310 [<c0125a3d>] sys_mmap2+0xad/0xc0 [<c012146f>] sysenter_do_call+0x12/0x43 [<c0120000>] ? __switch_to+0x130/0x220 =======================
Quoted 6 lines
evbug.c: Event. Dev: input3, Type: 20, Code: 0, Value: 500
warning: `sudo' uses deprecated v2 capabilities in a way that may be insecure.i've attached the config.
at first sight it looks like a genuine bug in
fs/sysfs/bin.c?
Yes, it is a real bug by the looks. bin.c takes bb->mutex under mmap_sem when it is mmapped, and then does its copy_*_user under bb->mutex too.
Here is a basic fix for the sysfs lor.
From: Nick Piggin <[email protected]>
--- fs/sysfs/bin.c | 42 +++++++++++++++++++++++++++++++----------- 1 files changed, 31 insertions(+), 11 deletions(-)
fs/sysfs/bin.c +31 -11
@@ -61,6 +61,7 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off)int size = dentry->d_inode->i_size;loff_t offs = *off;int count =min_t (size_t, bytes,PAGE_SIZE ); +char *temp;if (size) {if (offs > size)
@@ -69,23 +70,33 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off) count = size - offs; } + temp =kmalloc (count,GFP_KERNEL ); +if (!temp) +return -ENOMEM ; +mutex_lock (&bb->mutex); count =fill_read (dentry, bb->buffer, offs, count); -if (count <0 ) - goto out_unlock; +if (count <0 ) { +mutex_unlock (&bb->mutex); + goto out_free; + } -if (copy_to_user (userbuf, bb->buffer, count)) { +memcpy (temp, bb->buffer, count); + +mutex_unlock (&bb->mutex); + +if (copy_to_user (userbuf, temp, count)) { count = -EFAULT ; - goto out_unlock; + goto out_free; }pr_debug ("offs = %lld, *off = %lld, count = %d\n" , offs, *off, count); *off = offs + count; - out_unlock: -mutex_unlock (&bb->mutex); + out_free: +kfree (temp);return count; }
@@ -118,6 +129,7 @@ static ssize_t write(struct file *file, const char __user *userbuf,int size = dentry->d_inode->i_size;loff_t offs = *off;int count =min_t (size_t, bytes,PAGE_SIZE ); +char *temp;if (size) {if (offs > size)
@@ -126,19 +138,27 @@ static ssize_t write(struct file *file, const char __user *userbuf, count = size - offs; } -mutex_lock (&bb->mutex); + temp =kmalloc (count,GFP_KERNEL ); +if (!temp) +return -ENOMEM ; -if (copy_from_user (bb->buffer, userbuf, count)) { +if (copy_from_user (temp, userbuf, count)) { count = -EFAULT ; - goto out_unlock; + goto out_free; } +mutex_lock (&bb->mutex); + +memcpy (bb->buffer, temp, count); + count =flush_write (dentry, bb->buffer, offs, count); +mutex_unlock (&bb->mutex); +if (count >0 ) *off = offs + count; - out_unlock: -mutex_unlock (&bb->mutex); +out_free: +kfree (temp);return count; }
Signature · 1 line
1.6.0.2
PATCH 31/46 debug: Introduce a dev_WARN() function
In reply to Greg KHFrom: Arjan van de Ven <[email protected]>
in the line of dev_printk(), this patch introduces a dev_WARN() function, that takes a struct device and then a printk format/args set of arguments. Unlike dev_printk(), the effect is that of WARN() in that a full warning message (including filename/line, module list, versions and a backtrace) is printed in addition to the device name and the arguments.
--- include/linux/device.h | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
include/linux/device.h +8 -0
@@ -570,6 +570,14 @@ extern const char *dev_driver_string(const struct device *dev); ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; })#endif +/* +* dev_WARN() acts like dev_printk(), but with the key difference +* of using a WARN/WARN_ON to get the message out, including the +* file/line information and a backtrace. +*/ +#define dev_WARN(dev, format, arg...) \ + WARN(1, "Device: %s\n" format, dev_driver_string(dev), ## arg); +/* Create alias, so I can be autoloaded. */ #define MODULE_ALIAS_CHARDEV (major,minor) \ MODULE_ALIAS("char-major-" __stringify(major) "-" __stringify(minor))
Signature · 1 line
1.6.0.2
PATCH 32/46 debug: use dev_WARN() rather than WARN_ON() in device_pm_add()
In reply to Greg KHFrom: Arjan van de Ven <[email protected]>
device_pm_add() has a WARN_ON that is showing relatively high on kerneloops.org, but unfortunately the WARN_ON is less than useful in that it doesn't print any information about what device is causing the issue.
This patch fixes this by turning the WARN_ON() into the newly introduces dev_WARN() which will print information about the device in question.
--- drivers/base/power/main.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/base/power/main.c +1 -1
@@ -83,7 +83,7 @@ void device_pm_add(struct device *dev)* transition is in progress in order to avoid leaving them * unhandled down the road */ -WARN_ON (true); +dev_WARN (dev,"Parentless device registered during a PM transaction\n" ); }list_add_tail (&dev->power.entry, &dpm_list);
Signature · 1 line
1.6.0.2
PATCH 33/46 usb: turn dev_warn+WARN_ON combos into dev_WARN
In reply to Greg KHFrom: Arjan van de Ven <[email protected]>
dev_WARN is both compacter and gives better debug information than just a WARN_ON, since people and tools will copy the device information message together with the WARN_ON in bug reports.
--- drivers/usb/host/uhci-q.c | 24 ++++++++---------------- 1 files changed, 8 insertions(+), 16 deletions(-)
drivers/usb/host/uhci-q.c +8 -16
@@ -123,14 +123,10 @@ static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci)static void uhci_free_td (struct uhci_hcd *uhci,struct uhci_td *td) { -if (!list_empty (&td->list)) { -dev_warn (uhci_dev (uhci),"td %p still in list!\n" , td); -WARN_ON (1 ); - } -if (!list_empty (&td->fl_list)) { -dev_warn (uhci_dev (uhci),"td %p still in fl_list!\n" , td); -WARN_ON (1 ); - } +if (!list_empty (&td->list)) +dev_WARN (uhci_dev (uhci),"td %p still in list!\n" , td); +if (!list_empty (&td->fl_list)) +dev_WARN (uhci_dev (uhci),"td %p still in fl_list!\n" , td);dma_pool_free (uhci->td_pool, td, td->dma_handle); }
@@ -295,10 +291,8 @@ static struct uhci_qh *uhci_alloc_qh(struct uhci_hcd *uhci,static void uhci_free_qh (struct uhci_hcd *uhci,struct uhci_qh *qh) {WARN_ON (qh->state !=QH_STATE_IDLE && qh->udev); -if (!list_empty (&qh->queue)) { -dev_warn (uhci_dev (uhci),"qh %p list not empty!\n" , qh); -WARN_ON (1 ); - } +if (!list_empty (&qh->queue)) +dev_WARN (uhci_dev (uhci),"qh %p list not empty!\n" , qh);list_del (&qh->node);if (qh->udev) {
@@ -746,11 +740,9 @@ static void uhci_free_urb_priv(struct uhci_hcd *uhci, {struct uhci_td *td, *tmp; -if (!list_empty (&urbp->node)) { -dev_warn (uhci_dev (uhci),"urb %p still on QH's list!\n" , +if (!list_empty (&urbp->node)) +dev_WARN (uhci_dev (uhci),"urb %p still on QH's list!\n" , urbp->urb); -WARN_ON (1 ); - }list_for_each_entry_safe (td, tmp, &urbp->td_list, list) {uhci_remove_td_from_urbp (td);
Signature · 1 line
1.6.0.2
PATCH 34/46 Driver core: make bus_find_device_by_name() more robust
In reply to Greg KHFrom: Peter Korsgaard <[email protected]>
Use sysfs_streq() in bus_find_device_by_name() so trailing newlines are ignored (E.G. in bind/unbind).
--- drivers/base/bus.c | 4 +--- 1 files changed, 1 insertions(+), 3 deletions(-)
drivers/base/bus.c +1 -3
@@ -333,9 +333,7 @@ static int match_name(struct device *dev, void *data) {const char *name = data; -if (strcmp (name, dev->bus_id) ==0 ) -return 1 ; -return 0 ; +return sysfs_streq (name, dev->bus_id); }/**
Signature · 1 line
1.6.0.2
PATCH 35/46 PNP: create device attributes via default device attributes
In reply to Greg KHFrom: Drew Moseley <[email protected]>
This creates the attributes before the uevent is sent.
--- drivers/pnp/base.h | 2 +- drivers/pnp/core.c | 10 +--------- drivers/pnp/driver.c | 1 + drivers/pnp/interface.c | 37 ++++++++----------------------------- 4 files changed, 11 insertions(+), 39 deletions(-)
drivers/pnp/base.h +1 -1
@@ -4,6 +4,7 @@*/ extern spinlock_t pnp_lock; +extern struct device_attribute pnp_interface_attrs[];void *pnp_alloc (long size);int pnp_register_protocol (struct pnp_protocol *protocol);
@@ -16,7 +17,6 @@ struct pnp_card *pnp_alloc_card(struct pnp_protocol *, int id, char *pnpid);int pnp_add_device (struct pnp_dev *dev);struct pnp_id *pnp_add_id (struct pnp_dev *dev,char *id); -int pnp_interface_attach_device (struct pnp_dev *dev);int pnp_add_card (struct pnp_card *card);void pnp_remove_card (struct pnp_card *card);
drivers/pnp/core.c +1 -9
@@ -159,21 +159,13 @@ struct pnp_dev *pnp_alloc_dev(struct pnp_protocol *protocol, int id, char *pnpidint __pnp_add_device (struct pnp_dev *dev) { -int ret; -pnp_fixup_device (dev); dev->status =PNP_READY ;spin_lock (&pnp_lock);list_add_tail (&dev->global_list, &pnp_global);list_add_tail (&dev->protocol_list, &dev->protocol->devices);spin_unlock (&pnp_lock); - - ret =device_register (&dev->dev); -if (ret) -return ret; - -pnp_interface_attach_device (dev); -return 0 ; +return device_register (&dev->dev); }/*
drivers/pnp/driver.c +1 -0
@@ -206,6 +206,7 @@ struct bus_type pnp_bus_type = { .remove = pnp_device_remove, .suspend = pnp_bus_suspend, .resume = pnp_bus_resume, + .dev_attrs = pnp_interface_attrs, };int pnp_register_driver (struct pnp_driver *drv)
drivers/pnp/interface.c +8 -29
@@ -243,8 +243,6 @@ static ssize_t pnp_show_options(struct device *dmdev,return ret; } -static DEVICE_ATTR(options, S_IRUGO, pnp_show_options, NULL); -static ssize_t pnp_show_current_resources (struct device *dmdev,struct device_attribute *attr,char *buf)
@@ -420,9 +418,6 @@ done:return count; } -static DEVICE_ATTR(resources, S_IRUGO | S_IWUSR, - pnp_show_current_resources, pnp_set_current_resources); -static ssize_t pnp_show_current_ids (struct device *dmdev,struct device_attribute *attr,char *buf) {
@@ -437,27 +432,11 @@ static ssize_t pnp_show_current_ids(struct device *dmdev,return (str - buf); } -static DEVICE_ATTR(id, S_IRUGO, pnp_show_current_ids, NULL); - -int pnp_interface_attach_device (struct pnp_dev *dev) -{ -int rc =device_create_file (&dev->dev, &dev_attr_options); - -if (rc) - goto err; - rc =device_create_file (&dev->dev, &dev_attr_resources); -if (rc) - goto err_opt; - rc =device_create_file (&dev->dev, &dev_attr_id); -if (rc) - goto err_res; - -return 0 ; - -err_res: -device_remove_file (&dev->dev, &dev_attr_resources); -err_opt: -device_remove_file (&dev->dev, &dev_attr_options); -err: -return rc; -} +struct device_attribute pnp_interface_attrs[] = { +__ATTR (resources,S_IRUGO |S_IWUSR , + pnp_show_current_resources, + pnp_set_current_resources), +__ATTR (options,S_IRUGO , pnp_show_options,NULL ), +__ATTR (id,S_IRUGO , pnp_show_current_ids,NULL ), + __ATTR_NULL, +};
Signature · 1 line
1.6.0.2
PATCH 36/46 sysfs: use ilookup5() instead of ilookup5_nowait()
In reply to Greg KHFrom: Tejun Heo <[email protected]>
As inode creation is protected by sysfs_mutex, ilookup5_nowait() always either fails to find at all or finds one which is fully initialized, so using ilookup5_nowait() or ilookup5() doesn't make any difference. Switch to ilookup5() as it's planned to be removed. This change also makes lookup return value handling a bit simpler.
This change was suggested by Al Viro.
--- fs/sysfs/dir.c | 17 ++++++++--------- 1 files changed, 8 insertions(+), 9 deletions(-)
fs/sysfs/dir.c +8 -9
@@ -370,17 +370,17 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,memset (acxt,0 ,sizeof (*acxt)); acxt->parent_sd = parent_sd; -/* Lookup parent inode. inode initialization and I_NEW -* clearing are protected by sysfs_mutex. By grabbing it and -* looking up with _nowait variant, inode state can be -* determined reliably. +/* Lookup parent inode. inode initialization is protected by +* sysfs_mutex, so inode existence can be determined by +* looking up inode while holding sysfs_mutex. */ mutex_lock (&sysfs_mutex); - inode =ilookup5_nowait (sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test, - parent_sd); + inode =ilookup5 (sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test, + parent_sd); +if (inode) { +WARN_ON (inode->i_state &I_NEW ); -if (inode && !(inode->i_state &I_NEW )) {/* parent inode available */ acxt->parent_inode = inode;
@@ -393,8 +393,7 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,mutex_lock (&inode->i_mutex);mutex_lock (&sysfs_mutex); } - }else -iput (inode); + } }/**
Signature · 1 line
1.6.0.2
PATCH 37/46 platform: add new device registration helper
In reply to Greg KHFrom: Dmitry Baryshkov <[email protected]>
Add a helper that registers simple platform_device w/o resources but with parent and device data.
This is usefull to cleanup platform code from code that registers such simple devices as leds-gpio, generic-bl, etc.
--- drivers/base/platform.c | 47 +++++++++++++++++++++++++++++++++++++++ include/linux/platform_device.h | 2 + 2 files changed, 49 insertions(+), 0 deletions(-)
drivers/base/platform.c +47 -0
@@ -391,6 +391,53 @@ error: }EXPORT_SYMBOL_GPL (platform_device_register_simple); +/** +* platform_device_register_data +* @parent: parent device for the device we're adding +* @name: base name of the device we're adding +* @id: instance id +* @data: platform specific data for this platform device +* @size: size of platform specific data +* +* This function creates a simple platform device that requires minimal +* resource and memory management. Canned release function freeing memory +* allocated for the device allows drivers using such devices to be +* unloaded without waiting for the last reference to the device to be +* dropped. +*/ +struct platform_device *platform_device_register_data ( +struct device *parent, +const char *name,int id, +const void *data,size_t size) +{ +struct platform_device *pdev; +int retval; + + pdev =platform_device_alloc (name, id); +if (!pdev) { + retval = -ENOMEM ; + goto error; + } + + pdev->dev.parent = parent; + +if (size) { + retval =platform_device_add_data (pdev, data, size); +if (retval) + goto error; + } + + retval =platform_device_add (pdev); +if (retval) + goto error; + +return pdev; + +error: +platform_device_put (pdev); +return ERR_PTR (retval); +} +static int platform_drv_probe (struct device *_dev) {struct platform_driver *drv =to_platform_driver (_dev->driver);
include/linux/platform_device.h +2 -0
@@ -37,6 +37,8 @@ extern int platform_add_devices(struct platform_device **, int);extern struct platform_device *platform_device_register_simple (const char *,int id,struct resource *,unsigned int ); +extern struct platform_device *platform_device_register_data (struct device *, +const char *,int ,const void *,size_t );extern struct platform_device *platform_device_alloc (const char *name,int id);extern int platform_device_add_resources (struct platform_device *pdev,struct resource *res,unsigned int num);
Signature · 1 line
1.6.0.2
PATCH 38/46 sysfs: Make dir and name args to sysfs_notify() const
In reply to Greg KHFrom: Trent Piepho <[email protected]>
Because they can be, and because code like this produces a warning if they're not:
struct device_attribute dev_attr;
sysfs_notify(&kobj, NULL, dev_attr.attr.name);
--- fs/sysfs/file.c | 2 +- include/linux/sysfs.h | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-)
fs/sysfs/file.c +1 -1
@@ -469,7 +469,7 @@ void sysfs_notify_dirent(struct sysfs_dirent *sd) }EXPORT_SYMBOL_GPL (sysfs_notify_dirent); -void sysfs_notify (struct kobject *k,char *dir,char *attr) +void sysfs_notify (struct kobject *k,const char *dir,const char *attr) {struct sysfs_dirent *sd = k->sd;
include/linux/sysfs.h +3 -2
@@ -119,7 +119,7 @@ int sysfs_add_file_to_group(struct kobject *kobj,void sysfs_remove_file_from_group (struct kobject *kobj,const struct attribute *attr,const char *group); -void sysfs_notify (struct kobject *kobj,char *dir,char *attr); +void sysfs_notify (struct kobject *kobj,const char *dir,const char *attr);void sysfs_notify_dirent (struct sysfs_dirent *sd);struct sysfs_dirent *sysfs_get_dirent (struct sysfs_dirent *parent_sd,const unsigned char *name);
@@ -229,7 +229,8 @@ static inline void sysfs_remove_file_from_group(struct kobject *kobj, { } -static inline void sysfs_notify (struct kobject *kobj,char *dir,char *attr) +static inline void sysfs_notify (struct kobject *kobj,const char *dir, +const char *attr) { }static inline void sysfs_notify_dirent (struct sysfs_dirent *sd)
Signature · 1 line
1.6.0.2
PATCH 39/46 kobject: Fix kobject_rename and !CONFIG_SYSFS
In reply to Greg KHFrom: Eric W. Biederman <[email protected]>
When looking at kobject_rename I found two bugs with that exist when sysfs support is disabled in the kernel.
kobject_rename does not change the name on the kobject when sysfs support is not compiled in.
kobject_rename without locking attempts to check the validity of a rename operation, which the kobject layer simply does not have the infrastructure to do.
This patch documents the previously unstated requirement of kobject_rename that is the responsibility of the caller to provide mutual exclusion and to be certain that the new_name for the kobject is valid.
This patch modifies sysfs_rename_dir in !CONFIG_SYSFS case to call kobject_set_name to actually change the kobject_name.
This patch removes the bogus and misleading check in kobject_rename that attempts to see if a rename is valid. The check is bogus because we do not have the proper locking. The check is misleading because it looks like we can and do perform checking at the kobject level that we don't.
--- Documentation/kobject.txt | 4 ++++ drivers/base/core.c | 5 +++++ include/linux/sysfs.h | 4 +++- lib/kobject.c | 18 +++++------------- 4 files changed, 17 insertions(+), 14 deletions(-)
Documentation/kobject.txt +4 -0
@@ -118,6 +118,10 @@ the name of the kobject, call kobject_rename(): int kobject_rename(struct kobject *kobj, const char *new_name); +Note kobject_rename does perform any locking or have a solid notion of +what names are valid so the provide must provide their own sanity checking +and serialization. + There is a function called kobject_set_name() but that is legacy cruft and is being removed. If your code needs to call this function, it is incorrect and needs to be fixed.
drivers/base/core.c +5 -0
@@ -1327,6 +1327,11 @@ EXPORT_SYMBOL_GPL(device_destroy);* device_rename - renames a device * @dev: the pointer to the struct device to be renamed * @new_name: the new name of the device +* +* It is the responsibility of the caller to provide mutual +* exclusion between two different calls of device_rename +* 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) {
include/linux/sysfs.h +3 -1
@@ -20,6 +20,8 @@struct kobject ;struct module ; +extern int kobject_set_name (struct kobject *kobj,const char *name, ...) + __attribute__((format (printf,2 ,3 )));/* FIXME * The *owner field is no longer used, but leave around * until the tree gets cleaned up fully.
@@ -147,7 +149,7 @@ static inline void sysfs_remove_dir(struct kobject *kobj)static inline int sysfs_rename_dir (struct kobject *kobj,const char *new_name) { -return 0 ; +return kobject_set_name (kobj,"%s" , new_name); } static inline int sysfs_move_dir(struct kobject *kobj,
lib/kobject.c +5 -13
@@ -387,6 +387,11 @@ EXPORT_SYMBOL_GPL(kobject_init_and_add);* kobject_rename - change the name of an object * @kobj: object in question. * @new_name: object's new name +* +* It is the responsibility of the caller to provide mutual +* exclusion between two different calls of kobject_rename +* on the same kobject and to ensure that new_name is valid and +* won't conflict with other kobjects. */ int kobject_rename (struct kobject *kobj,const char *new_name) {
@@ -401,19 +406,6 @@ int kobject_rename(struct kobject *kobj, const char *new_name)if (!kobj->parent)return -EINVAL ; -/* see if this name is already in use */ -if (kobj->kset) { -struct kobject *temp_kobj; - temp_kobj =kset_find_obj (kobj->kset, new_name); -if (temp_kobj) { -printk (KERN_WARNING "kobject '%s' cannot be renamed " -"to '%s' as '%s' is already in existence.\n" , -kobject_name (kobj), new_name, new_name); -kobject_put (temp_kobj); -return -EINVAL ; - } - } - devpath =kobject_get_path (kobj,GFP_KERNEL );if (!devpath) { error = -ENOMEM ;
Signature · 1 line
1.6.0.2
PATCH 40/46 kobject: Cleanup kobject_rename and !CONFIG_SYSFS
In reply to Greg KHFrom: Eric W. Biederman <[email protected]>
It finally dawned on me what the clean fix to sysfs_rename_dir calling kobject_set_name is. Move the work into kobject_rename where it belongs. The callers serialize us anyway so this is safe.
--- fs/sysfs/dir.c | 6 +----- include/linux/sysfs.h | 4 +--- lib/kobject.c | 17 +++++++++++++++-- 3 files changed, 17 insertions(+), 10 deletions(-)
fs/sysfs/dir.c +1 -5
@@ -829,16 +829,12 @@ int sysfs_rename_dir(struct kobject * kobj, const char *new_name)if (!new_dentry) goto out_unlock; -/* rename kobject and sysfs_dirent */ +/* rename sysfs_dirent */ error = -ENOMEM ; new_name = dup_name =kstrdup (new_name,GFP_KERNEL );if (!new_name) goto out_unlock; - error =kobject_set_name (kobj,"%s" , new_name); -if (error) - goto out_unlock; - dup_name = sd->s_name; sd->s_name = new_name;
include/linux/sysfs.h +1 -3
@@ -20,8 +20,6 @@struct kobject ;struct module ; -extern int kobject_set_name (struct kobject *kobj,const char *name, ...) - __attribute__((format (printf,2 ,3 )));/* FIXME * The *owner field is no longer used, but leave around * until the tree gets cleaned up fully.
@@ -149,7 +147,7 @@ static inline void sysfs_remove_dir(struct kobject *kobj)static inline int sysfs_rename_dir (struct kobject *kobj,const char *new_name) { -return kobject_set_name (kobj,"%s" , new_name); +return 0 ; } static inline int sysfs_move_dir(struct kobject *kobj,
lib/kobject.c +15 -2
@@ -397,6 +397,7 @@ int kobject_rename(struct kobject *kobj, const char *new_name) {int error =0 ;const char *devpath =NULL ; +const char *dup_name =NULL , *name;char *devpath_string =NULL ;char *envp[2 ];
@@ -420,15 +421,27 @@ int kobject_rename(struct kobject *kobj, const char *new_name) envp[0 ] = devpath_string; envp[1 ] =NULL ; + name = dup_name =kstrdup (new_name,GFP_KERNEL ); +if (!name) { + error = -ENOMEM ; + goto out; + } + error =sysfs_rename_dir (kobj, new_name); +if (error) + goto out; + +/* Install the new kobject name */ + dup_name = kobj->name; + kobj->name = name;/* This function is mostly/only used for network interface. * Some hotplug package track interfaces by their name and * therefore want to know when the name is changed by the user. */ -if (!error) -kobject_uevent_env (kobj,KOBJ_MOVE , envp); +kobject_uevent_env (kobj,KOBJ_MOVE , envp); out: +kfree (dup_name);kfree (devpath_string);kfree (devpath);kobject_put (kobj);
Signature · 1 line
1.6.0.2
PATCH 41/46 NET: convert the phy_device file to use bus_find_device_by_name
In reply to Greg KHThe driver core now has this helper function, so might as well use it instead of forcing the phy code to roll their own version.
--- drivers/net/phy/phy_device.c | 8 +------- 1 files changed, 1 insertions(+), 7 deletions(-)
drivers/net/phy/phy_device.c +1 -7
@@ -309,11 +309,6 @@ void phy_disconnect(struct phy_device *phydev) }EXPORT_SYMBOL (phy_disconnect); -static int phy_compare_id (struct device *dev,void *data) -{ -return strcmp ((char *)data, dev->bus_id) ?0 :1 ; -} -/** * phy_attach - attach a network device to a particular PHY device * @dev: network device to attach
@@ -337,8 +332,7 @@ struct phy_device *phy_attach(struct net_device *dev,/* Search the list of PHY devices on the mdio bus for the * PHY with the requested name */ - d =bus_find_device (bus,NULL , (void *)bus_id, phy_compare_id); - + d =bus_find_device_by_name (bus,NULL , bus_id);if (d) { phydev =to_phy_device (d); }else {
Signature · 1 line
1.6.0.2
PATCH 42/46 Driver core: add bus_sort_breadthfirst() function
In reply to Greg KHThe PCI core wants to reorder the devices in the bus list. So move this functionality out of the pci core and into the driver core so that anyone else can also do this if needed. This also lets us change how struct device is attached to drivers in the future without messing with the PCI core.
--- drivers/base/bus.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/pci/probe.c | 50 ++++------------------------------------------- include/linux/device.h | 3 ++ 3 files changed, 58 insertions(+), 45 deletions(-)
drivers/base/bus.c +50 -0
@@ -980,6 +980,56 @@ struct klist *bus_get_device_klist(struct bus_type *bus) }EXPORT_SYMBOL_GPL (bus_get_device_klist); +/* +* Yes, this forcably breaks the klist abstraction temporarily. It +* just wants to sort the klist, not change reference counts and +* take/drop locks rapidly in the process. It does all this while +* holding the lock for the list, so objects can't otherwise be +* added/removed while we're swizzling. +*/ +static void device_insertion_sort_klist (struct device *a,struct list_head *list, +int (*compare)(const struct device *a, +const struct device *b)) +{ +struct list_head *pos; +struct klist_node *n; +struct device *b; + +list_for_each (pos, list) { + n = container_of(pos, struct klist_node, n_node); + b = container_of(n, struct device, knode_bus); +if (compare (a, b) <=0 ) { +list_move_tail (&a->knode_bus.n_node, + &b->knode_bus.n_node); +return ; + } + } +list_move_tail (&a->knode_bus.n_node, list); +} + +void bus_sort_breadthfirst (struct bus_type *bus, +int (*compare)(const struct device *a, +const struct device *b)) +{ +LIST_HEAD (sorted_devices); +struct list_head *pos, *tmp; +struct klist_node *n; +struct device *dev; +struct klist *device_klist; + + device_klist =bus_get_device_klist (bus); + +spin_lock (&device_klist->k_lock); +list_for_each_safe (pos, tmp, &device_klist->k_list) { + n = container_of(pos, struct klist_node, n_node); + dev = container_of(n, struct device, knode_bus); +device_insertion_sort_klist (dev, &sorted_devices, compare); + } +list_splice (&sorted_devices, &device_klist->k_list); +spin_unlock (&device_klist->k_lock); +} +EXPORT_SYMBOL_GPL (bus_sort_breadthfirst); +int __init buses_init (void ) { bus_kset =kset_create_and_add ("bus" , &bus_uevent_ops,NULL );
drivers/pci/probe.c +5 -45
63 lines not on this page · raw message
include/linux/device.h +3 -0
@@ -90,6 +90,9 @@ int __must_check 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, +const struct device *b));/* * Bus notifiers: Get notified of addition/removal of devices * and binding/unbinding of drivers to devices.
Signature · 1 line
1.6.0.2
PATCH 43/46 UIO: Add alignment warnings for uio-mem
In reply to Greg KHFrom: Hans J. Koch <[email protected]>
This patch adds an "offset" attribute for UIO mappings. It shows the difference between the actual start address of the memory and the start address of the page.
--- drivers/uio/uio.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
drivers/uio/uio.c +8 -0
@@ -67,6 +67,11 @@ static ssize_t map_size_show(struct uio_mem *mem, char *buf)return sprintf (buf,"0x%lx\n" , mem->size); } +static ssize_t map_offset_show (struct uio_mem *mem,char *buf) +{ +return sprintf (buf,"0x%lx\n" , mem->addr & ~PAGE_MASK ); +} +struct uio_sysfs_entry {struct attribute attr;ssize_t (*show)(struct uio_mem *,char *);
@@ -77,10 +82,13 @@ static struct uio_sysfs_entry addr_attribute =__ATTR (addr,S_IRUGO , map_addr_show,NULL );static struct uio_sysfs_entry size_attribute =__ATTR (size,S_IRUGO , map_size_show,NULL ); +static struct uio_sysfs_entry offset_attribute = +__ATTR (offset,S_IRUGO , map_offset_show,NULL );static struct attribute *attrs[] = { &addr_attribute.attr, &size_attribute.attr, + &offset_attribute.attr,NULL ,/* need to NULL terminate the list of attributes */ };
Signature · 1 line
1.6.0.2
PATCH 44/46 UIO: Change driver name of uio_pdrv
In reply to Greg KHFrom: Hans J. Koch <[email protected]>
The generic UIO platform device driver should be given a unique driver ID and not just "uio". This is especially important since we now have a similar driver named uio_pdrv_genirq. Currently, there's no user of this driver in the mainline kernel.
--- drivers/uio/uio_pdrv.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/uio/uio_pdrv.c +1 -1
@@ -12,7 +12,7 @@#include <linux/uio_driver.h> #include <linux/stringify.h> -#define DRIVER_NAME "uio" +#define DRIVER_NAME "uio_pdrv"struct uio_platdata {struct uio_info *uioinfo;
Signature · 1 line
1.6.0.2
PATCH 45/46 UIO: add automata sercos3 pci card support
In reply to Greg KHFrom: John Ogness <[email protected]>
Here is a new version of the patch to support the Automata Sercos III PCI card driver. I now check that the IRQ is enabled before accepting the interrupt.
I still use a logical OR to store the enabled interrupts and I've added a second use of a logical OR when restoring the enabled interrupts. I added an explanation of why I do this in comments at the top of the source file.
Since I use a logical OR, I also removed the extra checks if the Interrupt Enable Register and ier0_cache are 0.
--- drivers/uio/Kconfig | 13 +++ drivers/uio/Makefile | 1 + drivers/uio/uio_sercos3.c | 243 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 257 insertions(+), 0 deletions(-) create mode 100644 drivers/uio/uio_sercos3.c
drivers/uio/Kconfig +13 -0
@@ -58,4 +58,17 @@ config UIO_SMX If you compile this as a module, it will be called uio_smx. +config UIO_SERCOS3 + tristate "Automata Sercos III PCI card driver" + default n + help + Userspace I/O interface for the Sercos III PCI card from + Automata GmbH. The userspace part of this driver will be + available for download from the Automata GmbH web site. + + Automata GmbH: http://www.automataweb.com + Sercos III interface: http://www.sercos.com + + If you compile this as a module, it will be called uio_sercos3. + endif
drivers/uio/Makefile +1 -0
@@ -3,3 +3,4 @@ obj-$(CONFIG_UIO_CIF) += uio_cif.o obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o obj-$(CONFIG_UIO_PDRV_GENIRQ) += uio_pdrv_genirq.o obj-$(CONFIG_UIO_SMX) += uio_smx.o +obj-$(CONFIG_UIO_SERCOS3) += uio_sercos3.o
drivers/uio/uio_sercos3.c new file +243 -0
243 lines not on this page · raw message
Signature · 1 line
1.6.0.2
PATCH 46/46 UIO: Fix mapping of logical and virtual memory
In reply to Greg KHFrom: Andrew G. Harvey <[email protected]>
mmap() doesn't work as expected for UIO_MEM_LOGICAL or UIO_MEM_VIRTUAL mappings. The offset into the memory needs to be added, otherwise uio_vma_fault always returns the first page only. Note that for UIO userspace calls mmap() with offset = N * getpagesize() to access mapping N. This must be compensated when calculating the offset. A comment was added to explain this since it is not obvious.
--- drivers/uio/uio.c | 12 ++++++++++-- 1 files changed, 10 insertions(+), 2 deletions(-)
drivers/uio/uio.c +10 -2
@@ -490,15 +490,23 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) {struct uio_device *idev = vma->vm_private_data;struct page *page; +unsigned long offset;int mi =uio_find_mem_index (vma);if (mi <0 )return VM_FAULT_SIGBUS ; +/* +* We need to subtract mi because userspace uses offset = N*PAGE_SIZE +* to use mem[N]. +*/ + offset = (vmf->pgoff - mi) <<PAGE_SHIFT ; +if (idev->info->mem[mi].memtype ==UIO_MEM_LOGICAL ) - page =virt_to_page (idev->info->mem[mi].addr); + page =virt_to_page (idev->info->mem[mi].addr + offset);else - page =vmalloc_to_page ((void *)idev->info->mem[mi].addr); + page =vmalloc_to_page ((void *)idev->info->mem[mi].addr + + offset);get_page (page); vmf->page = page;return 0 ;
Signature · 1 line
1.6.0.2
Quoted 7 lines · Greg KH
Here is the driver core patchset for your 2.6-git tree.
Highlights include:
- dynamic
dev_printk()patch, allows debugging to be turned on the fly, instead of at build time. This is very good and has been in the opensuse beta releases already with much success.
while I think this is a good feature b/c it allows dynamically turning debug information on/off at runtime, and it creates a standard framework for all the DEBUGP, dprintk, DEBUG, calls that each subsystems defines for itself, there was some resistance to this approach in another thread,
see: http://marc.info/?l=linux-kernel&m=122164181331567&w=2
I am adding the relevant parties to the 'cc here in the interest of making sure interested parties are aware of this patch proposal.
One concern, raised in the other thread was that subsystems might want to use their own defined tags, as opposed to KBUILD_MODNAME, which is used by default to group together debugging control. Layering this tag ability on top of this patchset is not hard, and I already have patches which begin to do that...Also, this patch allows passing one command line argument to enable all debugging which can later be turn on/off as desired. This patch already stands on its own in enabling all pr_debug and dev_dbg calls to be dynamically enabled.
thanks,
-Jason
Quoted 6 lines · Jason Baron
One concern, raised in the other thread was that subsystems might want to use their own defined tags, as opposed to
KBUILD_MODNAME, which is used by default to group together debugging control. Layering this tag ability on top of this patchset is not hard, and I already have patches which begin to do that.
That sounds like a useful thing to have.
Quoted 4 lines
Also, this patch allows passing one command line argument to enable all debugging which can later be turn on/off as desired. This patch already stands on its own in enabling all
pr_debuganddev_dbgcalls to be dynamically enabled.
I tried turning everything on once. The output was almost unusable, you pretty much always want to be able to pick and choose what you want enabled otherwise you drown in irrelevant data :)
thanks,
greg k-h