driver core patches against 2.6.26
Subsystems (57)
PATCH 1/1 driver core patches against 2.6.26
Here are a bunch of driver core patches against your 2.6.26-git tree.
They do a variety of things:
- class core cleanups
- fixup for device_create() api
- KOBJ_NAME_LEN fixes
- bus_id removals
- UIO driver updates
- HP driver for service processors
All of these have been in the -mm and -next trees for quite a while.
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/ABI/testing/sysfs-dev | 20 + Documentation/DocBook/uio-howto.tmpl | 63 ++- Documentation/HOWTO | 2 +- Documentation/filesystems/sysfs.txt | 6 + Documentation/sysfs-rules.txt | 5 +- arch/arm/common/dmabounce.c | 22 +- arch/arm/common/locomo.c | 2 +- arch/arm/common/sa1111.c | 10 +- arch/arm/common/scoop.c | 2 +- arch/arm/kernel/ecard.c | 5 +- arch/arm/kernel/time.c | 4 +- arch/arm/mach-integrator/impd1.c | 7 +- arch/arm/mach-integrator/lm.c | 6 +- arch/arm/plat-omap/mailbox.c | 2 +- arch/avr32/kernel/cpu.c | 38 +- arch/ia64/kernel/err_inject.c | 22 +- arch/mips/kernel/rtlx.c | 4 +- arch/mips/sibyte/common/sb_tbprof.c | 3 +- arch/powerpc/kernel/sysfs.c | 15 +- arch/powerpc/platforms/cell/cbe_thermal.c | 45 +- arch/powerpc/platforms/cell/spu_base.c | 3 +- arch/powerpc/platforms/chrp/pci.c | 2 +- arch/s390/kernel/smp.c | 36 +- arch/s390/kernel/time.c | 35 +- arch/sh/drivers/dma/dma-sysfs.c | 15 +- arch/sparc64/kernel/ebus.c | 4 +- arch/sparc64/kernel/of_device.c | 4 +- arch/sparc64/kernel/pci.c | 2 +- arch/sparc64/kernel/sysfs.c | 16 +- arch/sparc64/kernel/vio.c | 18 +- arch/x86/kernel/cpu/mcheck/mce_64.c | 18 +- arch/x86/kernel/cpu/mcheck/therm_throt.c | 1 + arch/x86/kernel/cpuid.c | 4 +- arch/x86/kernel/microcode.c | 10 +- arch/x86/kernel/msr.c | 4 +- arch/x86/kernel/pci-dma.c | 6 +- arch/x86/kernel/pci-gart_64.c | 4 +- block/bsg.c | 3 +- block/genhd.c | 205 +++--- drivers/acpi/fan.c | 10 +- drivers/acpi/glue.c | 6 +- drivers/acpi/processor_core.c | 5 +- drivers/acpi/scan.c | 2 +- drivers/acpi/thermal.c | 4 +- drivers/acpi/video.c | 5 +- drivers/base/Kconfig | 3 +- drivers/base/base.h | 27 + drivers/base/class.c | 153 +++-- drivers/base/core.c | 196 ++++-- drivers/base/cpu.c | 10 +- drivers/base/memory.c | 12 +- drivers/base/node.c | 15 +- drivers/base/power/trace.c | 2 +- drivers/base/sys.c | 64 ++- drivers/base/topology.c | 17 +- drivers/block/aoe/aoechr.c | 5 +- drivers/block/paride/pg.c | 5 +- drivers/block/paride/pt.c | 10 +- drivers/block/pktcdvd.c | 4 +- drivers/char/dsp56k.c | 3 +- drivers/char/ip2/ip2main.c | 12 +- drivers/char/ipmi/ipmi_devintf.c | 2 +- drivers/char/istallion.c | 5 +- drivers/char/lp.c | 3 +- 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 | 3 +- drivers/char/stallion.c | 4 +- drivers/char/tty_io.c | 12 +- drivers/char/vc_screen.c | 12 +- drivers/char/viotape.c | 8 +- drivers/char/vt.c | 14 +- drivers/char/xilinx_hwicap/xilinx_hwicap.c | 5 +- drivers/cpuidle/sysfs.c | 10 +- drivers/dca/dca-sysfs.c | 8 +- drivers/eisa/Makefile | 2 +- drivers/eisa/eisa-bus.c | 4 +- drivers/hid/hidraw.c | 5 +- drivers/hwmon/hwmon.c | 3 +- drivers/i2c/i2c-core.c | 6 +- drivers/i2c/i2c-dev.c | 6 +- drivers/ide/ide-tape.c | 10 +- drivers/ieee1394/dv1394.c | 7 +- drivers/ieee1394/nodemgr.c | 23 +- drivers/ieee1394/raw1394.c | 4 +- drivers/ieee1394/video1394.c | 6 +- drivers/infiniband/core/cm.c | 72 +- drivers/infiniband/hw/ipath/ipath_file_ops.c | 2 +- drivers/isdn/capi/capi.c | 3 +- drivers/macintosh/adb.c | 3 +- drivers/mca/mca-bus.c | 2 +- drivers/media/dvb/dvb-core/dvbdev.c | 4 +- drivers/memstick/host/jmb38x_ms.c | 4 +- drivers/message/fusion/mptbase.c | 3 +- drivers/message/fusion/mptbase.h | 4 +- drivers/message/fusion/mptfc.c | 4 +- drivers/misc/Kconfig | 13 + drivers/misc/Makefile | 1 + drivers/misc/hpilo.c | 768 ++++++++++++++++++++ drivers/misc/hpilo.h | 189 +++++ drivers/misc/phantom.c | 5 +- drivers/mtd/devices/block2mtd.c | 8 +- drivers/mtd/mtdchar.c | 9 +- drivers/net/3c59x.c | 2 +- drivers/net/arm/at91_ether.c | 2 +- drivers/net/arm/ep93xx_eth.c | 2 +- drivers/net/arm/etherh.c | 6 +- drivers/net/ppp_generic.c | 3 +- drivers/net/wan/cosa.c | 6 +- drivers/pci/hotplug/acpiphp.h | 4 +- drivers/power/apm_power.c | 2 +- drivers/power/power_supply_core.c | 4 +- drivers/rtc/interface.c | 2 +- drivers/s390/char/raw3270.c | 14 +- drivers/s390/char/tape_class.c | 7 +- drivers/s390/char/vmur.c | 5 +- drivers/sbus/sbus.c | 6 +- drivers/scsi/dpt_i2o.c | 4 +- drivers/scsi/hosts.c | 7 +- drivers/scsi/scsi_transport_fc.c | 9 +- drivers/scsi/scsi_transport_iscsi.c | 8 +- drivers/spi/spi.c | 2 +- drivers/spi/spidev.c | 4 +- drivers/uio/Kconfig | 10 +- drivers/uio/Makefile | 1 + drivers/uio/uio.c | 26 + drivers/uio/uio_pdrv.c | 118 +++ drivers/usb/core/devio.c | 11 +- drivers/usb/core/file.c | 5 +- drivers/usb/gadget/printer.c | 4 +- drivers/usb/mon/mon_bin.c | 5 +- drivers/video/aty/aty128fb.c | 2 +- drivers/video/aty/radeonfb.h | 2 +- drivers/video/console/fbcon.c | 3 +- drivers/video/fbmem.c | 5 +- drivers/xen/balloon.c | 1 + fs/coda/psdev.c | 5 +- fs/debugfs/inode.c | 114 +++- fs/partitions/check.c | 2 +- fs/sysfs/dir.c | 37 +- fs/sysfs/file.c | 5 +- fs/sysfs/symlink.c | 41 +- fs/sysfs/sysfs.h | 1 + include/linux/debugfs.h | 4 + include/linux/device.h | 58 +- include/linux/eisa.h | 2 +- include/linux/kobject.h | 3 +- include/linux/mtd/map.h | 2 +- include/linux/mtd/mtd.h | 2 +- include/linux/spi/spi.h | 2 +- include/linux/sysdev.h | 39 +- include/linux/sysfs.h | 10 + include/linux/uio_driver.h | 8 +- include/scsi/scsi_host.h | 2 +- include/scsi/scsi_transport_fc.h | 4 +- include/scsi/scsi_transport_iscsi.h | 2 +- kernel/rtmutex-tester.c | 7 +- kernel/sched.c | 8 +- kernel/time/clocksource.c | 8 +- lib/Kconfig.debug | 3 + lib/kobject.c | 10 +- lib/kobject_uevent.c | 3 +- net/bluetooth/hci_sysfs.c | 7 - .../firmware_sample_firmware_class.c | 2 +- samples/kobject/kset-example.c | 2 +- scripts/mod/file2alias.c | 24 +- sound/core/init.c | 5 +- sound/oss/soundcard.c | 14 +- sound/sound_core.c | 5 +- 173 files changed, 2508 insertions(+), 751 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-dev create mode 100644 drivers/misc/hpilo.c create mode 100644 drivers/misc/hpilo.h create mode 100644 drivers/uio/uio_pdrv.c
---------------
Adrian Bunk (1):
always enable FW_LOADER unless EMBEDDED=y
Andi Kleen (3):
sysdev: Pass the attribute to the low level sysdev show/store function
sysdev: Add utility functions for simple int/ulong variable sysdev attributes
sysdev: Convert the x86 mce tolerant sysdev attribute to generic attribute
Ben Dooks (1):
sysdev: fix debugging statements in registration code.
Cornelia Huck (1):
driver core: Suppress sysfs warnings for device_rename().
Dan Williams (1):
sysfs: add /sys/dev/{char,block} to lookup sysfs path by major:minor
Dave Young (1):
class: change internal semaphore to a mutex
David Altobelli (1):
HP iLO driver
David Brownell (1):
device create: spi: convert device_create to device_create_drvdata
Greg Kroah-Hartman (48):
Firmware: fix typo in example code
device create: block: convert device_create to device_create_drvdata device create: char: convert device_create to device_create_drvdata device create: coda: convert device_create to device_create_drvdata device create: dca: convert device_create to device_create_drvdata device create: dvb: convert device_create to device_create_drvdata device create: framebuffer: convert device_create to device_create_drvdata device create: hid: convert device_create to device_create_drvdata device create: hwmon: convert device_create to device_create_drvdata device create: i2c: convert device_create to device_create_drvdata device create: ide: convert device_create to device_create_drvdata device create: ieee1394: convert device_create to device_create_drvdata device create: infiniband: convert device_create to device_create_drvdata device create: isdn: convert device_create to device_create_drvdata device create: macintosh: convert device_create to device_create_drvdata device create: mips: convert device_create to device_create_drvdata device create: misc: convert device_create to device_create_drvdata device create: mtd: convert device_create to device_create_drvdata device create: net: convert device_create to device_create_drvdata device create: s390: convert device_create to device_create_drvdata device create: scsi: convert device_create to device_create_drvdata device create: sound: convert device_create to device_create_drvdata device create: usb: convert device_create to device_create_drvdata device create: x86: convert device_create to device_create_drvdata driver core: remove device_create()
device create: convert device_create_drvdata to device_create Driver Core: add ability for class_for_each_device to start in middle of list Driver Core: add ability for class_find_device to start in middle of list
block: fix compiler warning in genhd.c
block: make printk_partition use the class iterator function
block: make blk_lookup_devt use the class iterator function
block: make proc files seq_start use the class_find_device()
block: move header for /proc/partitions to seq_start
block: make /proc/partitions and /proc/diskstats use class_find_device()
infiniband: rename "device" to "ib_device" in cm_device
infiniband: make cm_device use a struct device and not a kobject.
bluetooth: remove improper bluetooth class symlinks.
class: move driver core specific parts to a private structure
class: rename "devices" to "class_devices" in internal class structure
class: rename "interfaces" to "class_interfaces" in internal class structure
class: rename "subsys" to "class_subsys" in internal class structure
class: rename "sem" to "class_sem" in internal class structure
class: fix docbook comments for class_private structure
driver core: remove DEVICE_ID_SIZE define
driver core: fix a lot of printk usages of bus_id
MTD: handle pci_name() being const
3c59x: handle pci_name() being const
sparc64: fix up bus_id changes in sparc core code
Haavard Skinnemoen (1):
debugfs: Implement debugfs_remove_recursive()
Hans J. Koch (1):
UIO: Add write function to allow irq masking
Kay Sievers (5):
kobject: replace '/' with '!' in name
driver core: remove KOBJ_NAME_LEN define driver core: remove DEVICE_NAME_SIZE define
pnp: add acpi:* modalias entries
arm: bus_id -> dev_name() and dev_set_name() conversions
Li Zefan (1):
kobject: should use kobject_put() in kset-example
Matthew Wilcox (1):
class: add lockdep infrastructure
Mike Frysinger (2):
uio-howto.tmpl: use standard copyright/legal markings uio-howto.tmpl: use unique output names
Miklos Szeredi (1):
sysfs: don't call notify_change
Nathan Lynch (1):
sysfs-rules.txt: reword API stability statement
Randy Dunlap (1):
block: make /proc/diskstats only build if CONFIG_PROC_FS is enabled
Richard Kennedy (1):
kobject: reorder kobject to save space on 64 bit builds
Robert P. J. Day (1):
debugfs: Add a reference to the debugfs API documentation.
Tsugikazu Shibata (1):
HOWTO: change email addresses of James in HOWTO
Uwe Kleine-König (3):
UIO: fix UIO Kconfig dependencies
UIO: add generic UIO platform driver
UIO: minor style and comment fixes
Wang Chen (1):
kobject: Transmit return value of call_usermodehelper() to caller
PATCH 1/79 sysfs: add /sys/dev/{char,block} to lookup sysfs path by major:minor
From: Dan Williams <[email protected]>
Why?:
There are occasions where userspace would like to access sysfs attributes for a device but it may not know how sysfs has named the device or the path. For example what is the sysfs path for /dev/disk/by-id/ata-ST3160827AS_5MT004CK? With this change a call to stat(2) returns the major:minor then userspace can see that /sys/dev/block/8:32 links to /sys/block/sdc.
What are the alternatives?:
1/ Add an ioctl to return the path: Doable, but sysfs is meant to reduce
the need to proliferate ioctl interfaces into the kernel, so this seems counter productive.
2/ Use udev to create these symlinks: Also doable, but it adds a
udev dependency to utilities that might be running in a limited environment like an initramfs.
3/ Do a full-tree search of sysfs.
[[email protected]: fix duplicate registrations] [[email protected]: cleanup suggestions]
--- Documentation/ABI/testing/sysfs-dev | 20 ++++++++ Documentation/filesystems/sysfs.txt | 6 +++ block/genhd.c | 5 ++- drivers/base/class.c | 4 ++ drivers/base/core.c | 83 ++++++++++++++++++++++++++++++++++- drivers/usb/core/devio.c | 5 ++ include/linux/device.h | 3 + 7 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 Documentation/ABI/testing/sysfs-dev
Documentation/ABI/testing/sysfs-dev new file +20 -0
@@ -0,0 +1,20 @@ +What: /sys/dev +Date: April 2008 +KernelVersion: 2.6.26 +Contact: Dan Williams <[email protected]> +Description: The /sys/dev tree provides a method to look up the sysfs + path for a device using the information returned from + stat(2). There are two directories, 'block' and 'char', + beneath /sys/dev containing symbolic links with names of + the form "<major>:<minor>". These links point to the + corresponding sysfs path for the given device. + + Example: + $ readlink /sys/dev/block/8:32 + ../../block/sdc + + Entries in /sys/dev/char and /sys/dev/block will be + dynamically created and destroyed as devices enter and + leave the system. + +Users: mdadm <[email protected]>
Documentation/filesystems/sysfs.txt +6 -0
@@ -248,6 +248,7 @@ The top level sysfs directory looks like: block/ bus/ class/ +dev/ devices/ firmware/ net/
@@ -274,6 +275,11 @@ fs/ contains a directory for some filesystems. Currently each filesystem wanting to export attributes must create its own hierarchy below fs/ (see ./fuse.txt for an example). +dev/ contains two directories char/ and block/. Inside these two +directories there are symlinks named <major>:<minor>. These symlinks +point to the sysfs directory for the given device. /sys/dev provides a +quick way to lookup the sysfs interface for a device from the result of +a stat(2) operation. More information can driver-model specific features can be found in Documentation/driver-model/.
block/genhd.c +4 -1
@@ -370,7 +370,10 @@ static struct kobject *base_probe(dev_t devt, int *part, void *data)static int __init genhd_device_init (void ) { -int error =class_register (&block_class); +int error; + + block_class.dev_kobj = sysfs_dev_block_kobj; + error =class_register (&block_class);if (unlikely (error))return error; bdev_map =kobj_map_init (base_probe, &block_class_lock);
drivers/base/class.c +4 -0
@@ -148,6 +148,10 @@ int class_register(struct class *cls)if (error)return error; +/* set the default /sys/dev directory for devices of this class */ +if (!cls->dev_kobj) + cls->dev_kobj = sysfs_dev_char_kobj; +#if defined(CONFIG_SYSFS_DEPRECATED ) && defined(CONFIG_BLOCK )/* let the block class directory show up in the root of sysfs */ if (cls != &block_class)
drivers/base/core.c +82 -1
125 lines not on this page · raw message
drivers/usb/core/devio.c +5 -0
@@ -1792,6 +1792,11 @@ int __init usb_devio_init(void) usb_classdev_class =NULL ; goto out; } +/* devices of this class shadow the major:minor of their parent +* device, so clear ->dev_kobj to prevent adding duplicate entries +* to /sys/dev +*/ + usb_classdev_class->dev_kobj =NULL ;usb_register_notify (&usbdev_nb);#endif
include/linux/device.h +3 -0
@@ -193,6 +193,7 @@ struct class {struct semaphore sem;/* locks children, devices, interfaces */ struct class_attribute *class_attrs;struct device_attribute *dev_attrs; +struct kobject *dev_kobj;int (*dev_uevent)(struct device *dev,struct kobj_uevent_env *env);
@@ -205,6 +206,8 @@ struct class {struct pm_ops *pm; }; +extern struct kobject *sysfs_dev_block_kobj; +extern struct kobject *sysfs_dev_char_kobj;extern int __must_check class_register (struct class *class);extern void class_unregister (struct class *class); extern int class_for_each_device(struct class *class, void *data,
Signature · 1 line
1.5.6.3
PATCH 2/79 kobject: replace '/' with '!' in name
In reply to Greg KHFrom: Kay Sievers <[email protected]>
Some (block) devices have a '/' in the name, and need special handling. Let's have that rule to the core, so we can remove it from the block class.
--- lib/kobject.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)
lib/kobject.c +8 -2
@@ -216,13 +216,19 @@ static int kobject_add_internal(struct kobject *kobj)static int kobject_set_name_vargs (struct kobject *kobj,const char *fmt,va_list vargs) { -/* Free the old name, if necessary. */ -kfree (kobj->name); +const char *old_name = kobj->name; +char *s; kobj->name =kvasprintf (GFP_KERNEL , fmt, vargs);if (!kobj->name)return -ENOMEM ; +/* ewww... some of these buggers have '/' in the name ... */ + s =strchr (kobj->name,'/' ); +if (s) + s[0 ] ='!' ; + +kfree (old_name);return 0 ; }
Signature · 1 line
1.5.6.3
Re: [PATCH 02/79] kobject: replace '/' with '!' in name
Greg Kroah-Hartman <[email protected]> writes in gmane.linux.kernel:
Quoted 18 lines
From: Kay Sievers <[email protected]>
Some (block) devices have a '/' in the name, and need special handling. Let's have that rule to the core, so we can remove it from the block class.
Signed-off-by Kay Sievers <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- lib/kobject.c | 10 ++++++++-- 1 files changed, 8 insertions(+), 2 deletions(-)lib/kobject.c +0
-0@@ -216,13 +216,19 @@ static int kobject_add_internal(struct kobject *kobj) static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,
lib/kobject.c static int kobject_add_internal(struct kobject *kobj) · line 224
Quoted 10 lines
lib/kobject.c +2
-2va_list vargs) { -/* Free the old name, if necessary. */ -kfree (kobj->name); +const char *old_name = kobj->name; +char *s; kobj->name =kvasprintf (GFP_KERNEL , fmt, vargs);if (!kobj->name)return -ENOMEM ;
Is this leaking old_name if kvasprintf returns NULL ?
kobj->name is that point to set NULL and old value of kobj->name (old_name) is not free'ed
Quoted 11 lines
lib/kobject.c +6
-0+/* ewww... some of these buggers have '/' in the name ... */ + s =strchr (kobj->name,'/' ); +if (s) + s[0 ] ='!' ; + +kfree (old_name);return 0 ; }Signature · 1 line
1.5.6.3
/ Kari Hurtta
Re: [PATCH 02/79] kobject: replace '/' with '!' in name
In reply to Greg Kroah-HartmanHi Greg,
hi Kay,
Quoted 5 lines · Greg Kroah-Hartman
From: Kay Sievers <[email protected]>
Some (block) devices have a '/' in the name, and need special handling. Let's have that rule to the core, so we can remove it from the block class.
Yes, but why replace only one?
Quoted 15 lines
lib/kobject.c +2
-2@@ -216,13 +216,19 @@ static int kobject_add_internal(struct kobject *kobj)static int kobject_set_name_vargs (struct kobject *kobj,const char *fmt,va_list vargs) { -/* Free the old name, if necessary. */ -kfree (kobj->name); +const char *old_name = kobj->name; +char *s; kobj->name =kvasprintf (GFP_KERNEL , fmt, vargs);if (!kobj->name)
lib/kobject.c static int kobject_add_internal(struct kobject *kobj) · line 233
Quoted 10 lines
lib/kobject.c +6
-0return -ENOMEM ; +/* ewww... some of these buggers have '/' in the name ... */ + s =strchr (kobj->name,'/' ); +if (s) + s[0 ] ='!' ; + +kfree (old_name);return 0 ; }
while (s = strchr(kobj->name, '/')) {
s[0] = '!';
}instead?
Best Regards
Ingo Oeser
Re: [PATCH 02/79] kobject: replace '/' with '!' in name
Quoted 11 lines · Ingo Oeser
Hi Greg,
hi Kay,Quoted 5 lines · Greg Kroah-Hartman
From: Kay Sievers <[email protected]>
Some (block) devices have a '/' in the name, and need special handling. Let's have that rule to the core, so we can remove it from the block class.
Yes, but why replace only one?
Do you know of block devices with more than one?
Quoted 30 lines
Quoted 15 lines
lib/kobject.c +2
-2@@ -216,13 +216,19 @@ static int kobject_add_internal(struct kobject *kobj)static int kobject_set_name_vargs (struct kobject *kobj,const char *fmt,va_list vargs) { -/* Free the old name, if necessary. */ -kfree (kobj->name); +const char *old_name = kobj->name; +char *s; kobj->name =kvasprintf (GFP_KERNEL , fmt, vargs);if (!kobj->name)lib/kobject.c static int kobject_add_internal(struct kobject *kobj) · line 233
Quoted 10 lines
lib/kobject.c +6
-0return -ENOMEM ; +/* ewww... some of these buggers have '/' in the name ... */ + s =strchr (kobj->name,'/' ); +if (s) + s[0 ] ='!' ; + +kfree (old_name);return 0 ; }while (s = strchr(kobj->name, '/')) { s[0] = '!'; }
Quoted 1 line
instead?
Nice, care to send a follow-on patch for this?
thanks,
greg k-h
PATCH 1/1 kobject: Replace ALL occurrences of '/' with '!' instead of only the first one.
From: Ingo Oeser <[email protected]>
A recent patch from Kay Sievers <[email protected]> replaced the first occurrence of '/' with '!' as needed for block devices.
Now do some cheap defensive coding and replace all of them to avoid future issues in this area.
---
To answer your questions:
Quoted 1 line
Do you know of block devices with more than one?
No, just defensive coding :-)
Quoted 1 line
Nice, care to send a follow-on patch for this?
Linus just pulled, so I generated it against his latest tree.
lib/kobject.c | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
lib/kobject.c +1 -2
@@ -224,8 +224,7 @@ static int kobject_set_name_vargs(struct kobject *kobj, const char *fmt,return -ENOMEM ;/* ewww... some of these buggers have '/' in the name ... */ - s =strchr (kobj->name,'/' ); -if (s) +while (s =strchr (kobj->name,'/' )) s[0 ] ='!' ;kfree (old_name);
Signature · 1 line
1.5.4.3
PATCH 3/79 debugfs: Add a reference to the debugfs API documentation.
In reply to Greg KHFrom: Robert P. J. Day <[email protected]>
--- lib/Kconfig.debug | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-)
lib/Kconfig.debug +3 -0
@@ -74,6 +74,9 @@ config DEBUG_FS debugging files into. Enable this option to be able to read and write to these files. + For detailed documentation on the debugfs API, see + Documentation/DocBook/filesystems. + If unsure, say N. config HEADERS_CHECK
Signature · 1 line
1.5.6.3
PATCH 4/79 Firmware: fix typo in example code
In reply to Greg KHIt's not like this stuff even builds right now, but this will make Randy's scripts happy :)
--- .../firmware_sample_firmware_class.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
samples/firmware_class/firmware_sample_firmware_class.c +1 -1
@@ -124,7 +124,7 @@ static int fw_setup_class_device(struct class_device *class_dev, class_dev->class_id[BUS_ID_SIZE -1 ] ='\0' ; class_dev->dev = device; - class_dev->class = &firmware_class, + class_dev->class = &firmware_class;class_set_devdata (class_dev, fw_priv); retval =class_device_register (class_dev);if (retval) {
Signature · 1 line
1.5.6.3
PATCH 5/79 device create: block: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- block/bsg.c | 3 ++- drivers/block/aoe/aoechr.c | 5 +++-- drivers/block/paride/pg.c | 5 +++-- drivers/block/paride/pt.c | 10 ++++++---- drivers/block/pktcdvd.c | 4 +++- 5 files changed, 17 insertions(+), 10 deletions(-)
block/bsg.c +2 -1
@@ -1044,7 +1044,8 @@ 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 (bsg_class, parent, dev,"%s" , devname); + class_dev =device_create_drvdata (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 -2
@@ -277,8 +277,9 @@ aoechr_init(void)return PTR_ERR (aoe_class); }for (i =0 ; i <ARRAY_SIZE (chardevs); ++i) -device_create (aoe_class,NULL , -MKDEV (AOE_MAJOR , chardevs[i].minor), chardevs[i].name); +device_create_drvdata (aoe_class,NULL , +MKDEV (AOE_MAJOR , chardevs[i].minor), +NULL , chardevs[i].name);return 0 ; }
drivers/block/paride/pg.c +3 -2
@@ -686,8 +686,9 @@ static int __init pg_init(void)for (unit =0 ; unit <PG_UNITS ; unit++) {struct pg *dev = &devices[unit];if (dev->present) -device_create (pg_class,NULL ,MKDEV (major, unit), -"pg%u" , unit); +device_create_drvdata (pg_class,NULL , +MKDEV (major, unit),NULL , +"pg%u" , unit); } err =0 ; goto out;
drivers/block/paride/pt.c +6 -4
@@ -979,10 +979,12 @@ static int __init pt_init(void)for (unit =0 ; unit <PT_UNITS ; unit++)if (pt[unit].present) { -device_create (pt_class,NULL ,MKDEV (major, unit), -"pt%d" , unit); -device_create (pt_class,NULL ,MKDEV (major, unit +128 ), -"pt%dn" , unit); +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); } goto out;
drivers/block/pktcdvd.c +3 -1
@@ -303,7 +303,9 @@ 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 (class_pktcdvd,NULL , pd->pkt_dev,"%s" , pd->name); + pd->dev =device_create_drvdata (class_pktcdvd,NULL , + pd->pkt_dev,NULL , +"%s" , pd->name);if (IS_ERR (pd->dev)) pd->dev =NULL ; }
Signature · 1 line
1.5.6.3
PATCH 6/79 device create: char: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/char/dsp56k.c | 3 ++- drivers/char/ip2/ip2main.c | 12 ++++++------ drivers/char/ipmi/ipmi_devintf.c | 2 +- drivers/char/istallion.c | 5 +++-- drivers/char/lp.c | 3 ++- 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 | 3 ++- drivers/char/stallion.c | 4 ++-- drivers/char/tty_io.c | 12 +++++++----- drivers/char/vc_screen.c | 12 ++++++------ drivers/char/viotape.c | 8 ++++---- drivers/char/vt.c | 14 ++++++++------ drivers/char/xilinx_hwicap/xilinx_hwicap.c | 5 +++-- 18 files changed, 61 insertions(+), 49 deletions(-)
drivers/char/dsp56k.c +2 -1
@@ -500,7 +500,8 @@ static int __init dsp56k_init_driver(void) err =PTR_ERR (dsp56k_class); goto out_chrdev; } -device_create (dsp56k_class,NULL ,MKDEV (DSP56K_MAJOR ,0 ),"dsp56k" ); +device_create_drvdata (dsp56k_class,NULL ,MKDEV (DSP56K_MAJOR ,0 ), +NULL ,"dsp56k" );printk (banner); goto out;
drivers/char/ip2/ip2main.c +6 -6
@@ -718,12 +718,12 @@ ip2_loadmain(int *iop, int *irqp) }if (NULL != ( pB = i2BoardPtrTable[i] ) ) { -device_create (ip2_class,NULL , -MKDEV (IP2_IPL_MAJOR ,4 * i), -"ipl%d" , i); -device_create (ip2_class,NULL , -MKDEV (IP2_IPL_MAJOR ,4 * i +1 ), -"stat%d" , i); +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);for ( box =0 ; box <ABS_MAX_BOXES ; ++box ) {
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 (ipmi_class, device, dev,"ipmi%d" , if_num); +device_create_drvdata (ipmi_class, device, dev,NULL ,"ipmi%d" , if_num);list_add (&entry->link, ®_list);mutex_unlock (®_list_mutex); }
drivers/char/istallion.c +3 -2
@@ -4599,8 +4599,9 @@ static int __init istallion_module_init(void) istallion_class =class_create (THIS_MODULE ,"staliomem" );for (i =0 ; i <4 ; i++) -device_create (istallion_class,NULL ,MKDEV (STL_SIOMEMMAJOR , i), -"staliomem%d" , i); +device_create_drvdata (istallion_class,NULL , +MKDEV (STL_SIOMEMMAJOR , i), +NULL ,"staliomem%d" , i);return 0 ; err_deinit:
drivers/char/lp.c +2 -1
@@ -813,7 +813,8 @@ static int lp_register(int nr, struct parport *port)if (reset)lp_reset (nr); -device_create (lp_class, port->dev,MKDEV (LP_MAJOR , nr),"lp%d" , nr); +device_create_drvdata (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
@@ -989,9 +989,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 (mem_class,NULL , -MKDEV (MEM_MAJOR , devlist[i].minor), - devlist[i].name); +device_create_drvdata (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 (misc_class, misc->parent, dev, -"%s" , misc->name); + misc->this_device =device_create_drvdata (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
@@ -1896,7 +1896,7 @@ static int cm4000_probe(struct pcmcia_device *link)return ret; } -device_create (cmm_class,NULL ,MKDEV (major, i),"cmm%d" , i); +device_create_drvdata (cmm_class,NULL ,MKDEV (major, i),NULL ,"cmm%d" , i);return 0 ; }
drivers/char/pcmcia/cm4040_cs.c +2 -1
@@ -653,7 +653,8 @@ static int reader_probe(struct pcmcia_device *link)return ret; } -device_create (cmx_class,NULL ,MKDEV (major, i),"cmx%d" , i); +device_create_drvdata (cmx_class,NULL ,MKDEV (major, i),NULL , +"cmx%d" , i);return 0 ; }
drivers/char/ppdev.c +3 -2
@@ -752,8 +752,9 @@ static const struct file_operations pp_fops = {static void pp_attach (struct parport *port) { -device_create (ppdev_class, port->dev,MKDEV (PP_MAJOR , port->number), -"parport%d" , port->number); +device_create_drvdata (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 +4 -3
@@ -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 (raw_class,NULL ,MKDEV (RAW_MAJOR , rq->raw_minor), -"raw%d" , rq->raw_minor); +device_create_drvdata (raw_class,NULL ,MKDEV (RAW_MAJOR , rq->raw_minor), +NULL ,"raw%d" , rq->raw_minor); }/*
@@ -283,7 +283,8 @@ static int __init raw_init(void) ret =PTR_ERR (raw_class); goto error_region; } -device_create (raw_class,NULL ,MKDEV (RAW_MAJOR ,0 ),"rawctl" ); +device_create_drvdata (raw_class,NULL ,MKDEV (RAW_MAJOR ,0 ),NULL , +"rawctl" );return 0 ;
drivers/char/snsc.c +2 -1
@@ -444,7 +444,8 @@ scdrv_init(void)continue ; } -device_create (snsc_class,NULL , dev,"%s" , devname); +device_create_drvdata (snsc_class,NULL , dev,NULL , +"%s" , devname); ia64_sn_irtr_intr_enable(scd->scd_nasid, 0 /*ignored */ ,
drivers/char/stallion.c +2 -2
@@ -4753,8 +4753,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 (stallion_class,NULL ,MKDEV (STL_SIOMEMMAJOR , i), -"staliomem%d" , i); +device_create_drvdata (stallion_class,NULL ,MKDEV (STL_SIOMEMMAJOR , i), +NULL ,"staliomem%d" , i);return 0 ; err_unrtty:
drivers/char/tty_io.c +7 -5
@@ -4045,7 +4045,7 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,else tty_line_name (driver, index, name); -return device_create (tty_class, device, dev, name); +return device_create_drvdata (tty_class, device, dev,NULL , name); }/**
@@ -4323,20 +4323,22 @@ static int __init tty_init(void)if (cdev_add (&tty_cdev,MKDEV (TTYAUX_MAJOR ,0 ),1 ) ||register_chrdev_region (MKDEV (TTYAUX_MAJOR ,0 ),1 ,"/dev/tty" ) <0 )panic ("Couldn't register /dev/tty driver\n" ); -device_create (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,0 ),"tty" ); +device_create_drvdata (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,0 ),NULL , +"tty" );cdev_init (&console_cdev, &console_fops);if (cdev_add (&console_cdev,MKDEV (TTYAUX_MAJOR ,1 ),1 ) ||register_chrdev_region (MKDEV (TTYAUX_MAJOR ,1 ),1 ,"/dev/console" ) <0 )panic ("Couldn't register /dev/console driver\n" ); -device_create (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,1 ),"console" ); +device_create_drvdata (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,1 ),NULL , +"console" );#ifdef CONFIG_UNIX98_PTYS cdev_init (&ptmx_cdev, &ptmx_fops);if (cdev_add (&ptmx_cdev,MKDEV (TTYAUX_MAJOR ,2 ),1 ) ||register_chrdev_region (MKDEV (TTYAUX_MAJOR ,2 ),1 ,"/dev/ptmx" ) <0 )panic ("Couldn't register /dev/ptmx driver\n" ); -device_create (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,2 ),"ptmx" ); +device_create_drvdata (tty_class,NULL ,MKDEV (TTYAUX_MAJOR ,2 ),NULL ,"ptmx" );#endif #ifdef CONFIG_VT
@@ -4344,7 +4346,7 @@ static int __init tty_init(void)if (cdev_add (&vc0_cdev,MKDEV (TTY_MAJOR ,0 ),1 ) ||register_chrdev_region (MKDEV (TTY_MAJOR ,0 ),1 ,"/dev/vc/0" ) <0 )panic ("Couldn't register /dev/tty0 driver\n" ); -device_create (tty_class,NULL ,MKDEV (TTY_MAJOR ,0 ),"tty0" ); +device_create_drvdata (tty_class,NULL ,MKDEV (TTY_MAJOR ,0 ),NULL ,"tty0" );vty_init ();#endif
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 (vc_class,NULL ,MKDEV (VCS_MAJOR , tty->index +1 ), -"vcs%u" , tty->index +1 ); -device_create (vc_class,NULL ,MKDEV (VCS_MAJOR , tty->index +129 ), -"vcsa%u" , tty->index +1 ); +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 ); }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 (vc_class,NULL ,MKDEV (VCS_MAJOR ,0 ),"vcs" ); -device_create (vc_class,NULL ,MKDEV (VCS_MAJOR ,128 ),"vcsa" ); +device_create_drvdata (vc_class,NULL ,MKDEV (VCS_MAJOR ,0 ),NULL ,"vcs" ); +device_create_drvdata (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 (tape_class,NULL ,MKDEV (VIOTAPE_MAJOR , i), -"iseries!vt%d" , i); -device_create (tape_class,NULL ,MKDEV (VIOTAPE_MAJOR , i |0x80 ), -"iseries!nvt%d" , i); +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); 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/vt.c +8 -6
@@ -3425,9 +3425,10 @@ int register_con_driver(const struct consw *csw, int first, int last)if (retval) goto err; - con_driver->dev =device_create (vtconsole_class,NULL , -MKDEV (0 , con_driver->node), -"vtcon%i" , con_driver->node); + con_driver->dev =device_create_drvdata (vtconsole_class,NULL , +MKDEV (0 , con_driver->node), +NULL ,"vtcon%i" , + con_driver->node);if (IS_ERR (con_driver->dev)) { printk(KERN_WARNING "Unable to create device for %s; "
@@ -3535,9 +3536,10 @@ static int __init vtconsole_class_init(void)struct con_driver *con = ®istered_con_driver[i];if (con->con && !con->dev) { - con->dev =device_create (vtconsole_class,NULL , -MKDEV (0 , con->node), -"vtcon%i" , con->node); + con->dev =device_create_drvdata (vtconsole_class,NULL , +MKDEV (0 , con->node), +NULL ,"vtcon%i" , + con->node);if (IS_ERR (con->dev)) { printk(KERN_WARNING "Unable to create "
drivers/char/xilinx_hwicap/xilinx_hwicap.c +3 -2
@@ -658,8 +658,9 @@ static int __devinit hwicap_setup(struct device *dev, int id,dev_err (dev,"cdev_add() failed\n" ); goto failed3; } -/* devfs_mk_cdev(devt, S_IFCHR|S_IRUGO|S_IWUGO, DRIVER_NAME); */ -device_create (icap_class, dev, devt,"%s%d" ,DRIVER_NAME , id); + +device_create_drvdata (icap_class, dev, devt,NULL , +"%s%d" ,DRIVER_NAME , id);return 0 ;/* success */ failed3:
Signature · 1 line
1.5.6.3
PATCH 7/79 device create: coda: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- fs/coda/psdev.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
fs/coda/psdev.c +3 -2
@@ -362,8 +362,9 @@ static int init_coda_psdev(void) goto out_chrdev; }for (i =0 ; i <MAX_CODADEVS ; i++) -device_create (coda_psdev_class,NULL , -MKDEV (CODA_PSDEV_MAJOR ,i),"cfs%d" , i); +device_create_drvdata (coda_psdev_class,NULL , +MKDEV (CODA_PSDEV_MAJOR , i), +NULL ,"cfs%d" , i);coda_sysctl_init (); goto out;
Signature · 1 line
1.5.6.3
PATCH 8/79 device create: dca: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/dca/dca-sysfs.c | 8 +++++--- 1 files changed, 5 insertions(+), 3 deletions(-)
drivers/dca/dca-sysfs.c +5 -3
@@ -14,8 +14,9 @@ int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot) {struct device *cd; - cd =device_create (dca_class, dca->cd,MKDEV (0 , slot +1 ), -"requester%d" , slot); + cd =device_create_drvdata (dca_class, dca->cd, +MKDEV (0 , slot +1 ),NULL , +"requester%d" , slot);if (IS_ERR (cd))return PTR_ERR (cd);return 0 ;
@@ -46,7 +47,8 @@ idr_try_again:return err; } - cd =device_create (dca_class, dev,MKDEV (0 ,0 ),"dca%d" , dca->id); + cd =device_create_drvdata (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);
Signature · 1 line
1.5.6.3
PATCH 9/79 device create: dvb: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/media/dvb/dvb-core/dvbdev.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/media/dvb/dvb-core/dvbdev.c +2 -2
@@ -233,9 +233,9 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,mutex_unlock (&dvbdev_register_lock); - clsdev =device_create (dvb_class, adap->device, + clsdev =device_create_drvdata (dvb_class, adap->device,MKDEV (DVB_MAJOR ,nums2minor (adap->num, type, id)), -"dvb%d.%s%d" , adap->num, dnames[type], id); +NULL ,"dvb%d.%s%d" , adap->num, dnames[type], id);if (IS_ERR (clsdev)) {printk (KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n" , __func__, adap->num, dnames[type], id,PTR_ERR (clsdev));
Signature · 1 line
1.5.6.3
PATCH 10/79 device create: framebuffer: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/video/console/fbcon.c | 3 ++- drivers/video/fbmem.c | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-)
drivers/video/console/fbcon.c +2 -1
@@ -3586,7 +3586,8 @@ static int __init fb_console_init(void)acquire_console_sem ();fb_register_client (&fbcon_event_notifier); - fbcon_device =device_create (fb_class,NULL ,MKDEV (0 ,0 ),"fbcon" ); + fbcon_device =device_create_drvdata (fb_class,NULL ,MKDEV (0 ,0 ), +NULL ,"fbcon" );if (IS_ERR (fbcon_device)) { printk(KERN_WARNING "Unable to create device "
drivers/video/fbmem.c +3 -2
@@ -1439,8 +1439,9 @@ register_framebuffer(struct fb_info *fb_info)break ; fb_info->node = i; - fb_info->dev =device_create (fb_class, fb_info->device, -MKDEV (FB_MAJOR , i),"fb%d" , i); + fb_info->dev =device_create_drvdata (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.5.6.3
PATCH 11/79 device create: hid: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/hid/hidraw.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
drivers/hid/hidraw.c +3 -2
@@ -322,8 +322,9 @@ int hidraw_connect(struct hid_device *hid) goto out; } - dev->dev =device_create (hidraw_class,NULL ,MKDEV (hidraw_major, minor), -"%s%d" ,"hidraw" , minor); + dev->dev =device_create_drvdata (hidraw_class,NULL , +MKDEV (hidraw_major, minor),NULL , +"%s%d" ,"hidraw" , minor);if (IS_ERR (dev->dev)) {spin_lock (&minors_lock);
Signature · 1 line
1.5.6.3
PATCH 12/79 device create: hwmon: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/hwmon/hwmon.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/hwmon/hwmon.c +2 -1
@@ -55,7 +55,8 @@ again:return ERR_PTR (err); id = id &MAX_ID_MASK ; - hwdev =device_create (hwmon_class, dev,MKDEV (0 ,0 ),HWMON_ID_FORMAT , id); + hwdev =device_create_drvdata (hwmon_class, dev,MKDEV (0 ,0 ),NULL , +HWMON_ID_FORMAT , id);if (IS_ERR (hwdev)) {spin_lock (&idr_lock);
Signature · 1 line
1.5.6.3
PATCH 13/79 device create: i2c: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/i2c/i2c-dev.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
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 (i2c_dev_class, &adap->dev, -MKDEV (I2C_MAJOR , adap->nr), -"i2c-%d" , adap->nr); + i2c_dev->dev =device_create_drvdata (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;
Signature · 1 line
1.5.6.3
PATCH 14/79 device create: ide: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/ide/ide-tape.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
drivers/ide/ide-tape.c +6 -4
@@ -2697,10 +2697,12 @@ static int ide_tape_probe(ide_drive_t *drive)idetape_setup (drive, tape, minor); -device_create (idetape_sysfs_class, &drive->gendev, -MKDEV (IDETAPE_MAJOR , minor),"%s" , tape->name); -device_create (idetape_sysfs_class, &drive->gendev, -MKDEV (IDETAPE_MAJOR , minor +128 ),"n%s" , tape->name); +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); g->fops = &idetape_block_ops;ide_register_region (g);
Signature · 1 line
1.5.6.3
PATCH 15/79 device create: ieee1394: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/ieee1394/dv1394.c | 7 ++++--- drivers/ieee1394/raw1394.c | 4 ++-- drivers/ieee1394/video1394.c | 6 +++--- 3 files changed, 9 insertions(+), 8 deletions(-)
drivers/ieee1394/dv1394.c +4 -3
@@ -2296,9 +2296,10 @@ static void dv1394_add_host(struct hpsb_host *host) ohci = (struct ti_ohci *)host->hostdata; -device_create (hpsb_protocol_class,NULL ,MKDEV ( -IEEE1394_MAJOR ,IEEE1394_MINOR_BLOCK_DV1394 *16 + (id<<2 )), -"dv1394-%d" , id); +device_create_drvdata (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 +2 -2
@@ -3010,10 +3010,10 @@ static int __init init_raw1394(void)hpsb_register_highlevel (&raw1394_highlevel);if (IS_ERR - (device_create ( + (device_create_drvdata ( hpsb_protocol_class,NULL ,MKDEV (IEEE1394_MAJOR ,IEEE1394_MINOR_BLOCK_RAW1394 *16 ), -RAW1394_DEVICE_NAME ))) { +NULL ,RAW1394_DEVICE_NAME ))) { ret = -EFAULT ; goto out_unreg; }
drivers/ieee1394/video1394.c +3 -3
@@ -1341,9 +1341,9 @@ 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 (hpsb_protocol_class,NULL , -MKDEV (IEEE1394_MAJOR , minor), -"%s-%d" ,VIDEO1394_DRIVER_NAME , ohci->host->id); +device_create_drvdata (hpsb_protocol_class,NULL , +MKDEV (IEEE1394_MAJOR , minor),NULL , +"%s-%d" ,VIDEO1394_DRIVER_NAME , ohci->host->id); }
Signature · 1 line
1.5.6.3
PATCH 16/79 device create: infiniband: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/infiniband/hw/ipath/ipath_file_ops.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
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 (ipath_class,NULL , dev, name); + device =device_create_drvdata (ipath_class,NULL , dev,NULL , name);if (IS_ERR (device)) { ret =PTR_ERR (device);
Signature · 1 line
1.5.6.3
PATCH 17/79 device create: isdn: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/isdn/capi/capi.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/isdn/capi/capi.c +2 -1
@@ -1552,7 +1552,8 @@ static int __init capi_init(void)return PTR_ERR (capi_class); } -device_create (capi_class,NULL ,MKDEV (capi_major,0 ),"capi" ); +device_create_drvdata (capi_class,NULL ,MKDEV (capi_major,0 ),NULL , +"capi" );#ifdef CONFIG_ISDN_CAPI_MIDDLEWARE if (capinc_tty_init () <0 ) {
Signature · 1 line
1.5.6.3
PATCH 18/79 device create: macintosh: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/macintosh/adb.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/macintosh/adb.c +2 -1
@@ -862,7 +862,8 @@ adbdev_init(void) adb_dev_class =class_create (THIS_MODULE ,"adb" );if (IS_ERR (adb_dev_class))return ; -device_create (adb_dev_class,NULL ,MKDEV (ADB_MAJOR ,0 ),"adb" ); +device_create_drvdata (adb_dev_class,NULL ,MKDEV (ADB_MAJOR ,0 ),NULL , +"adb" );platform_device_register (&adb_pfdev);platform_driver_probe (&adb_pfdrv, adb_dummy_probe);
Signature · 1 line
1.5.6.3
Re: [PATCH 18/79] device create: macintosh: convert device_create to device_create_drvdata
Quoted 2 lines · Greg Kroah-Hartman
device_create()is race-prone, so use the race-freedevice_create_drvdata()instead asdevice_create()is going away.
Quoted 20 lines
Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/macintosh/adb.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)drivers/macintosh/adb.c +2
-1@@ -862,7 +862,8 @@ adbdev_init(void) adb_dev_class =class_create (THIS_MODULE ,"adb" );if (IS_ERR (adb_dev_class))return ; -device_create (adb_dev_class,NULL ,MKDEV (ADB_MAJOR ,0 ),"adb" ); +device_create_drvdata (adb_dev_class,NULL ,MKDEV (ADB_MAJOR ,0 ),NULL , +"adb" );platform_device_register (&adb_pfdev);platform_driver_probe (&adb_pfdrv, adb_dummy_probe);
PATCH 19/79 device create: mips: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- arch/mips/kernel/rtlx.c | 4 ++-- arch/mips/sibyte/common/sb_tbprof.c | 3 ++- 2 files changed, 4 insertions(+), 3 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 (mt_class,NULL ,MKDEV (major, i), -"%s%d" , module_name, i); + dev =device_create_drvdata (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 +2 -1
@@ -576,7 +576,8 @@ static int __init sbprof_tb_init(void) tb_class = tbc; - dev =device_create (tbc,NULL ,MKDEV (SBPROF_TB_MAJOR ,0 ),"tb" ); + dev =device_create_drvdata (tbc,NULL ,MKDEV (SBPROF_TB_MAJOR ,0 ), +NULL ,"tb" );if (IS_ERR (dev)) { err =PTR_ERR (dev); goto out_class;
Signature · 1 line
1.5.6.3
PATCH 20/79 device create: misc: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/misc/phantom.c | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
drivers/misc/phantom.c +3 -2
@@ -399,8 +399,9 @@ static int __devinit phantom_probe(struct pci_dev *pdev, goto err_irq; } -if (IS_ERR (device_create (phantom_class, &pdev->dev,MKDEV (phantom_major, - minor),"phantom%u" , minor))) +if (IS_ERR (device_create_drvdata (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);
Signature · 1 line
1.5.6.3
PATCH 21/79 device create: mtd: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/mtd/mtdchar.c | 9 ++++++--- 1 files changed, 6 insertions(+), 3 deletions(-)
drivers/mtd/mtdchar.c +6 -3
@@ -28,10 +28,13 @@ static void mtd_notify_add(struct mtd_info* mtd)if (!mtd)return ; -device_create (mtd_class,NULL ,MKDEV (MTD_CHAR_MAJOR , mtd->index*2 ),"mtd%d" , mtd->index); +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 +1 ),"mtd%dro" , mtd->index); +device_create_drvdata (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)
Signature · 1 line
1.5.6.3
PATCH 22/79 device create: net: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/net/ppp_generic.c | 3 ++- drivers/net/wan/cosa.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-)
drivers/net/ppp_generic.c +2 -1
@@ -866,7 +866,8 @@ static int __init ppp_init(void) err =PTR_ERR (ppp_class); goto out_chrdev; } -device_create (ppp_class,NULL ,MKDEV (PPP_MAJOR ,0 ),"ppp" ); +device_create_drvdata (ppp_class,NULL ,MKDEV (PPP_MAJOR ,0 ), +NULL ,"ppp" ); } out:
drivers/net/wan/cosa.c +3 -3
@@ -397,9 +397,9 @@ static int __init cosa_init(void) err =PTR_ERR (cosa_class); goto out_chrdev; } -for (i=0 ; i<nr_cards; i++) { -device_create (cosa_class,NULL ,MKDEV (cosa_major, i),"cosa%d" , i); - } +for (i =0 ; i < nr_cards; i++) +device_create_drvdata (cosa_class,NULL ,MKDEV (cosa_major, i), +NULL ,"cosa%d" , i); err =0 ; goto out;
Signature · 1 line
1.5.6.3
PATCH 23/79 device create: s390: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/s390/char/raw3270.c | 14 ++++++++------ drivers/s390/char/tape_class.c | 7 +++---- drivers/s390/char/vmur.c | 5 +++-- 3 files changed, 14 insertions(+), 12 deletions(-)
drivers/s390/char/raw3270.c +8 -6
@@ -1168,17 +1168,19 @@ static int raw3270_create_attributes(struct raw3270 *rp)if (rc) goto out; - rp->clttydev =device_create (class3270, &rp->cdev->dev, -MKDEV (IBM_TTY3270_MAJOR , rp->minor), -"tty%s" , rp->cdev->dev.bus_id); + rp->clttydev =device_create_drvdata (class3270, &rp->cdev->dev, +MKDEV (IBM_TTY3270_MAJOR , rp->minor), +NULL , +"tty%s" , rp->cdev->dev.bus_id);if (IS_ERR (rp->clttydev)) { rc =PTR_ERR (rp->clttydev); goto out_ttydev; } - rp->cltubdev =device_create (class3270, &rp->cdev->dev, -MKDEV (IBM_FS3270_MAJOR , rp->minor), -"tub%s" , rp->cdev->dev.bus_id); + rp->cltubdev =device_create_drvdata (class3270, &rp->cdev->dev, +MKDEV (IBM_FS3270_MAJOR , rp->minor), +NULL , +"tub%s" , rp->cdev->dev.bus_id);if (!IS_ERR (rp->cltubdev)) goto out;
drivers/s390/char/tape_class.c +3 -4
@@ -69,10 +69,9 @@ struct tape_class_device *register_tape_dev(if (rc) goto fail_with_cdev; - tcd->class_device =device_create (tape_class, device, - tcd->char_device->dev, -"%s" , tcd->device_name - ); + tcd->class_device =device_create_drvdata (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/vmur.c +3 -2
@@ -896,8 +896,9 @@ static int ur_set_online(struct ccw_device *cdev) goto fail_free_cdev; } - urd->device =device_create (vmur_class,NULL , urd->char_device->dev, -"%s" , node_id); + urd->device =device_create_drvdata (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.5.6.3
PATCH 24/79 device create: scsi: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/scsi/dpt_i2o.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/dpt_i2o.c +2 -2
@@ -271,8 +271,8 @@ rebuild_sys_tab: pHba->initialized = TRUE; pHba->state &= ~DPTI_STATE_RESET ;if (adpt_sysfs_class) { -struct device *dev =device_create (adpt_sysfs_class, -NULL ,MKDEV (DPTI_I2O_MAJOR , pHba->unit), +struct device *dev =device_create_drvdata (adpt_sysfs_class, +NULL ,MKDEV (DPTI_I2O_MAJOR , pHba->unit),NULL ,"dpti%d" , pHba->unit);if (IS_ERR (dev)) { printk(KERN_WARNING"dpti%d: unable to "
Signature · 1 line
1.5.6.3
PATCH 25/79 device create: sound: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- sound/core/init.c | 5 +++-- sound/oss/soundcard.c | 14 ++++++++------ sound/sound_core.c | 5 +++-- 3 files changed, 14 insertions(+), 10 deletions(-)
sound/core/init.c +3 -2
@@ -548,8 +548,9 @@ int snd_card_register(struct snd_card *card)snd_assert (card !=NULL , return -EINVAL );#ifndef CONFIG_SYSFS_DEPRECATED if (!card->card_dev) { - card->card_dev =device_create (sound_class, card->dev,0 , -"card%i" , card->number); + card->card_dev =device_create_drvdata (sound_class, card->dev, +MKDEV (0 ,0 ),NULL , +"card%i" , card->number);if (IS_ERR (card->card_dev)) card->card_dev =NULL ; }
sound/oss/soundcard.c +8 -6
@@ -560,17 +560,19 @@ static int __init oss_init(void) sound_dmap_flag = (dmabuf >0 ?1 :0 );for (i =0 ; i <ARRAY_SIZE (dev_list); i++) { -device_create (sound_class,NULL , -MKDEV (SOUND_MAJOR , dev_list[i].minor), -"%s" , dev_list[i].name); +device_create_drvdata (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 (sound_class,NULL , -MKDEV (SOUND_MAJOR , dev_list[i].minor + (j*0x10 )), -"%s%d" , dev_list[i].name, j); +device_create_drvdata (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 +3 -2
@@ -171,8 +171,9 @@ 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 (sound_class, dev,MKDEV (SOUND_MAJOR , s->unit_minor), - s->name+6 ); +device_create_drvdata (sound_class, dev, +MKDEV (SOUND_MAJOR , s->unit_minor), +NULL , s->name+6 );return r; fail:
Signature · 1 line
1.5.6.3
PATCH 26/79 device create: spi: convert device_create to device_create_drvdata
In reply to Greg KHFrom: David Brownell <[email protected]>
Switch over to use the shiny new device_create_drvdata() call instead of the original device_create() calls, so this continues to work after device_create() is removed.
Note that this driver never had the race which motivated removing the original call; it locked correctly.
--- drivers/spi/spidev.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/spi/spidev.c +2 -2
@@ -576,7 +576,8 @@ static int spidev_probe(struct spi_device *spi)struct device *dev; spidev->devt =MKDEV (SPIDEV_MAJOR , minor); - dev =device_create (spidev_class, &spi->dev, spidev->devt, + dev =device_create_drvdata (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 ;
@@ -586,7 +587,6 @@ static int spidev_probe(struct spi_device *spi) }if (status ==0 ) {set_bit (minor, minors); -spi_set_drvdata (spi, spidev);list_add (&spidev->device_entry, &device_list); }mutex_unlock (&device_list_lock);
Signature · 1 line
1.5.6.3
PATCH 27/79 device create: usb: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- drivers/usb/core/devio.c | 6 +++--- drivers/usb/core/file.c | 5 +++-- drivers/usb/gadget/printer.c | 4 ++-- drivers/usb/mon/mon_bin.c | 5 +++-- 4 files changed, 11 insertions(+), 9 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 (usb_classdev_class, &dev->dev, dev->dev.devt, -"usbdev%d.%d" , dev->bus->busnum, - dev->devnum); + cldev =device_create_drvdata (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 -2
@@ -196,8 +196,9 @@ int usb_register_dev(struct usb_interface *intf, ++temp; else temp = name; - intf->usb_dev =device_create (usb_class->class, &intf->dev, -MKDEV (USB_MAJOR , minor),"%s" , temp); + intf->usb_dev =device_create_drvdata (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/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 (usb_gadget_class,NULL , g_printer_devno, -"g_printer" ); + dev->pdev =device_create_drvdata (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/mon/mon_bin.c +3 -2
@@ -1162,8 +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 (mon_bin_class, ubus? ubus->controller:NULL , -MKDEV (MAJOR (mon_bin_dev0), minor),"usbmon%d" , minor); + dev =device_create_drvdata (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.5.6.3
PATCH 28/79 device create: x86: convert device_create to device_create_drvdata
In reply to Greg KHdevice_create() is race-prone, so use the race-free device_create_drvdata() instead as device_create() is going away.
--- arch/x86/kernel/cpuid.c | 4 ++-- arch/x86/kernel/msr.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/x86/kernel/cpuid.c +2 -2
@@ -141,8 +141,8 @@ static __cpuinit int cpuid_device_create(int cpu) {struct device *dev; - dev =device_create (cpuid_class,NULL ,MKDEV (CPUID_MAJOR , cpu), -"cpu%d" , cpu); + dev =device_create_drvdata (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
@@ -149,8 +149,8 @@ static int __cpuinit msr_device_create(int cpu) {struct device *dev; - dev =device_create (msr_class,NULL ,MKDEV (MSR_MAJOR , cpu), -"msr%d" , cpu); + dev =device_create_drvdata (msr_class,NULL ,MKDEV (MSR_MAJOR , cpu), +NULL ,"msr%d" , cpu);return IS_ERR (dev) ?PTR_ERR (dev) :0 ; }
Signature · 1 line
1.5.6.3
PATCH 29/79 driver core: remove device_create()
In reply to Greg KHThere are no more users of this, and it is racy. Use device_create_drvdata() or device_create_vargs() instead.
--- drivers/base/core.c | 34 ---------------------------------- include/linux/device.h | 3 --- 2 files changed, 0 insertions(+), 37 deletions(-)
drivers/base/core.c +0 -34
@@ -1273,40 +1273,6 @@ struct device *device_create_drvdata(struct class *class, }EXPORT_SYMBOL_GPL (device_create_drvdata); -/** -* device_create - creates a device and registers it with sysfs -* @class: pointer to the struct class that this device should be registered to -* @parent: pointer to the parent struct device of this new device, if any -* @devt: the dev_t for the char device to be added -* @fmt: string for the device's name -* -* This function can be used by char device classes. A struct device -* will be created in sysfs, registered to the specified class. -* -* A "dev" file will be created, showing the dev_t for the device, if -* the dev_t is not 0,0. -* If a pointer to a parent struct device is passed in, the newly created -* struct device will be a child of that device in sysfs. -* The pointer to the struct device will be returned from the call. -* Any further sysfs files that might be required can be created using this -* pointer. -* -* Note: the struct class passed to this function must have previously -* been created with a call to class_create(). -*/ -struct device *device_create (struct class *class,struct device *parent, -dev_t devt,const char *fmt, ...) -{ -va_list vargs; -struct device *dev; - -va_start (vargs, fmt); - dev =device_create_vargs (class, parent, devt,NULL , fmt, vargs); -va_end (vargs); -return dev; -} -EXPORT_SYMBOL_GPL (device_create); -static int __match_devt (struct device *dev,void *data) {dev_t *devt = data;
include/linux/device.h +0 -3
@@ -470,9 +470,6 @@ extern struct device *device_create_vargs(struct class *cls,void *drvdata, const char *fmt, va_list vargs); -extern struct device *device_create (struct class *cls,struct device *parent, -dev_t devt,const char *fmt, ...) - __attribute__((format (printf,4 ,5 ))); extern struct device *device_create_drvdata(struct class *cls, struct device *parent, dev_t devt,
Signature · 1 line
1.5.6.3
PATCH 30/79 device create: 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.
Keep the device_create_drvdata macro around to make merges easier.
--- drivers/base/core.c | 11 ++++------- include/linux/device.h | 9 ++++----- 2 files changed, 8 insertions(+), 12 deletions(-)
drivers/base/core.c +4 -7
@@ -1236,7 +1236,7 @@ error:EXPORT_SYMBOL_GPL (device_create_vargs);/** -* device_create_drvdata - creates a device and registers it with sysfs +* device_create - creates a device and registers it with sysfs * @class: pointer to the struct class that this device should be registered to * @parent: pointer to the parent struct device of this new device, if any * @devt: the dev_t for the char device to be added
@@ -1257,11 +1257,8 @@ EXPORT_SYMBOL_GPL(device_create_vargs);* Note: the struct class passed to this function must have previously * been created with a call to class_create(). */ -struct device *device_create_drvdata (struct class *class, -struct device *parent, -dev_t devt, -void *drvdata, -const char *fmt, ...) +struct device *device_create (struct class *class,struct device *parent, +dev_t devt,void *drvdata,const char *fmt, ...) {va_list vargs;struct device *dev;
@@ -1271,7 +1268,7 @@ struct device *device_create_drvdata(struct class *class,va_end (vargs);return dev; } -EXPORT_SYMBOL_GPL (device_create_drvdata); +EXPORT_SYMBOL_GPL (device_create);static int __match_devt (struct device *dev,void *data) {
include/linux/device.h +4 -5
@@ -470,12 +470,11 @@ extern struct device *device_create_vargs(struct class *cls,void *drvdata, const char *fmt, va_list vargs); -extern struct device *device_create_drvdata (struct class *cls, -struct device *parent, -dev_t devt, -void *drvdata, -const char *fmt, ...) +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.5.6.3
PATCH 31/79 Driver Core: add ability for class_for_each_device to start in middle of list
In reply to Greg KHThis mirrors the functionality that driver_for_each_device has as well.
We add a start variable, and all callers of the function are fixed up at the same time.
The block layer will be using this new functionality in a follow-on patch.
--- drivers/base/class.c | 21 +++++++++++++-------- drivers/i2c/i2c-core.c | 6 ++++-- drivers/ieee1394/nodemgr.c | 14 +++++++++----- drivers/power/apm_power.c | 2 +- drivers/power/power_supply_core.c | 4 ++-- include/linux/device.h | 3 ++- 6 files changed, 31 insertions(+), 19 deletions(-)
drivers/base/class.c +13 -8
@@ -256,11 +256,14 @@ char *make_class_name(const char *name, struct kobject *kobj)/** * class_for_each_device - device iterator * @class: the class we're iterating +* @start: the device to start with in the list, if any. * @data: data for the callback * @fn: function to be called for each device * * Iterate over @class's list of devices, and call @fn for each, -* passing it @data. +* passing it @data. If @start is set, the list iteration will start +* there, otherwise if it is NULL, the iteration starts at the +* beginning of the list. * * We check the return of @fn each time. If it returns anything * other than 0, we break out and return that value.
@@ -269,8 +272,8 @@ char *make_class_name(const char *name, struct kobject *kobj)* re-acquired in @fn, otherwise it will self-deadlocking. For * example, calls to add or remove class members would be verboten. */ -int class_for_each_device (struct class *class,void *data, -int (*fn)(struct device *,void *)) +int class_for_each_device (struct class *class,struct device *start, +void *data,int (*fn)(struct device *,void *)) {struct device *dev;int error =0 ;
@@ -279,12 +282,14 @@ int class_for_each_device(struct class *class, void *data,return -EINVAL ;down (&class->sem);list_for_each_entry (dev, &class->devices, node) { +if (start) { +if (start == dev) + start =NULL ; +continue ; + } dev =get_device (dev); -if (dev) { - error =fn (dev, data); -put_device (dev); - }else - error = -ENODEV ; + error =fn (dev, data); +put_device (dev);if (error)break ; }
drivers/i2c/i2c-core.c +4 -2
@@ -722,7 +722,8 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)INIT_LIST_HEAD (&driver->clients);/* Walk the adapters that are already present */ -class_for_each_device (&i2c_adapter_class, driver, __attach_adapter); +class_for_each_device (&i2c_adapter_class,NULL , driver, + __attach_adapter);mutex_unlock (&core_lock);return 0 ;
@@ -782,7 +783,8 @@ void i2c_del_driver(struct i2c_driver *driver) {mutex_lock (&core_lock); -class_for_each_device (&i2c_adapter_class, driver, __detach_adapter); +class_for_each_device (&i2c_adapter_class,NULL , driver, + __detach_adapter);driver_unregister (&driver->driver);pr_debug ("i2c-core: driver [%s] unregistered\n" , driver->driver.name);
drivers/ieee1394/nodemgr.c +9 -5
@@ -1453,7 +1453,8 @@ static void nodemgr_suspend_ne(struct node_entry *ne) ne->in_limbo =1 ;WARN_ON (device_create_file (&ne->device, &dev_attr_ne_in_limbo)); -class_for_each_device (&nodemgr_ud_class, ne, __nodemgr_driver_suspend); +class_for_each_device (&nodemgr_ud_class,NULL , ne, + __nodemgr_driver_suspend); }
@@ -1462,7 +1463,8 @@ static void nodemgr_resume_ne(struct node_entry *ne) ne->in_limbo =0 ;device_remove_file (&ne->device, &dev_attr_ne_in_limbo); -class_for_each_device (&nodemgr_ud_class, ne, __nodemgr_driver_resume); +class_for_each_device (&nodemgr_ud_class,NULL , ne, + __nodemgr_driver_resume);HPSB_DEBUG ("Node resumed: ID:BUS[" NODE_BUS_FMT "] GUID[%016Lx]" ,NODE_BUS_ARGS (ne->host, ne->nodeid), (unsigned long long )ne->guid); }
@@ -1498,7 +1500,8 @@ static int __nodemgr_update_pdrv(struct device *dev, void *data)static void nodemgr_update_pdrv (struct node_entry *ne) { -class_for_each_device (&nodemgr_ud_class, ne, __nodemgr_update_pdrv); +class_for_each_device (&nodemgr_ud_class,NULL , ne, + __nodemgr_update_pdrv); }
@@ -1591,7 +1594,8 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)* while probes are time-consuming. (Well, those probes need some * improvement...) */ -class_for_each_device (&nodemgr_ne_class, ¶m, __nodemgr_node_probe); +class_for_each_device (&nodemgr_ne_class,NULL , ¶m, + __nodemgr_node_probe);/* If we had a bus reset while we were scanning the bus, it is * possible that we did not probe all nodes. In that case, we
@@ -1826,7 +1830,7 @@ int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *)) hip.cb = cb; hip.data = data; - error =class_for_each_device (&hpsb_host_class, &hip, + error =class_for_each_device (&hpsb_host_class,NULL , &hip, __nodemgr_for_each_host);return error;
drivers/power/apm_power.c +1 -1
@@ -78,7 +78,7 @@ static void find_main_battery(void) main_battery =NULL ; bp.main = main_battery; - error =class_for_each_device (power_supply_class, &bp, + error =class_for_each_device (power_supply_class,NULL , &bp, __find_main_battery);if (error) { main_battery = bp.main;
drivers/power/power_supply_core.c +2 -2
@@ -41,7 +41,7 @@ static void power_supply_changed_work(struct work_struct *work)dev_dbg (psy->dev,"%s\n" , __func__); -class_for_each_device (power_supply_class, psy, +class_for_each_device (power_supply_class,NULL , psy, __power_supply_changed_work);power_supply_update_leds (psy);
@@ -79,7 +79,7 @@ int power_supply_am_i_supplied(struct power_supply *psy) {int error; - error =class_for_each_device (power_supply_class, psy, + error =class_for_each_device (power_supply_class,NULL , psy, __power_supply_am_i_supplied);dev_dbg (psy->dev,"%s %d\n" , __func__, error);
include/linux/device.h +2 -1
@@ -210,7 +210,8 @@ extern struct kobject *sysfs_dev_block_kobj;extern struct kobject *sysfs_dev_char_kobj;extern int __must_check class_register (struct class *class);extern void class_unregister (struct class *class); -extern int class_for_each_device (struct class *class,void *data, +extern int class_for_each_device (struct class *class,struct device *start, +void *data,int (*fn)(struct device *dev,void *data));extern struct device *class_find_device (struct class *class,void *data,int (*match)(struct device *,void *));
Signature · 1 line
1.5.6.3
PATCH 32/79 Driver Core: add ability for class_find_device to start in middle of list
In reply to Greg KHThis mirrors the functionality that driver_find_device has as well.
We add a start variable, and all callers of the function are fixed up at the same time.
The block layer will be using this new functionality in a follow-on patch.
--- drivers/base/class.c | 22 +++++++++++++--------- drivers/base/core.c | 2 +- drivers/ieee1394/nodemgr.c | 9 ++++++--- drivers/rtc/interface.c | 2 +- drivers/scsi/hosts.c | 3 ++- drivers/scsi/scsi_transport_iscsi.c | 4 ++-- drivers/spi/spi.c | 2 +- include/linux/device.h | 3 ++- 8 files changed, 28 insertions(+), 19 deletions(-)
drivers/base/class.c +13 -9
@@ -302,6 +302,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device);/** * class_find_device - device iterator for locating a particular device * @class: the class we're iterating +* @start: Device to begin with * @data: data for the match function * @match: function to check device *
@@ -319,8 +320,9 @@ EXPORT_SYMBOL_GPL(class_for_each_device);* re-acquired in @match, otherwise it will self-deadlocking. For * example, calls to add or remove class members would be verboten. */ -struct device *class_find_device (struct class *class,void *data, -int (*match)(struct device *,void *)) +struct device *class_find_device (struct class *class,struct device *start, +void *data, +int (*match)(struct device *,void *)) {struct device *dev;int found =0 ;
@@ -330,15 +332,17 @@ struct device *class_find_device(struct class *class, void *data,down (&class->sem);list_for_each_entry (dev, &class->devices, node) { +if (start) { +if (start == dev) + start =NULL ; +continue ; + } dev =get_device (dev); -if (dev) { -if (match (dev, data)) { - found =1 ; -break ; - }else -put_device (dev); - }else +if (match (dev, data)) { + found =1 ;break ; + }else +put_device (dev); }up (&class->sem);
drivers/base/core.c +1 -1
@@ -1289,7 +1289,7 @@ void device_destroy(struct class *class, dev_t devt) {struct device *dev; - dev =class_find_device (class, &devt, __match_devt); + dev =class_find_device (class,NULL , &devt, __match_devt);if (dev) {put_device (dev);device_unregister (dev);
drivers/ieee1394/nodemgr.c +6 -3
@@ -754,7 +754,8 @@ static void nodemgr_remove_uds(struct node_entry *ne)*/ mutex_lock (&nodemgr_serialize_remove_uds);for (;;) { - dev =class_find_device (&nodemgr_ud_class, ne, __match_ne); + dev =class_find_device (&nodemgr_ud_class,NULL , ne, + __match_ne);if (!dev)break ; ud = container_of(dev, struct unit_directory, unit_dev);
@@ -901,7 +902,8 @@ static struct node_entry *find_entry_by_guid(u64 guid)struct device *dev;struct node_entry *ne; - dev =class_find_device (&nodemgr_ne_class, &guid, __match_ne_guid); + dev =class_find_device (&nodemgr_ne_class,NULL , &guid, + __match_ne_guid);if (!dev)return NULL ; ne = container_of(dev, struct node_entry, node_dev);
@@ -940,7 +942,8 @@ static struct node_entry *find_entry_by_nodeid(struct hpsb_host *host, param.host = host; param.nodeid = nodeid; - dev =class_find_device (&nodemgr_ne_class, ¶m, __match_ne_nodeid); + dev =class_find_device (&nodemgr_ne_class,NULL , ¶m, + __match_ne_nodeid);if (!dev)return NULL ; ne = container_of(dev, struct node_entry, node_dev);
drivers/rtc/interface.c +1 -1
@@ -345,7 +345,7 @@ struct rtc_device *rtc_class_open(char *name)struct device *dev;struct rtc_device *rtc =NULL ; - dev =class_find_device (rtc_class, name, __rtc_match); + dev =class_find_device (rtc_class,NULL , name, __rtc_match);if (dev) rtc =to_rtc_device (dev);
drivers/scsi/hosts.c +2 -1
@@ -466,7 +466,8 @@ struct Scsi_Host *scsi_host_lookup(unsigned short hostnum)struct device *cdev;struct Scsi_Host *shost =ERR_PTR (-ENXIO ); - cdev =class_find_device (&shost_class, &hostnum, __scsi_host_match); + cdev =class_find_device (&shost_class,NULL , &hostnum, + __scsi_host_match);if (cdev) { shost =scsi_host_get (class_to_shost (cdev));put_device (cdev);
drivers/scsi/scsi_transport_iscsi.c +2 -2
@@ -170,7 +170,7 @@ iscsi_create_endpoint(int dd_size)int err;for (id =1 ; id <ISCSI_MAX_EPID ; id++) { - dev =class_find_device (&iscsi_endpoint_class, &id, + dev =class_find_device (&iscsi_endpoint_class,NULL , &id, iscsi_match_epid);if (!dev)break ;
@@ -222,7 +222,7 @@ struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)struct iscsi_endpoint *ep;struct device *dev; - dev =class_find_device (&iscsi_endpoint_class, &handle, + dev =class_find_device (&iscsi_endpoint_class,NULL , &handle, iscsi_match_epid);if (!dev)return NULL ;
drivers/spi/spi.c +1 -1
@@ -502,7 +502,7 @@ struct spi_master *spi_busnum_to_master(u16 bus_num)struct device *dev;struct spi_master *master =NULL ; - dev =class_find_device (&spi_master_class, &bus_num, + dev =class_find_device (&spi_master_class,NULL , &bus_num, __spi_master_match);if (dev) master = container_of(dev, struct spi_master, dev);
include/linux/device.h +2 -1
@@ -213,7 +213,8 @@ extern void class_unregister(struct class *class);extern int class_for_each_device (struct class *class,struct device *start,void *data,int (*fn)(struct device *dev,void *data)); -extern struct device *class_find_device (struct class *class,void *data, +extern struct device *class_find_device (struct class *class, +struct device *start,void *data,int (*match)(struct device *,void *));struct class_attribute {
Signature · 1 line
1.5.6.3
PATCH 33/79 block: fix compiler warning in genhd.c
In reply to Greg KHWarn if something really bad happens if we can't create this link.
--- block/genhd.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletions(-)
block/genhd.c +3 -1
@@ -183,6 +183,7 @@ static int exact_lock(dev_t devt, void *data)void add_disk (struct gendisk *disk) {struct backing_dev_info *bdi; +int retval; disk->flags |=GENHD_FL_UP ; blk_register_region(MKDEV(disk->major, disk->first_minor),
@@ -193,7 +194,8 @@ void add_disk(struct gendisk *disk) bdi = &disk->queue->backing_dev_info;bdi_register_dev (bdi,MKDEV (disk->major, disk->first_minor)); -sysfs_create_link (&disk->dev.kobj, &bdi->dev->kobj,"bdi" ); + retval =sysfs_create_link (&disk->dev.kobj, &bdi->dev->kobj,"bdi" ); +WARN_ON (retval); }EXPORT_SYMBOL (add_disk);
Signature · 1 line
1.5.6.3
PATCH 34/79 block: make printk_partition use the class iterator function
In reply to Greg KHUse the proper class iterator function instead of mucking around in the internals of the class structures.
--- block/genhd.c | 95 ++++++++++++++++++++++++++++++-------------------------- 1 files changed, 51 insertions(+), 44 deletions(-)
block/genhd.c +50 -43
@@ -227,58 +227,65 @@ struct gendisk *get_gendisk(dev_t devt, int *part) }/* -* print a full list of all partitions - intended for places where the root -* filesystem can't be mounted and thus to give the victim some idea of what -* went wrong +* print a partitions - intended for places where the root filesystem can't be +* mounted and thus to give the victim some idea of what went wrong */ -void __init printk_all_partitions (void ) +static int printk_partition (struct device *dev,void *data) { -struct device *dev;struct gendisk *sgp;char buf[BDEVNAME_SIZE ];int n; -mutex_lock (&block_class_lock); -/* For each block device... */ -list_for_each_entry (dev, &block_class.devices, node) { -if (dev->type != &disk_type) -continue ; - sgp =dev_to_disk (dev); -/* -* Don't show empty devices or things that have been surpressed -*/ -if (get_capacity (sgp) ==0 || - (sgp->flags &GENHD_FL_SUPPRESS_PARTITION_INFO )) -continue ; +if (dev->type != &disk_type) + goto exit; -/* -* Note, unlike /proc/partitions, I am showing the numbers in -* hex - the same format as the root= option takes. -*/ -printk ("%02x%02x %10llu %s" , - sgp->major, sgp->first_minor, - (unsigned long long )get_capacity (sgp) >>1 , -disk_name (sgp,0 , buf)); -if (sgp->driverfs_dev !=NULL && - sgp->driverfs_dev->driver !=NULL ) -printk (" driver: %s\n" , - sgp->driverfs_dev->driver->name); -else -printk (" (driver?)\n" ); - -/* now show the partitions */ -for (n =0 ; n < sgp->minors -1 ; ++n) { -if (sgp->part[n] ==NULL ) -continue ; -if (sgp->part[n]->nr_sects ==0 ) -continue ; -printk (" %02x%02x %10llu %s\n" , - sgp->major, n +1 + sgp->first_minor, - (unsigned long long )sgp->part[n]->nr_sects >>1 , -disk_name (sgp, n +1 , buf)); - } + sgp =dev_to_disk (dev); +/* +* Don't show empty devices or things that have been surpressed +*/ +if (get_capacity (sgp) ==0 || + (sgp->flags &GENHD_FL_SUPPRESS_PARTITION_INFO )) + goto exit; + +/* +* Note, unlike /proc/partitions, I am showing the numbers in +* hex - the same format as the root= option takes. +*/ +printk ("%02x%02x %10llu %s" , + sgp->major, sgp->first_minor, + (unsigned long long )get_capacity (sgp) >>1 , +disk_name (sgp,0 , buf)); +if (sgp->driverfs_dev !=NULL && + sgp->driverfs_dev->driver !=NULL ) +printk (" driver: %s\n" , + sgp->driverfs_dev->driver->name); +else +printk (" (driver?)\n" ); + +/* now show the partitions */ +for (n =0 ; n < sgp->minors -1 ; ++n) { +if (sgp->part[n] ==NULL ) + goto exit; +if (sgp->part[n]->nr_sects ==0 ) + goto exit; +printk (" %02x%02x %10llu %s\n" , + sgp->major, n +1 + sgp->first_minor, + (unsigned long long )sgp->part[n]->nr_sects >>1 , +disk_name (sgp, n +1 , buf)); } +exit: +return 0 ; +} +/* +* print a full list of all partitions - intended for places where the root +* filesystem can't be mounted and thus to give the victim some idea of what +* went wrong +*/ +void __init printk_all_partitions (void ) +{ +mutex_lock (&block_class_lock); +class_for_each_device (&block_class,NULL ,NULL , printk_partition);mutex_unlock (&block_class_lock); }
Signature · 1 line
1.5.6.3
PATCH 35/79 block: make blk_lookup_devt use the class iterator function
In reply to Greg KHUse the proper class iterator function instead of mucking around in the internals of the class structures.
--- block/genhd.c | 38 ++++++++++++++++++++++++++------------ 1 files changed, 26 insertions(+), 12 deletions(-)
block/genhd.c +26 -12
@@ -677,24 +677,38 @@ void genhd_media_change_notify(struct gendisk *disk)EXPORT_SYMBOL_GPL (genhd_media_change_notify);#endif /* 0 */ +struct find_block { +const char *name; +int part; +}; + +static int match_id (struct device *dev,void *data) +{ +struct find_block *find = data; + +if (dev->type != &disk_type) +return 0 ; +if (strcmp (dev->bus_id, find->name) ==0 ) { +struct gendisk *disk =dev_to_disk (dev); +if (find->part < disk->minors) +return 1 ; + } +return 0 ; +} +dev_t blk_lookup_devt (const char *name,int part) {struct device *dev;dev_t devt =MKDEV (0 ,0 ); +struct find_block find;mutex_lock (&block_class_lock); -list_for_each_entry (dev, &block_class.devices, node) { -if (dev->type != &disk_type) -continue ; -if (strcmp (dev->bus_id, name) ==0 ) { -struct gendisk *disk =dev_to_disk (dev); - -if (part < disk->minors) - devt =MKDEV (MAJOR (dev->devt), -MINOR (dev->devt) + part); -break ; - } - } + find.name = name; + find.part = part; + dev =class_find_device (&block_class,NULL , (void *)&find, match_id); +if (dev) + devt =MKDEV (MAJOR (dev->devt), +MINOR (dev->devt) + part);mutex_unlock (&block_class_lock);return devt;
Signature · 1 line
1.5.6.3
PATCH 36/79 block: make /proc/diskstats only build if CONFIG_PROC_FS is enabled
In reply to Greg KHFrom: Randy Dunlap <[email protected]>
These functions are only needed if CONFIG_PROC_FS is enabled, so save the space when it is not.
This also makes it easier for a patch later in this series to work properly if CONFIG_PROC_FS is not enabled.
--- block/genhd.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-)
block/genhd.c +2 -0
@@ -544,6 +544,7 @@ static struct device_type disk_type = { .release = disk_release, }; +#ifdef CONFIG_PROC_FS /* * aggregate disk stat collector. Uses the same stats that the sysfs * entries do, above, but makes them available through one seq_file.
@@ -653,6 +654,7 @@ const struct seq_operations diskstats_op = { .stop = diskstats_stop, .show = diskstats_show }; +#endif /* CONFIG_PROC_FS */ static void media_change_notify_thread (struct work_struct *work) {
Signature · 1 line
1.5.6.3
PATCH 37/79 block: make proc files seq_start use the class_find_device()
In reply to Greg KHUse the proper class iterator function instead of mucking around in the internals of the class structures.
--- block/genhd.c | 31 +++++++++++++++++-------------- 1 files changed, 17 insertions(+), 14 deletions(-)
block/genhd.c +17 -14
@@ -291,18 +291,25 @@ void __init printk_all_partitions(void)#ifdef CONFIG_PROC_FS /* iterator */ +static int find_start (struct device *dev,void *data) +{ +loff_t k = *(loff_t *)data; + +if (dev->type != &disk_type) +return 0 ; +if (!k--) +return 1 ; +return 0 ; +} +static void *part_start (struct seq_file *part,loff_t *pos) { -loff_t k = *pos;struct device *dev;mutex_lock (&block_class_lock); -list_for_each_entry (dev, &block_class.devices, node) { -if (dev->type != &disk_type) -continue ; -if (!k--) -return dev_to_disk (dev); - } + dev =class_find_device (&block_class,NULL , (void *)pos, find_start); +if (dev) +return dev_to_disk (dev);return NULL ; }
@@ -555,16 +562,12 @@ static struct device_type disk_type = {static void *diskstats_start (struct seq_file *part,loff_t *pos) { -loff_t k = *pos;struct device *dev;mutex_lock (&block_class_lock); -list_for_each_entry (dev, &block_class.devices, node) { -if (dev->type != &disk_type) -continue ; -if (!k--) -return dev_to_disk (dev); - } + dev =class_find_device (&block_class,NULL , (void *)pos, find_start); +if (dev) +return dev_to_disk (dev);return NULL ; }
Signature · 1 line
1.5.6.3
PATCH 38/79 block: move header for /proc/partitions to seq_start
In reply to Greg KHThe seq_start call is the better place for the header for the file, that way we don't have to be mucking in the class structure to try to figure out if this is the first partition or not.
--- block/genhd.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-)
block/genhd.c +4 -3
@@ -305,6 +305,10 @@ static int find_start(struct device *dev, void *data)static void *part_start (struct seq_file *part,loff_t *pos) {struct device *dev; +loff_t n = *pos; + +if (!n) +seq_puts (part,"major minor #blocks name\n\n" );mutex_lock (&block_class_lock); dev =class_find_device (&block_class,NULL , (void *)pos, find_start);
@@ -338,9 +342,6 @@ static int show_partition(struct seq_file *part, void *v)int n;char buf[BDEVNAME_SIZE ]; -if (&sgp->dev.node == block_class.devices.next) -seq_puts (part,"major minor #blocks name\n\n" ); -/* Don't show non-partitionable removeable devices or empty devices */ if (!get_capacity (sgp) || (sgp->minors ==1 && (sgp->flags &GENHD_FL_REMOVABLE )))
Signature · 1 line
1.5.6.3
PATCH 39/79 block: make /proc/partitions and /proc/diskstats use class_find_device()
In reply to Greg KHUse the proper class iterator function instead of mucking around in the internals of the class structures.
--- block/genhd.c | 25 +++++++++++++------------ 1 files changed, 13 insertions(+), 12 deletions(-)
block/genhd.c +13 -12
@@ -317,17 +317,21 @@ static void *part_start(struct seq_file *part, loff_t *pos)return NULL ; } +static int find_next (struct device *dev,void *data) +{ +if (dev->type == &disk_type) +return 1 ; +return 0 ; +} +static void *part_next (struct seq_file *part,void *v,loff_t *pos) {struct gendisk *gp = v;struct device *dev; ++*pos; -list_for_each_entry (dev, &gp->dev.node, node) { -if (&dev->node == &block_class.devices) -return NULL ; -if (dev->type == &disk_type) -return dev_to_disk (dev); - } + dev =class_find_device (&block_class, &gp->dev,NULL , find_next); +if (dev) +return dev_to_disk (dev);return NULL ; }
@@ -578,12 +582,9 @@ static void *diskstats_next(struct seq_file *part, void *v, loff_t *pos)struct device *dev; ++*pos; -list_for_each_entry (dev, &gp->dev.node, node) { -if (&dev->node == &block_class.devices) -return NULL ; -if (dev->type == &disk_type) -return dev_to_disk (dev); - } + dev =class_find_device (&block_class, &gp->dev,NULL , find_next); +if (dev) +return dev_to_disk (dev);return NULL ; }
Signature · 1 line
1.5.6.3
PATCH 40/79 infiniband: rename "device" to "ib_device" in cm_device
In reply to Greg KHThis pointer really is a struct ib_device, not a struct device, so name it properly to help prevent confusion.
This makes the followon patch in this series much smaller and easier to understand as well.
--- drivers/infiniband/core/cm.c | 47 +++++++++++++++++++++-------------------- 1 files changed, 24 insertions(+), 23 deletions(-)
drivers/infiniband/core/cm.c +24 -23
@@ -162,7 +162,7 @@ struct cm_port {struct cm_device {struct list_head list; -struct ib_device *device; +struct ib_device *ib_device;struct kobject dev_obj;u8 ack_delay;struct cm_port *port[0 ];
@@ -339,7 +339,7 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc, { av->port = port; av->pkey_index = wc->pkey_index; -ib_init_ah_from_wc (port->cm_dev->device, port->port_num, wc, +ib_init_ah_from_wc (port->cm_dev->ib_device, port->port_num, wc, grh, &av->ah_attr); }
@@ -353,7 +353,7 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)read_lock_irqsave (&cm.device_lock, flags);list_for_each_entry (cm_dev, &cm.device_list, list) { -if (!ib_find_cached_gid (cm_dev->device, &path->sgid, +if (!ib_find_cached_gid (cm_dev->ib_device, &path->sgid, &p,NULL )) { port = cm_dev->port[p-1 ];break ;
@@ -364,13 +364,13 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)if (!port)return -EINVAL ; - ret =ib_find_cached_pkey (cm_dev->device, port->port_num, + ret =ib_find_cached_pkey (cm_dev->ib_device, port->port_num,be16_to_cpu (path->pkey), &av->pkey_index);if (ret)return ret; av->port = port; -ib_init_ah_from_path (cm_dev->device, port->port_num, path, +ib_init_ah_from_path (cm_dev->ib_device, port->port_num, path, &av->ah_attr); av->timeout = path->packet_life_time +1 ;return 0 ;
@@ -1515,7 +1515,7 @@ static int cm_req_handler(struct cm_work *work) req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad; - cm_id =ib_create_cm_id (work->port->cm_dev->device,NULL ,NULL ); + cm_id =ib_create_cm_id (work->port->cm_dev->ib_device,NULL ,NULL );if (IS_ERR (cm_id))return PTR_ERR (cm_id);
@@ -1550,7 +1550,7 @@ static int cm_req_handler(struct cm_work *work)cm_format_paths_from_req (req_msg, &work->path[0 ], &work->path[1 ]); ret =cm_init_av_by_path (&work->path[0 ], &cm_id_priv->av);if (ret) { -ib_get_cached_gid (work->port->cm_dev->device, +ib_get_cached_gid (work->port->cm_dev->ib_device, work->port->port_num,0 , &work->path[0 ].sgid); ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_GID, &work->path[0].sgid, sizeof work->path[0].sgid,
@@ -2950,7 +2950,7 @@ static int cm_sidr_req_handler(struct cm_work *work)struct cm_sidr_req_msg *sidr_req_msg;struct ib_wc *wc; - cm_id =ib_create_cm_id (work->port->cm_dev->device,NULL ,NULL ); + cm_id =ib_create_cm_id (work->port->cm_dev->ib_device,NULL ,NULL );if (IS_ERR (cm_id))return PTR_ERR (cm_id); cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3578,7 +3578,7 @@ static void cm_get_ack_delay(struct cm_device *cm_dev) {struct ib_device_attr attr; -if (ib_query_device (cm_dev->device, &attr)) +if (ib_query_device (cm_dev->ib_device, &attr)) cm_dev->ack_delay =0 ;/* acks will rely on packet life time */ else cm_dev->ack_delay = attr.local_ca_ack_delay;
@@ -3676,7 +3676,7 @@ static void cm_remove_port_fs(struct cm_port *port)kobject_put (&port->port_obj); } -static void cm_add_one (struct ib_device *device) +static void cm_add_one (struct ib_device *ib_device) {struct cm_device *cm_dev;struct cm_port *port;
@@ -3691,26 +3691,27 @@ static void cm_add_one(struct ib_device *device)int ret;u8 i; -if (rdma_node_get_transport (device->node_type) !=RDMA_TRANSPORT_IB ) +if (rdma_node_get_transport (ib_device->node_type) !=RDMA_TRANSPORT_IB )return ; cm_dev =kzalloc (sizeof (*cm_dev) +sizeof (*port) * - device->phys_port_cnt,GFP_KERNEL ); + ib_device->phys_port_cnt,GFP_KERNEL );if (!cm_dev)return ; - cm_dev->device = device; + cm_dev->ib_device = ib_device;cm_get_ack_delay (cm_dev); ret =kobject_init_and_add (&cm_dev->dev_obj, &cm_dev_obj_type, - &cm_class.subsys.kobj,"%s" , device->name); + &cm_class.subsys.kobj,"%s" , + ib_device->name);if (ret) {kfree (cm_dev);return ; }set_bit (IB_MGMT_METHOD_SEND , reg_req.method_mask); -for (i =1 ; i <= device->phys_port_cnt; i++) { +for (i =1 ; i <= ib_device->phys_port_cnt; i++) { port =kzalloc (sizeof *port,GFP_KERNEL );if (!port) goto error1;
@@ -3723,7 +3724,7 @@ static void cm_add_one(struct ib_device *device)if (ret) goto error1; - port->mad_agent = ib_register_mad_agent(device, i, + port->mad_agent = ib_register_mad_agent(ib_device, i, IB_QPT_GSI, ®_req, 0,
@@ -3733,11 +3734,11 @@ static void cm_add_one(struct ib_device *device)if (IS_ERR (port->mad_agent)) goto error2; - ret =ib_modify_port (device, i,0 , &port_modify); + ret =ib_modify_port (ib_device, i,0 , &port_modify);if (ret) goto error3; } -ib_set_client_data (device, &cm_client, cm_dev); +ib_set_client_data (ib_device, &cm_client, cm_dev);write_lock_irqsave (&cm.device_lock, flags);list_add_tail (&cm_dev->list, &cm.device_list);
@@ -3753,14 +3754,14 @@ error1: port_modify.clr_port_cap_mask =IB_PORT_CM_SUP ;while (--i) { port = cm_dev->port[i-1 ]; -ib_modify_port (device, port->port_num,0 , &port_modify); +ib_modify_port (ib_device, port->port_num,0 , &port_modify);ib_unregister_mad_agent (port->mad_agent);cm_remove_port_fs (port); }kobject_put (&cm_dev->dev_obj); } -static void cm_remove_one (struct ib_device *device) +static void cm_remove_one (struct ib_device *ib_device) {struct cm_device *cm_dev;struct cm_port *port;
@@ -3770,7 +3771,7 @@ static void cm_remove_one(struct ib_device *device)unsigned long flags;int i; - cm_dev =ib_get_client_data (device, &cm_client); + cm_dev =ib_get_client_data (ib_device, &cm_client);if (!cm_dev)return ;
@@ -3778,9 +3779,9 @@ static void cm_remove_one(struct ib_device *device)list_del (&cm_dev->list);write_unlock_irqrestore (&cm.device_lock, flags); -for (i =1 ; i <= device->phys_port_cnt; i++) { +for (i =1 ; i <= ib_device->phys_port_cnt; i++) { port = cm_dev->port[i-1 ]; -ib_modify_port (device, port->port_num,0 , &port_modify); +ib_modify_port (ib_device, port->port_num,0 , &port_modify);ib_unregister_mad_agent (port->mad_agent);flush_workqueue (cm.wq);cm_remove_port_fs (port);
Signature · 1 line
1.5.6.3
PATCH 41/79 infiniband: make cm_device use a struct device and not a kobject.
In reply to Greg KHThis object really should be a struct device, or at least contain a pointer to a struct device, as it is trying to create a separate device tree outside of the main device tree. This patch fixes this problem.
It is needed for the class core rework that is being done in the driver core.
--- drivers/infiniband/core/cm.c | 29 +++++++++-------------------- 1 files changed, 9 insertions(+), 20 deletions(-)
drivers/infiniband/core/cm.c +9 -20
@@ -44,6 +44,7 @@#include <linux/spinlock.h> #include <linux/sysfs.h> #include <linux/workqueue.h> +#include <linux/kdev_t.h> #include <rdma/ib_cache.h> #include <rdma/ib_cm.h>
@@ -163,7 +164,7 @@ struct cm_port {struct cm_device {struct list_head list;struct ib_device *ib_device; -struct kobject dev_obj; +struct device *device;u8 ack_delay;struct cm_port *port[0 ]; };
@@ -3618,18 +3619,6 @@ static struct kobj_type cm_port_obj_type = { .release = cm_release_port_obj }; -static void cm_release_dev_obj (struct kobject *obj) -{ -struct cm_device *cm_dev; - - cm_dev = container_of(obj, struct cm_device, dev_obj); -kfree (cm_dev); -} - -static struct kobj_type cm_dev_obj_type = { - .release = cm_release_dev_obj -}; -struct class cm_class = { .name ="infiniband_cm" , };
@@ -3640,7 +3629,7 @@ static int cm_create_port_fs(struct cm_port *port)int i, ret; ret =kobject_init_and_add (&port->port_obj, &cm_port_obj_type, - &port->cm_dev->dev_obj, + &port->cm_dev->device->kobj,"%d" , port->port_num);if (ret) {kfree (port);
@@ -3702,10 +3691,10 @@ static void cm_add_one(struct ib_device *ib_device) cm_dev->ib_device = ib_device;cm_get_ack_delay (cm_dev); - ret =kobject_init_and_add (&cm_dev->dev_obj, &cm_dev_obj_type, - &cm_class.subsys.kobj,"%s" , - ib_device->name); -if (ret) { + cm_dev->device =device_create_drvdata (&cm_class, &ib_device->dev, +MKDEV (0 ,0 ),NULL , +"%s" , ib_device->name); +if (!cm_dev->device) {kfree (cm_dev);return ; }
@@ -3758,7 +3747,7 @@ error1:ib_unregister_mad_agent (port->mad_agent);cm_remove_port_fs (port); } -kobject_put (&cm_dev->dev_obj); +device_unregister (cm_dev->device); }static void cm_remove_one (struct ib_device *ib_device)
@@ -3786,7 +3775,7 @@ static void cm_remove_one(struct ib_device *ib_device)flush_workqueue (cm.wq);cm_remove_port_fs (port); } -kobject_put (&cm_dev->dev_obj); +device_unregister (cm_dev->device); }static int __init ib_cm_init (void )
Signature · 1 line
1.5.6.3
PATCH 42/79 bluetooth: remove improper bluetooth class symlinks.
In reply to Greg KHDon't create symlinks in a class to a device that is not owned by the class. If the bluetooth subsystem really wants to point to all of the devices it controls, it needs to create real devices, not fake symlinks.
--- net/bluetooth/hci_sysfs.c | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-)
net/bluetooth/hci_sysfs.c +0 -7
@@ -398,10 +398,6 @@ int hci_register_sysfs(struct hci_dev *hdev)if (device_create_file (dev, bt_attrs[i]) <0 )BT_ERR ("Failed to create device attribute" ); -if (sysfs_create_link (&bt_class->subsys.kobj, - &dev->kobj,kobject_name (&dev->kobj)) <0 ) -BT_ERR ("Failed to create class symlink" ); -return 0 ; }
@@ -409,9 +405,6 @@ void hci_unregister_sysfs(struct hci_dev *hdev) {BT_DBG ("%p name %s type %d" , hdev, hdev->name, hdev->type); -sysfs_remove_link (&bt_class->subsys.kobj, -kobject_name (&hdev->dev.kobj)); -device_del (&hdev->dev); }
Signature · 1 line
1.5.6.3
PATCH 43/79 class: move driver core specific parts to a private structure
In reply to Greg KHThis moves the portions of struct class that are dynamic (kobject and lock and lists) out of the main structure and into a dynamic, private, structure.
--- drivers/base/base.h | 27 +++++++++++++++ drivers/base/class.c | 87 ++++++++++++++++++++++++++--------------------- drivers/base/core.c | 57 ++++++++++++++++--------------- include/linux/device.h | 7 +--- 4 files changed, 107 insertions(+), 71 deletions(-)
drivers/base/base.h +27 -0
@@ -36,6 +36,33 @@ struct driver_private { };#define to_driver (obj) container_of(obj, struct driver_private, kobj) + +/** +* struct class_private - structure to hold the private to the driver core portions of the class structure. +* +* @subsys - the struct kset that defines this class. This is the main kobject +* @children - list of class_devices associated with this class +* @devices - list of devices associated with this class +* @interfaces - list of class_interfaces associated with this class +* @class_dirs - +* @sem - semaphore to protect the children, devices, and interfaces lists. +* @class - pointer back to the struct class that this structure is associated +* with. +* +* This structure is the one that is the actual kobject allowing struct +* class to be statically allocated safely. Nothing outside of the driver +* core should ever touch these fields. +*/ +struct class_private { +struct kset subsys; +struct list_head devices; +struct list_head interfaces; +struct kset class_dirs; +struct semaphore sem; +struct class *class; +}; +#define to_class (obj) container_of(obj, struct class_private, subsys.kobj) +/* initialisation functions */ extern int devices_init (void );extern int buses_init (void );
drivers/base/class.c +48 -39
207 lines not on this page · raw message
drivers/base/core.c +30 -27
154 lines not on this page · raw message
include/linux/device.h +2 -5
@@ -35,6 +35,7 @@ struct device;struct device_driver ;struct driver_private ;struct class ; +struct class_private ;struct bus_type ;struct bus_type_private ;
@@ -186,11 +187,6 @@ struct class {const char *name;struct module *owner; -struct kset subsys; -struct list_head devices; -struct list_head interfaces; -struct kset class_dirs; -struct semaphore sem;/* locks children, devices, interfaces */ struct class_attribute *class_attrs;struct device_attribute *dev_attrs;struct kobject *dev_kobj;
@@ -204,6 +200,7 @@ struct class {int (*resume)(struct device *dev);struct pm_ops *pm; +struct class_private *p; };extern struct kobject *sysfs_dev_block_kobj;
Signature · 1 line
1.5.6.3
PATCH 44/79 class: rename "devices" to "class_devices" in internal class structure
In reply to Greg KHThis renames the struct class "devices" field to be "class_devices" to make things easier when struct bus_type and struct class merge in the future. It also makes grepping for fields easier as well.
Based on an idea from Kay.
--- drivers/base/base.h | 4 ++-- drivers/base/class.c | 10 +++++----- drivers/base/core.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-)
drivers/base/base.h +2 -2
@@ -42,7 +42,7 @@ struct driver_private {* * @subsys - the struct kset that defines this class. This is the main kobject * @children - list of class_devices associated with this class -* @devices - list of devices associated with this class +* @class_devices - list of devices associated with this class * @interfaces - list of class_interfaces associated with this class * @class_dirs - * @sem - semaphore to protect the children, devices, and interfaces lists.
@@ -55,7 +55,7 @@ struct driver_private {*/ struct class_private {struct kset subsys; -struct list_head devices; +struct list_head class_devices;struct list_head interfaces;struct kset class_dirs;struct semaphore sem;
drivers/base/class.c +5 -5
@@ -143,7 +143,7 @@ int class_register(struct class *cls) cp =kzalloc (sizeof (*cp),GFP_KERNEL );if (!cp)return -ENOMEM ; -INIT_LIST_HEAD (&cp->devices); +INIT_LIST_HEAD (&cp->class_devices);INIT_LIST_HEAD (&cp->interfaces);kset_init (&cp->class_dirs);init_MUTEX (&cp->sem);
@@ -290,7 +290,7 @@ int class_for_each_device(struct class *class, struct device *start,if (!class)return -EINVAL ;down (&class->p->sem); -list_for_each_entry (dev, &class->p->devices, node) { +list_for_each_entry (dev, &class->p->class_devices, node) {if (start) {if (start == dev) start =NULL ;
@@ -340,7 +340,7 @@ struct device *class_find_device(struct class *class, struct device *start,return NULL ;down (&class->p->sem); -list_for_each_entry (dev, &class->p->devices, node) { +list_for_each_entry (dev, &class->p->class_devices, node) {if (start) {if (start == dev) start =NULL ;
@@ -374,7 +374,7 @@ int class_interface_register(struct class_interface *class_intf)down (&parent->p->sem);list_add_tail (&class_intf->node, &parent->p->interfaces);if (class_intf->add_dev) { -list_for_each_entry (dev, &parent->p->devices, node) +list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->add_dev (dev, class_intf); }up (&parent->p->sem);
@@ -393,7 +393,7 @@ void class_interface_unregister(struct class_interface *class_intf)down (&parent->p->sem);list_del_init (&class_intf->node);if (class_intf->remove_dev) { -list_for_each_entry (dev, &parent->p->devices, node) +list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->remove_dev (dev, class_intf); }up (&parent->p->sem);
drivers/base/core.c +1 -1
@@ -906,7 +906,7 @@ int device_add(struct device *dev)if (dev->class) {down (&dev->class->p->sem);/* tie the class to the device */ -list_add_tail (&dev->node, &dev->class->p->devices); +list_add_tail (&dev->node, &dev->class->p->class_devices);/* notify any interfaces that the device is here */ list_for_each_entry(class_intf, &dev->class->p->interfaces,
Signature · 1 line
1.5.6.3
PATCH 45/79 class: rename "interfaces" to "class_interfaces" in internal class structure
In reply to Greg KHThis renames the struct class "interfaces" field to be "class_interfaces" to make things easier when struct bus_type and struct class merge in the future. It also makes grepping for fields easier as well.
Based on an idea from Kay.
--- drivers/base/base.h | 4 ++-- drivers/base/class.c | 4 ++-- drivers/base/core.c | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-)
drivers/base/base.h +2 -2
@@ -43,7 +43,7 @@ struct driver_private {* @subsys - the struct kset that defines this class. This is the main kobject * @children - list of class_devices associated with this class * @class_devices - list of devices associated with this class -* @interfaces - list of class_interfaces associated with this class +* @class_interfaces - list of class_interfaces associated with this class * @class_dirs - * @sem - semaphore to protect the children, devices, and interfaces lists. * @class - pointer back to the struct class that this structure is associated
@@ -56,7 +56,7 @@ struct driver_private {struct class_private {struct kset subsys;struct list_head class_devices; -struct list_head interfaces; +struct list_head class_interfaces;struct kset class_dirs;struct semaphore sem;struct class *class;
drivers/base/class.c +2 -2
@@ -144,7 +144,7 @@ int class_register(struct class *cls)if (!cp)return -ENOMEM ;INIT_LIST_HEAD (&cp->class_devices); -INIT_LIST_HEAD (&cp->interfaces); +INIT_LIST_HEAD (&cp->class_interfaces);kset_init (&cp->class_dirs);init_MUTEX (&cp->sem); error =kobject_set_name (&cp->subsys.kobj,"%s" , cls->name);
@@ -372,7 +372,7 @@ int class_interface_register(struct class_interface *class_intf)return -EINVAL ;down (&parent->p->sem); -list_add_tail (&class_intf->node, &parent->p->interfaces); +list_add_tail (&class_intf->node, &parent->p->class_interfaces);if (class_intf->add_dev) {list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->add_dev (dev, class_intf);
drivers/base/core.c +4 -4
@@ -909,8 +909,8 @@ int device_add(struct device *dev)list_add_tail (&dev->node, &dev->class->p->class_devices);/* notify any interfaces that the device is here */ -list_for_each_entry (class_intf, &dev->class->p->interfaces, - node) +list_for_each_entry (class_intf, + &dev->class->p->class_interfaces, node)if (class_intf->add_dev) class_intf->add_dev (dev, class_intf);up (&dev->class->p->sem);
@@ -1016,8 +1016,8 @@ void device_del(struct device *dev)down (&dev->class->p->sem);/* notify any interfaces that the device is now gone */ -list_for_each_entry (class_intf, &dev->class->p->interfaces, - node) +list_for_each_entry (class_intf, + &dev->class->p->class_interfaces, node)if (class_intf->remove_dev) class_intf->remove_dev (dev, class_intf);/* remove the device from the class list */
Signature · 1 line
1.5.6.3
PATCH 46/79 class: rename "subsys" to "class_subsys" in internal class structure
In reply to Greg KHThis renames the struct class "subsys" field to be "class_subsys" to make things easier when struct bus_type and struct class merge in the future. It also makes grepping for fields easier as well.
Based on an idea from Kay.
--- drivers/base/base.h | 7 ++++--- drivers/base/class.c | 23 ++++++++++++----------- drivers/base/core.c | 31 +++++++++++++++++-------------- 3 files changed, 33 insertions(+), 28 deletions(-)
drivers/base/base.h +4 -3
@@ -40,7 +40,7 @@ struct driver_private {/** * struct class_private - structure to hold the private to the driver core portions of the class structure. * -* @subsys - the struct kset that defines this class. This is the main kobject +* @class_subsys - the struct kset that defines this class. This is the main kobject * @children - list of class_devices associated with this class * @class_devices - list of devices associated with this class * @class_interfaces - list of class_interfaces associated with this class
@@ -54,14 +54,15 @@ struct driver_private {* core should ever touch these fields. */ struct class_private { -struct kset subsys; +struct kset class_subsys;struct list_head class_devices;struct list_head class_interfaces;struct kset class_dirs;struct semaphore sem;struct class *class; }; -#define to_class (obj) container_of(obj, struct class_private, subsys.kobj) +#define to_class (obj) \ + container_of(obj, struct class_private, class_subsys.kobj)/* initialisation functions */ extern int devices_init (void );
drivers/base/class.c +12 -11
@@ -70,7 +70,7 @@ static struct kobj_type class_ktype = { .release = class_release, }; -/* Hotplug events for classes go to the class_obj subsys */ +/* Hotplug events for classes go to the class class_subsys */ static struct kset *class_kset;
@@ -78,7 +78,8 @@ int class_create_file(struct class *cls, const struct class_attribute *attr) {int error;if (cls) - error =sysfs_create_file (&cls->p->subsys.kobj, &attr->attr); + error =sysfs_create_file (&cls->p->class_subsys.kobj, + &attr->attr);else error = -EINVAL ;return error;
@@ -87,20 +88,20 @@ int class_create_file(struct class *cls, const struct class_attribute *attr)void class_remove_file (struct class *cls,const struct class_attribute *attr) {if (cls) -sysfs_remove_file (&cls->p->subsys.kobj, &attr->attr); +sysfs_remove_file (&cls->p->class_subsys.kobj, &attr->attr); }static struct class *class_get (struct class *cls) {if (cls) -kset_get (&cls->p->subsys); +kset_get (&cls->p->class_subsys);return cls; }static void class_put (struct class *cls) {if (cls) -kset_put (&cls->p->subsys); +kset_put (&cls->p->class_subsys); }static int add_class_attrs (struct class *cls)
@@ -147,7 +148,7 @@ int class_register(struct class *cls)INIT_LIST_HEAD (&cp->class_interfaces);kset_init (&cp->class_dirs);init_MUTEX (&cp->sem); - error =kobject_set_name (&cp->subsys.kobj,"%s" , cls->name); + error =kobject_set_name (&cp->class_subsys.kobj,"%s" , cls->name);if (error) {kfree (cp);return error;
@@ -160,15 +161,15 @@ int class_register(struct class *cls)#if defined(CONFIG_SYSFS_DEPRECATED ) && defined(CONFIG_BLOCK )/* let the block class directory show up in the root of sysfs */ if (cls != &block_class) - cp->subsys.kobj.kset = class_kset; + cp->class_subsys.kobj.kset = class_kset;#else - cp->subsys.kobj.kset = class_kset; + cp->class_subsys.kobj.kset = class_kset;#endif - cp->subsys.kobj.ktype = &class_ktype; + cp->class_subsys.kobj.ktype = &class_ktype; cp->class = cls; cls->p = cp; - error =kset_register (&cp->subsys); + error =kset_register (&cp->class_subsys);if (error) {kfree (cp);return error;
@@ -182,7 +183,7 @@ void class_unregister(struct class *cls) {pr_debug ("device class '%s': unregistering\n" , cls->name);remove_class_attrs (cls); -kset_unregister (&cls->p->subsys); +kset_unregister (&cls->p->class_subsys); }static void class_create_release (struct class *cls)
drivers/base/core.c +17 -14
@@ -551,7 +551,7 @@ static struct kobject *get_device_parent(struct device *dev, {/* class devices without a parent live in /sys/class/<classname>/ */ if (dev->class && (!parent || parent->class != dev->class)) -return &dev->class->p->subsys.kobj; +return &dev->class->p->class_subsys.kobj;/* all other devices keep their parent */ else if (parent)return &parent->kobj;
@@ -657,16 +657,17 @@ static int device_add_class_symlinks(struct device *dev)if (!dev->class)return 0 ; - error =sysfs_create_link (&dev->kobj, &dev->class->p->subsys.kobj, + error =sysfs_create_link (&dev->kobj, + &dev->class->p->class_subsys.kobj,"subsystem" );if (error) goto out;#ifdef CONFIG_SYSFS_DEPRECATED /* stacked class devices need a symlink in the class directory */ -if (dev->kobj.parent != &dev->class->p->subsys.kobj && +if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&device_is_not_partition (dev)) { - error =sysfs_create_link (&dev->class->p->subsys.kobj, + error =sysfs_create_link (&dev->class->p->class_subsys.kobj, &dev->kobj, dev->bus_id);if (error) goto out_subsys;
@@ -704,13 +705,14 @@ out_device:if (dev->parent &&device_is_not_partition (dev))sysfs_remove_link (&dev->kobj,"device" ); out_busid: -if (dev->kobj.parent != &dev->class->p->subsys.kobj && +if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&device_is_not_partition (dev)) -sysfs_remove_link (&dev->class->p->subsys.kobj, dev->bus_id); +sysfs_remove_link (&dev->class->p->class_subsys.kobj, + dev->bus_id);#else /* link in the class directory pointing to the device */ - error =sysfs_create_link (&dev->class->p->subsys.kobj, &dev->kobj, - dev->bus_id); + error =sysfs_create_link (&dev->class->p->class_subsys.kobj, + &dev->kobj, dev->bus_id);if (error) goto out_subsys;
@@ -723,7 +725,7 @@ out_busid:return 0 ; out_busid: -sysfs_remove_link (&dev->class->p->subsys.kobj, dev->bus_id); +sysfs_remove_link (&dev->class->p->class_subsys.kobj, dev->bus_id);#endif out_subsys:
@@ -749,14 +751,15 @@ static void device_remove_class_symlinks(struct device *dev) sysfs_remove_link(&dev->kobj, "device"); } -if (dev->kobj.parent != &dev->class->p->subsys.kobj && +if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&device_is_not_partition (dev)) -sysfs_remove_link (&dev->class->p->subsys.kobj, dev->bus_id); +sysfs_remove_link (&dev->class->p->class_subsys.kobj, + dev->bus_id);#else if (dev->parent &&device_is_not_partition (dev))sysfs_remove_link (&dev->kobj,"device" ); -sysfs_remove_link (&dev->class->p->subsys.kobj, dev->bus_id); +sysfs_remove_link (&dev->class->p->class_subsys.kobj, dev->bus_id);#endif sysfs_remove_link (&dev->kobj,"subsystem" );
@@ -1350,11 +1353,11 @@ int device_rename(struct device *dev, char *new_name) }#else if (dev->class) { - error =sysfs_create_link (&dev->class->p->subsys.kobj, + error =sysfs_create_link (&dev->class->p->class_subsys.kobj, &dev->kobj, dev->bus_id);if (error) goto out; -sysfs_remove_link (&dev->class->p->subsys.kobj, +sysfs_remove_link (&dev->class->p->class_subsys.kobj, old_device_name); }#endif
Signature · 1 line
1.5.6.3
PATCH 47/79 class: rename "sem" to "class_sem" in internal class structure
In reply to Greg KHThis renames the struct class "sem" field to be "class_sem" to make things easier when struct bus_type and struct class merge in the future. It also makes grepping for fields easier as well.
Based on an idea from Kay.
--- drivers/base/base.h | 4 ++-- drivers/base/class.c | 22 +++++++++++----------- drivers/base/core.c | 8 ++++---- 3 files changed, 17 insertions(+), 17 deletions(-)
drivers/base/base.h +2 -2
@@ -45,7 +45,7 @@ struct driver_private {* @class_devices - list of devices associated with this class * @class_interfaces - list of class_interfaces associated with this class * @class_dirs - -* @sem - semaphore to protect the children, devices, and interfaces lists. +* @class_sem - semaphore to protect the children, devices, and interfaces lists. * @class - pointer back to the struct class that this structure is associated * with. *
@@ -58,7 +58,7 @@ struct class_private {struct list_head class_devices;struct list_head class_interfaces;struct kset class_dirs; -struct semaphore sem; +struct semaphore class_sem;struct class *class; };#define to_class (obj) \
drivers/base/class.c +11 -11
@@ -147,7 +147,7 @@ int class_register(struct class *cls)INIT_LIST_HEAD (&cp->class_devices);INIT_LIST_HEAD (&cp->class_interfaces);kset_init (&cp->class_dirs); -init_MUTEX (&cp->sem); +init_MUTEX (&cp->class_sem); error =kobject_set_name (&cp->class_subsys.kobj,"%s" , cls->name);if (error) {kfree (cp);
@@ -278,7 +278,7 @@ char *make_class_name(const char *name, struct kobject *kobj)* We check the return of @fn each time. If it returns anything * other than 0, we break out and return that value. * -* Note, we hold class->sem in this function, so it can not be +* Note, we hold class->class_sem in this function, so it can not be * re-acquired in @fn, otherwise it will self-deadlocking. For * example, calls to add or remove class members would be verboten. */
@@ -290,7 +290,7 @@ int class_for_each_device(struct class *class, struct device *start,if (!class)return -EINVAL ; -down (&class->p->sem); +down (&class->p->class_sem);list_for_each_entry (dev, &class->p->class_devices, node) {if (start) {if (start == dev)
@@ -303,7 +303,7 @@ int class_for_each_device(struct class *class, struct device *start,if (error)break ; } -up (&class->p->sem); +up (&class->p->class_sem);return error; }
@@ -326,7 +326,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device);* * Note, you will need to drop the reference with put_device() after use. * -* We hold class->sem in this function, so it can not be +* We hold class->class_sem in this function, so it can not be * re-acquired in @match, otherwise it will self-deadlocking. For * example, calls to add or remove class members would be verboten. */
@@ -340,7 +340,7 @@ struct device *class_find_device(struct class *class, struct device *start,if (!class)return NULL ; -down (&class->p->sem); +down (&class->p->class_sem);list_for_each_entry (dev, &class->p->class_devices, node) {if (start) {if (start == dev)
@@ -354,7 +354,7 @@ struct device *class_find_device(struct class *class, struct device *start, }else put_device (dev); } -up (&class->p->sem); +up (&class->p->class_sem);return found ? dev :NULL ; }
@@ -372,13 +372,13 @@ int class_interface_register(struct class_interface *class_intf)if (!parent)return -EINVAL ; -down (&parent->p->sem); +down (&parent->p->class_sem);list_add_tail (&class_intf->node, &parent->p->class_interfaces);if (class_intf->add_dev) {list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->add_dev (dev, class_intf); } -up (&parent->p->sem); +up (&parent->p->class_sem);return 0 ; }
@@ -391,13 +391,13 @@ void class_interface_unregister(struct class_interface *class_intf)if (!parent)return ; -down (&parent->p->sem); +down (&parent->p->class_sem);list_del_init (&class_intf->node);if (class_intf->remove_dev) {list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->remove_dev (dev, class_intf); } -up (&parent->p->sem); +up (&parent->p->class_sem);class_put (parent); }
drivers/base/core.c +4 -4
@@ -907,7 +907,7 @@ int device_add(struct device *dev)klist_add_tail (&dev->knode_parent, &parent->klist_children);if (dev->class) { -down (&dev->class->p->sem); +down (&dev->class->p->class_sem);/* tie the class to the device */ list_add_tail (&dev->node, &dev->class->p->class_devices);
@@ -916,7 +916,7 @@ int device_add(struct device *dev) &dev->class->p->class_interfaces, node)if (class_intf->add_dev) class_intf->add_dev (dev, class_intf); -up (&dev->class->p->sem); +up (&dev->class->p->class_sem); } Done:put_device (dev);
@@ -1017,7 +1017,7 @@ void device_del(struct device *dev)if (dev->class) {device_remove_class_symlinks (dev); -down (&dev->class->p->sem); +down (&dev->class->p->class_sem);/* notify any interfaces that the device is now gone */ list_for_each_entry (class_intf, &dev->class->p->class_interfaces, node)
@@ -1025,7 +1025,7 @@ void device_del(struct device *dev) class_intf->remove_dev (dev, class_intf);/* remove the device from the class list */ list_del_init (&dev->node); -up (&dev->class->p->sem); +up (&dev->class->p->class_sem); }device_remove_file (dev, &uevent_attr);device_remove_attrs (dev);
Signature · 1 line
1.5.6.3
PATCH 48/79 class: fix docbook comments for class_private structure
In reply to Greg KHRemoves a field that has been deleted, and adds a description fo the class_dirs field which was previously undocumented.
--- drivers/base/base.h | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
drivers/base/base.h +1 -2
@@ -41,10 +41,9 @@ struct driver_private {* struct class_private - structure to hold the private to the driver core portions of the class structure. * * @class_subsys - the struct kset that defines this class. This is the main kobject -* @children - list of class_devices associated with this class * @class_devices - list of devices associated with this class * @class_interfaces - list of class_interfaces associated with this class -* @class_dirs - +* @class_dirs - "glue" directory for virtual devices associated with this class * @class_sem - semaphore to protect the children, devices, and interfaces lists. * @class - pointer back to the struct class that this structure is associated * with.
Signature · 1 line
1.5.6.3
PATCH 49/79 class: add lockdep infrastructure
In reply to Greg KHFrom: Matthew Wilcox <[email protected]>
This adds the infrastructure to properly handle lockdep issues when the internal class semaphore is changed to a mutex.
Matthew wrote the original patch, and Greg fixed it up to work properly with the class_create() function.
From: Matthew Wilcox <[email protected]>
--- drivers/base/class.c | 11 ++++++----- include/linux/device.h | 25 +++++++++++++++++++++++-- 2 files changed, 29 insertions(+), 7 deletions(-)
drivers/base/class.c +6 -5
@@ -134,7 +134,7 @@ static void remove_class_attrs(struct class *cls) } } -int class_register (struct class *cls) +int __class_register (struct class *cls,struct lock_class_key *key) {struct class_private *cp;int error;
@@ -178,6 +178,7 @@ int class_register(struct class *cls)class_put (cls);return error; } +EXPORT_SYMBOL_GPL (__class_register);void class_unregister (struct class *cls) {
@@ -203,7 +204,8 @@ static void class_create_release(struct class *cls)* Note, the pointer created here is to be destroyed when finished by * making a call to class_destroy(). */ -struct class *class_create (struct module *owner,const char *name) +struct class *__class_create (struct module *owner,const char *name, +struct lock_class_key *key) {struct class *cls;int retval;
@@ -218,7 +220,7 @@ struct class *class_create(struct module *owner, const char *name) cls->owner = owner; cls->class_release = class_create_release; - retval =class_register (cls); + retval =__class_register (cls, key);if (retval) goto error;
@@ -228,6 +230,7 @@ error:kfree (cls);return ERR_PTR (retval); } +EXPORT_SYMBOL_GPL (__class_create);/** * class_destroy - destroys a struct class structure
@@ -412,9 +415,7 @@ int __init classes_init(void)EXPORT_SYMBOL_GPL (class_create_file);EXPORT_SYMBOL_GPL (class_remove_file); -EXPORT_SYMBOL_GPL (class_register);EXPORT_SYMBOL_GPL (class_unregister); -EXPORT_SYMBOL_GPL (class_create);EXPORT_SYMBOL_GPL (class_destroy);EXPORT_SYMBOL_GPL (class_interface_register);
include/linux/device.h +23 -2
@@ -16,6 +16,7 @@#include <linux/kobject.h> #include <linux/klist.h> #include <linux/list.h> +#include <linux/lockdep.h> #include <linux/compiler.h> #include <linux/types.h> #include <linux/module.h>
@@ -205,8 +206,18 @@ struct class {extern struct kobject *sysfs_dev_block_kobj;extern struct kobject *sysfs_dev_char_kobj; -extern int __must_check class_register (struct class *class); +extern int __must_check __class_register (struct class *class, +struct lock_class_key *key);extern void class_unregister (struct class *class); + +/* This is a #define to keep the compiler from merging different +* instances of the __key variable */ +#define class_register (class) \ +({ \ + static struct lock_class_key __key; \ + __class_register(class, &__key); \ +}) +extern int class_for_each_device (struct class *class,struct device *start,void *data,int (*fn)(struct device *dev,void *data));
@@ -239,9 +250,19 @@ struct class_interface {extern int __must_check class_interface_register (struct class_interface *);extern void class_interface_unregister (struct class_interface *); -extern struct class *class_create (struct module *owner,const char *name); +extern struct class *__must_check __class_create (struct module *owner, +const char *name, +struct lock_class_key *key);extern void class_destroy (struct class *cls); +/* This is a #define to keep the compiler from merging different +* instances of the __key variable */ +#define class_create (owner, name) \ +({ \ + static struct lock_class_key __key; \ + __class_create(owner, name, &__key); \ +}) +/* * The type of device, "struct device" is embedded in. A class * or bus can contain devices of different types
Signature · 1 line
1.5.6.3
PATCH 50/79 class: change internal semaphore to a mutex
In reply to Greg KHFrom: Dave Young <[email protected]>
Now that the lockdep infrastructure in the class core is in place, we should be able to properly change the internal class semaphore to be a mutex.
David wrote the original patch, and Greg fixed it up to apply properly due to all of the recent changes in this area.
From: Dave Young <[email protected]>
--- drivers/base/base.h | 4 ++-- drivers/base/class.c | 23 ++++++++++++----------- drivers/base/core.c | 9 +++++---- 3 files changed, 19 insertions(+), 17 deletions(-)
drivers/base/base.h +2 -2
@@ -44,7 +44,7 @@ struct driver_private {* @class_devices - list of devices associated with this class * @class_interfaces - list of class_interfaces associated with this class * @class_dirs - "glue" directory for virtual devices associated with this class -* @class_sem - semaphore to protect the children, devices, and interfaces lists. +* @class_mutex - mutex to protect the children, devices, and interfaces lists. * @class - pointer back to the struct class that this structure is associated * with. *
@@ -57,7 +57,7 @@ struct class_private {struct list_head class_devices;struct list_head class_interfaces;struct kset class_dirs; -struct semaphore class_sem; +struct mutex class_mutex;struct class *class; };#define to_class (obj) \
drivers/base/class.c +12 -11
@@ -18,6 +18,7 @@#include <linux/err.h> #include <linux/slab.h> #include <linux/genhd.h> +#include <linux/mutex.h> #include "base.h" #define to_class_attr (_attr) container_of(_attr, struct class_attribute, attr)
@@ -147,7 +148,7 @@ int __class_register(struct class *cls, struct lock_class_key *key)INIT_LIST_HEAD (&cp->class_devices);INIT_LIST_HEAD (&cp->class_interfaces);kset_init (&cp->class_dirs); -init_MUTEX (&cp->class_sem); +__mutex_init (&cp->class_mutex,"struct class mutex" , key); error =kobject_set_name (&cp->class_subsys.kobj,"%s" , cls->name);if (error) {kfree (cp);
@@ -281,7 +282,7 @@ char *make_class_name(const char *name, struct kobject *kobj)* We check the return of @fn each time. If it returns anything * other than 0, we break out and return that value. * -* Note, we hold class->class_sem in this function, so it can not be +* Note, we hold class->class_mutex in this function, so it can not be * re-acquired in @fn, otherwise it will self-deadlocking. For * example, calls to add or remove class members would be verboten. */
@@ -293,7 +294,7 @@ int class_for_each_device(struct class *class, struct device *start,if (!class)return -EINVAL ; -down (&class->p->class_sem); +mutex_lock (&class->p->class_mutex);list_for_each_entry (dev, &class->p->class_devices, node) {if (start) {if (start == dev)
@@ -306,7 +307,7 @@ int class_for_each_device(struct class *class, struct device *start,if (error)break ; } -up (&class->p->class_sem); +mutex_unlock (&class->p->class_mutex);return error; }
@@ -329,7 +330,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device);* * Note, you will need to drop the reference with put_device() after use. * -* We hold class->class_sem in this function, so it can not be +* We hold class->class_mutex in this function, so it can not be * re-acquired in @match, otherwise it will self-deadlocking. For * example, calls to add or remove class members would be verboten. */
@@ -343,7 +344,7 @@ struct device *class_find_device(struct class *class, struct device *start,if (!class)return NULL ; -down (&class->p->class_sem); +mutex_lock (&class->p->class_mutex);list_for_each_entry (dev, &class->p->class_devices, node) {if (start) {if (start == dev)
@@ -357,7 +358,7 @@ struct device *class_find_device(struct class *class, struct device *start, }else put_device (dev); } -up (&class->p->class_sem); +mutex_unlock (&class->p->class_mutex);return found ? dev :NULL ; }
@@ -375,13 +376,13 @@ int class_interface_register(struct class_interface *class_intf)if (!parent)return -EINVAL ; -down (&parent->p->class_sem); +mutex_lock (&parent->p->class_mutex);list_add_tail (&class_intf->node, &parent->p->class_interfaces);if (class_intf->add_dev) {list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->add_dev (dev, class_intf); } -up (&parent->p->class_sem); +mutex_unlock (&parent->p->class_mutex);return 0 ; }
@@ -394,13 +395,13 @@ void class_interface_unregister(struct class_interface *class_intf)if (!parent)return ; -down (&parent->p->class_sem); +mutex_lock (&parent->p->class_mutex);list_del_init (&class_intf->node);if (class_intf->remove_dev) {list_for_each_entry (dev, &parent->p->class_devices, node) class_intf->remove_dev (dev, class_intf); } -up (&parent->p->class_sem); +mutex_unlock (&parent->p->class_mutex);class_put (parent); }
drivers/base/core.c +5 -4
@@ -21,6 +21,7 @@#include <linux/genhd.h> #include <linux/kallsyms.h> #include <linux/semaphore.h> +#include <linux/mutex.h> #include "base.h" #include "power/power.h"
@@ -907,7 +908,7 @@ int device_add(struct device *dev)klist_add_tail (&dev->knode_parent, &parent->klist_children);if (dev->class) { -down (&dev->class->p->class_sem); +mutex_lock (&dev->class->p->class_mutex);/* tie the class to the device */ list_add_tail (&dev->node, &dev->class->p->class_devices);
@@ -916,7 +917,7 @@ int device_add(struct device *dev) &dev->class->p->class_interfaces, node)if (class_intf->add_dev) class_intf->add_dev (dev, class_intf); -up (&dev->class->p->class_sem); +mutex_unlock (&dev->class->p->class_mutex); } Done:put_device (dev);
@@ -1017,7 +1018,7 @@ void device_del(struct device *dev)if (dev->class) {device_remove_class_symlinks (dev); -down (&dev->class->p->class_sem); +mutex_lock (&dev->class->p->class_mutex);/* notify any interfaces that the device is now gone */ list_for_each_entry (class_intf, &dev->class->p->class_interfaces, node)
@@ -1025,7 +1026,7 @@ void device_del(struct device *dev) class_intf->remove_dev (dev, class_intf);/* remove the device from the class list */ list_del_init (&dev->node); -up (&dev->class->p->class_sem); +mutex_unlock (&dev->class->p->class_mutex); }device_remove_file (dev, &uevent_attr);device_remove_attrs (dev);
Signature · 1 line
1.5.6.3
PATCH 51/79 driver core: remove KOBJ_NAME_LEN define
In reply to Greg KHFrom: Kay Sievers <[email protected]>
Kobjects do not have a limit in name size since a while, so stop pretending that they do.
--- arch/arm/plat-omap/mailbox.c | 2 +- arch/sparc64/kernel/vio.c | 2 +- drivers/message/fusion/mptbase.c | 3 ++- drivers/message/fusion/mptbase.h | 4 ++-- drivers/message/fusion/mptfc.c | 4 ++-- drivers/pci/hotplug/acpiphp.h | 4 ++-- drivers/scsi/hosts.c | 4 ++-- drivers/scsi/scsi_transport_fc.c | 9 +++++---- drivers/scsi/scsi_transport_iscsi.c | 4 ++-- fs/partitions/check.c | 2 +- include/linux/device.h | 3 +-- include/linux/kobject.h | 1 - include/linux/spi/spi.h | 2 +- include/scsi/scsi_host.h | 2 +- include/scsi/scsi_transport_fc.h | 4 ++-- include/scsi/scsi_transport_iscsi.h | 2 +- 16 files changed, 26 insertions(+), 26 deletions(-)
arch/arm/plat-omap/mailbox.c +1 -1
@@ -334,7 +334,7 @@ static int omap_mbox_init(struct omap_mbox *mbox) } mbox->dev.class = &omap_mbox_class; -strlcpy (mbox->dev.bus_id, mbox->name,KOBJ_NAME_LEN ); +strlcpy (mbox->dev.bus_id, mbox->name,BUS_ID_SIZE );dev_set_drvdata (&mbox->dev, mbox); ret =device_register (&mbox->dev);
arch/sparc64/kernel/vio.c +1 -1
@@ -224,7 +224,7 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp,if (!strcmp (type,"domain-services-port" )) bus_id_name ="ds" ; -if (strlen (bus_id_name) >=KOBJ_NAME_LEN -4 ) { +if (strlen (bus_id_name) >=BUS_ID_SIZE -4 ) {printk (KERN_ERR "VIO: bus_id_name [%s] is too long.\n" , bus_id_name);return NULL ;
drivers/message/fusion/mptbase.c +2 -1
@@ -1670,7 +1670,8 @@ mpt_attach(struct pci_dev *pdev, const struct pci_device_id *id)INIT_DELAYED_WORK (&ioc->fault_reset_work, mpt_fault_reset_work);spin_lock_init (&ioc->fault_reset_work_lock); -snprintf (ioc->reset_work_q_name,KOBJ_NAME_LEN ,"mpt_poll_%d" , ioc->id); +snprintf (ioc->reset_work_q_name,sizeof (ioc->reset_work_q_name), +"mpt_poll_%d" , ioc->id); ioc->reset_work_q =create_singlethread_workqueue (ioc->reset_work_q_name);if (!ioc->reset_work_q) {
drivers/message/fusion/mptbase.h +2 -2
@@ -707,12 +707,12 @@ typedef struct _MPT_ADAPTERu8 fc_link_speed[2 ];spinlock_t fc_rescan_work_lock;struct work_struct fc_rescan_work; -char fc_rescan_work_q_name[KOBJ_NAME_LEN ]; +char fc_rescan_work_q_name[20 ];struct workqueue_struct *fc_rescan_work_q;struct scsi_cmnd **ScsiLookup;spinlock_t scsi_lookup_lock; -char reset_work_q_name[KOBJ_NAME_LEN ]; +char reset_work_q_name[20 ];struct workqueue_struct *reset_work_q;struct delayed_work fault_reset_work;spinlock_t fault_reset_work_lock;
drivers/message/fusion/mptfc.c +2 -2
@@ -1326,8 +1326,8 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)/* initialize workqueue */ -snprintf (ioc->fc_rescan_work_q_name,KOBJ_NAME_LEN ,"mptfc_wq_%d" , - sh->host_no); +snprintf (ioc->fc_rescan_work_q_name,sizeof (ioc->fc_rescan_work_q_name), +"mptfc_wq_%d" , sh->host_no); ioc->fc_rescan_work_q =create_singlethread_workqueue (ioc->fc_rescan_work_q_name);if (!ioc->fc_rescan_work_q)
drivers/pci/hotplug/acpiphp.h +2 -2
@@ -36,7 +36,7 @@#define _ACPIPHP_H#include <linux/acpi.h> -#include <linux/kobject.h> /* for KOBJ_NAME_LEN */ +#include <linux/kobject.h> #include <linux/mutex.h> #include <linux/pci_hotplug.h>
@@ -51,7 +51,7 @@ #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg)/* name size which is used for entries in pcihpfs */ -#define SLOT_NAME_SIZE KOBJ_NAME_LEN/* {_SUN} */ +#define SLOT_NAME_SIZE 20/* {_SUN} */ struct acpiphp_bridge ;struct acpiphp_slot ;
drivers/scsi/hosts.c +2 -2
@@ -232,8 +232,8 @@ int scsi_add_host(struct Scsi_Host *shost, struct device *dev) }if (shost->transportt->create_work_queue) { -snprintf (shost->work_q_name,KOBJ_NAME_LEN ,"scsi_wq_%d" , - shost->host_no); +snprintf (shost->work_q_name,sizeof (shost->work_q_name), +"scsi_wq_%d" , shost->host_no); shost->work_q =create_singlethread_workqueue ( shost->work_q_name);if (!shost->work_q) {
drivers/scsi/scsi_transport_fc.c +5 -4
@@ -417,15 +417,16 @@ static int fc_host_setup(struct transport_container *tc, struct device *dev, fc_host->next_vport_number =0 ; fc_host->npiv_vports_inuse =0 ; -snprintf (fc_host->work_q_name,KOBJ_NAME_LEN ,"fc_wq_%d" , - shost->host_no); +snprintf (fc_host->work_q_name,sizeof (fc_host->work_q_name), +"fc_wq_%d" , shost->host_no); fc_host->work_q =create_singlethread_workqueue ( fc_host->work_q_name);if (!fc_host->work_q)return -ENOMEM ; -snprintf (fc_host->devloss_work_q_name,KOBJ_NAME_LEN ,"fc_dl_%d" , - shost->host_no); +snprintf (fc_host->devloss_work_q_name, +sizeof (fc_host->devloss_work_q_name), +"fc_dl_%d" , shost->host_no); fc_host->devloss_work_q =create_singlethread_workqueue ( fc_host->devloss_work_q_name);if (!fc_host->devloss_work_q) {
drivers/scsi/scsi_transport_iscsi.c +2 -2
@@ -247,8 +247,8 @@ static int iscsi_setup_host(struct transport_container *tc, struct device *dev,atomic_set (&ihost->nr_scans,0 );mutex_init (&ihost->mutex); -snprintf (ihost->scan_workq_name,KOBJ_NAME_LEN ,"iscsi_scan_%d" , - shost->host_no); +snprintf (ihost->scan_workq_name,sizeof (ihost->scan_workq_name), +"iscsi_scan_%d" , shost->host_no); ihost->scan_workq =create_singlethread_workqueue ( ihost->scan_workq_name);if (!ihost->scan_workq)
fs/partitions/check.c +1 -1
@@ -401,7 +401,7 @@ void register_disk(struct gendisk *disk) disk->dev.parent = disk->driverfs_dev; disk->dev.devt =MKDEV (disk->major, disk->first_minor); -strlcpy (disk->dev.bus_id, disk->disk_name,KOBJ_NAME_LEN ); +strlcpy (disk->dev.bus_id, disk->disk_name,BUS_ID_SIZE );/* ewww... some of these buggers have / in the name... */ s =strchr (disk->dev.bus_id,'/' );if (s)
include/linux/device.h +1 -2
@@ -29,8 +29,7 @@/* DEVICE_NAME_HALF is really less than half to accommodate slop */ #define DEVICE_NAME_HALF __stringify(20)#define DEVICE_ID_SIZE 32 -#define BUS_ID_SIZE KOBJ_NAME_LEN - +#define BUS_ID_SIZE 20struct device ;struct device_driver ;
include/linux/kobject.h +0 -1
@@ -26,7 +26,6 @@#include <linux/wait.h> #include <asm/atomic.h> -#define KOBJ_NAME_LEN 20#define UEVENT_HELPER_PATH_LEN 256#define UEVENT_NUM_ENVP 32/* number of env pointers */ #define UEVENT_BUFFER_SIZE 2048/* buffer for the variables */
include/linux/spi/spi.h +1 -1
@@ -733,7 +733,7 @@ struct spi_board_info {* controller_data goes to spi_device.controller_data, * irq is copied too */ -char modalias[KOBJ_NAME_LEN ]; +char modalias[32 ];const void *platform_data;void *controller_data;int irq;
include/scsi/scsi_host.h +1 -1
@@ -623,7 +623,7 @@ struct Scsi_Host {/* * Optional work queue to be utilized by the transport */ -char work_q_name[KOBJ_NAME_LEN ]; +char work_q_name[20 ];struct workqueue_struct *work_q;/*
include/scsi/scsi_transport_fc.h +2 -2
@@ -489,9 +489,9 @@ struct fc_host_attrs {u16 npiv_vports_inuse;/* work queues for rport state manipulation */ -char work_q_name[KOBJ_NAME_LEN ]; +char work_q_name[20 ];struct workqueue_struct *work_q; -char devloss_work_q_name[KOBJ_NAME_LEN ]; +char devloss_work_q_name[20 ];struct workqueue_struct *devloss_work_q; };
include/scsi/scsi_transport_iscsi.h +1 -1
@@ -198,7 +198,7 @@ struct iscsi_cls_host {atomic_t nr_scans;struct mutex mutex;struct workqueue_struct *scan_workq; -char scan_workq_name[KOBJ_NAME_LEN ]; +char scan_workq_name[20 ]; }; extern void iscsi_host_for_each_session(struct Scsi_Host *shost,
Signature · 1 line
1.5.6.3
PATCH 52/79 driver core: remove DEVICE_NAME_SIZE define
In reply to Greg KHFrom: Kay Sievers <[email protected]>
There is no such thing as a "device name size" in the driver core, so remove the define and fix up any users of this odd define in the rest of the kernel.
--- drivers/eisa/Makefile | 2 +- drivers/eisa/eisa-bus.c | 4 ++-- drivers/mca/mca-bus.c | 2 +- drivers/video/aty/aty128fb.c | 2 +- drivers/video/aty/radeonfb.h | 2 +- include/linux/device.h | 3 --- include/linux/eisa.h | 2 +- 7 files changed, 7 insertions(+), 10 deletions(-)
drivers/eisa/Makefile +1 -1
@@ -9,7 +9,7 @@ obj-${CONFIG_EISA_VIRTUAL_ROOT} += virtual_root.o # Ugly hack to get DEVICE_NAME_SIZE value... -DEVICE_NAME_SIZE =$(shell awk '$$1=="\#define" && $$2=="DEVICE_NAME_SIZE" {print $$3-1}' $(srctree)/include/linux/device.h) +DEVICE_NAME_SIZE = 50 $(obj)/eisa-bus.o: $(obj)/devlist.h
drivers/eisa/eisa-bus.c +2 -2
@@ -22,7 +22,7 @@struct eisa_device_info {struct eisa_device_id id; -char name[DEVICE_NAME_SIZE ]; +char name[50 ]; };#ifdef CONFIG_EISA_NAMES
@@ -63,7 +63,7 @@ static void __init eisa_name_device (struct eisa_device *edev)if (!strcmp (edev->id.sig, eisa_table[i].id.sig)) {strlcpy (edev->pretty_name, eisa_table[i].name, -DEVICE_NAME_SIZE ); +sizeof (edev->pretty_name));return ; } }
drivers/mca/mca-bus.c +1 -1
@@ -40,7 +40,7 @@ static struct mca_bus *mca_root_busses[MAX_MCA_BUSSES];struct mca_device_info {short pos_id;/* the 2 byte pos id for this card */ -char name[DEVICE_NAME_SIZE ]; +char name[50 ]; };static int mca_bus_match (struct device *dev,struct device_driver *drv)
drivers/video/aty/aty128fb.c +1 -1
@@ -1872,7 +1872,7 @@ static int __devinit aty128_init(struct pci_dev *pdev, const struct pci_device_istruct fb_info *info =pci_get_drvdata (pdev);struct aty128fb_par *par = info->par;struct fb_var_screeninfo var; -char video_card[DEVICE_NAME_SIZE ]; +char video_card[50 ];u8 chip_rev;u32 dac;
drivers/video/aty/radeonfb.h +1 -1
@@ -289,7 +289,7 @@ struct radeonfb_info {struct radeon_regs state;struct radeon_regs init_state; -char name[DEVICE_NAME_SIZE ]; +char name[50 ];unsigned long mmio_base_phys;unsigned long fb_base_phys;
include/linux/device.h +0 -3
@@ -25,9 +25,6 @@#include <asm/atomic.h> #include <asm/device.h> -#define DEVICE_NAME_SIZE 50 -/* DEVICE_NAME_HALF is really less than half to accommodate slop */ -#define DEVICE_NAME_HALF __stringify(20)#define DEVICE_ID_SIZE 32#define BUS_ID_SIZE 20
include/linux/eisa.h +1 -1
@@ -40,7 +40,7 @@ struct eisa_device {u64 dma_mask;struct device dev;/* generic device */ #ifdef CONFIG_EISA_NAMES -char pretty_name[DEVICE_NAME_SIZE ]; +char pretty_name[50 ];#endif };
Signature · 1 line
1.5.6.3
PATCH 53/79 driver core: remove DEVICE_ID_SIZE define
In reply to Greg KHThere is no such thing as a "device id size" in the driver core, so remove the define and fix up any users of this odd define in the rest of the kernel.
--- drivers/memstick/host/jmb38x_ms.c | 4 ++-- include/linux/device.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-)
drivers/memstick/host/jmb38x_ms.c +2 -2
@@ -51,7 +51,7 @@ struct jmb38x_ms_host {void __iomem *addr;spinlock_t lock;int id; -char host_id[DEVICE_ID_SIZE ]; +char host_id[32 ];int irq;unsigned int block_pos;unsigned long timeout_jiffies;
@@ -781,7 +781,7 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt)spin_lock_init (&host->lock); host->id = cnt; -snprintf (host->host_id,DEVICE_ID_SIZE ,DRIVER_NAME ":slot%d" , +snprintf (host->host_id,sizeof (host->host_id),DRIVER_NAME ":slot%d" , host->id); host->irq = jm->pdev->irq; host->timeout_jiffies =msecs_to_jiffies (1000 );
include/linux/device.h +0 -1
@@ -25,7 +25,6 @@#include <asm/atomic.h> #include <asm/device.h> -#define DEVICE_ID_SIZE 32#define BUS_ID_SIZE 20struct device ;
Signature · 1 line
1.5.6.3
PATCH 54/79 driver core: fix a lot of printk usages of bus_id
In reply to Greg KHWe have the dev_printk() variants for this kind of thing, use them instead of directly trying to access the bus_id field of struct device.
This is done in order to remove bus_id entirely.
--- arch/arm/common/dmabounce.c | 22 +++++++++------------- arch/arm/common/sa1111.c | 3 ++- arch/arm/kernel/ecard.c | 3 +-- arch/arm/mach-integrator/impd1.c | 3 +-- arch/powerpc/platforms/chrp/pci.c | 2 +- arch/x86/kernel/pci-dma.c | 6 ++---- arch/x86/kernel/pci-gart_64.c | 4 +--- drivers/acpi/fan.c | 10 +++++----- drivers/acpi/glue.c | 6 ++---- drivers/acpi/processor_core.c | 5 ++--- drivers/acpi/scan.c | 2 +- drivers/acpi/thermal.c | 4 ++-- drivers/acpi/video.c | 5 ++--- drivers/base/power/trace.c | 2 +- 14 files changed, 32 insertions(+), 45 deletions(-)
arch/arm/common/dmabounce.c +9 -13
@@ -554,9 +554,8 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, device_info =kmalloc (sizeof (struct dmabounce_device_info ),GFP_ATOMIC );if (!device_info) { -printk (KERN_ERR -"Could not allocated dmabounce_device_info for %s" , - dev->bus_id); +dev_err (dev, +"Could not allocated dmabounce_device_info\n" );return -ENOMEM ; }
@@ -594,8 +593,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, dev->archdata.dmabounce = device_info; -printk (KERN_INFO "dmabounce: registered device %s on %s bus\n" , - dev->bus_id, dev->bus->name); +dev_info (dev,"dmabounce: registered device\n" );return 0 ;
@@ -614,16 +612,15 @@ dmabounce_unregister_dev(struct device *dev) dev->archdata.dmabounce =NULL ;if (!device_info) { -printk (KERN_WARNING -"%s: Never registered with dmabounce but attempting" \ -"to unregister!\n" , dev->bus_id); +dev_warn (dev, +"Never registered with dmabounce but attempting" +"to unregister!\n" );return ; }if (!list_empty (&device_info->safe_buffers)) { -printk (KERN_ERR -"%s: Removing from dmabounce with pending buffers!\n" , - dev->bus_id); +dev_err (dev, +"Removing from dmabounce with pending buffers!\n" );BUG (); }
@@ -639,8 +636,7 @@ dmabounce_unregister_dev(struct device *dev)kfree (device_info); -printk (KERN_INFO "dmabounce: device %s on %s bus unregistered\n" , - dev->bus_id, dev->bus->name); +dev_info (dev,"dmabounce: device unregistered\n" ); }
arch/arm/common/sa1111.c +2 -1
@@ -593,7 +593,8 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,if (dev->dma_mask !=0xffffffffUL ) { ret =dmabounce_register_dev (&dev->dev,1024 ,4096 );if (ret) { -printk ("SA1111: Failed to register %s with dmabounce" , dev->dev.bus_id); +dev_err (&dev->dev,"SA1111: Failed to register" +" with dmabounce\n" );device_unregister (&dev->dev); } }
arch/arm/kernel/ecard.c +1 -2
@@ -853,8 +853,7 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot)for (i =0 ; i <ECARD_NUM_RESOURCES ; i++) {if (ec->resource[i].flags &&request_resource (&iomem_resource, &ec->resource[i])) { -printk (KERN_ERR "%s: resource(s) not available\n" , - ec->dev.bus_id); +dev_err (&ec->dev,"resource(s) not available\n" ); ec->resource[i].end -= ec->resource[i].start; ec->resource[i].start =0 ; ec->resource[i].flags =0 ;
arch/arm/mach-integrator/impd1.c +1 -2
@@ -407,8 +407,7 @@ static int impd1_probe(struct lm_device *dev) ret =amba_device_register (d, &dev->resource);if (ret) { -printk ("unable to register device %s: %d\n" , - d->dev.bus_id, ret); +dev_err (&d->dev,"unable to register device: %d\n" );kfree (d); } }
arch/powerpc/platforms/chrp/pci.c +1 -1
@@ -367,7 +367,7 @@ static void chrp_pci_fixup_vt8231_ata(struct pci_dev *viaide) viaisa =pci_get_device (PCI_VENDOR_ID_VIA ,PCI_DEVICE_ID_VIA_8231 ,NULL );if (!viaisa)return ; -printk ("Fixing VIA IDE, force legacy mode on '%s'\n" , viaide->dev.bus_id); +dev_info (&viaide->dev,"Fixing VIA IDE, force legacy mode on\n" );pci_read_config_byte (viaide,PCI_CLASS_PROG , &progif);pci_write_config_byte (viaide,PCI_CLASS_PROG , progif & ~0x5 );
arch/x86/kernel/pci-dma.c +2 -4
@@ -314,8 +314,7 @@ int dma_supported(struct device *dev, u64 mask) {#ifdef CONFIG_PCI if (mask >0xffffffff && forbid_dac >0 ) { -printk (KERN_INFO "PCI: Disallowing DAC for device %s\n" , - dev->bus_id); +dev_info (dev,"PCI: Disallowing DAC for device\n" );return 0 ; }#endif
@@ -342,8 +341,7 @@ int dma_supported(struct device *dev, u64 mask)type. Normally this doesn't make any difference, but gives more gentle handling of IOMMU overflow. */ if (iommu_sac_force && (mask >=DMA_40BIT_MASK )) { -printk (KERN_INFO "%s: Force SAC with mask %Lx\n" , - dev->bus_id, mask); +dev_info (dev,"Force SAC with mask %Lx\n" , mask);return 0 ; }
arch/x86/kernel/pci-gart_64.c +1 -3
@@ -198,9 +198,7 @@ static void iommu_full(struct device *dev, size_t size, int dir)* out. Hopefully no network devices use single mappings that big. */ -printk (KERN_ERR -"PCI-DMA: Out of IOMMU space for %lu bytes at device %s\n" , - size, dev->bus_id); +dev_err (dev,"PCI-DMA: Out of IOMMU space for %lu bytes\n" , size);if (size >PAGE_SIZE *EMERGENCY_PAGES ) {if (dir ==PCI_DMA_FROMDEVICE || dir ==PCI_DMA_BIDIRECTIONAL )
drivers/acpi/fan.c +5 -5
@@ -263,22 +263,22 @@ static int acpi_fan_add(struct acpi_device *device) goto end; } - printk(KERN_INFO PREFIX -"%s is registered as cooling_device%d\n" , - device->dev.bus_id, cdev->id); +dev_info (&device->dev,"registered as cooling_device%d\n" , cdev->id);acpi_driver_data (device) = cdev; result =sysfs_create_link (&device->dev.kobj, &cdev->device.kobj,"thermal_cooling" );if (result) - printk(KERN_ERR PREFIX "Create sysfs link\n"); +dev_err (&device->dev,"Failed to create sysfs link " +"'thermal_cooling'\n" ); result =sysfs_create_link (&cdev->device.kobj, &device->dev.kobj,"device" );if (result) - printk(KERN_ERR PREFIX "Create sysfs link\n"); +dev_err (&device->dev,"Failed to create sysfs link " +"'device'\n" ); result =acpi_fan_add_fs (device);if (result)
drivers/acpi/glue.c +2 -4
@@ -146,8 +146,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)acpi_status status;if (dev->archdata.acpi_handle) { - printk(KERN_WARNING PREFIX - "Drivers changed 'acpi_handle' for %s\n", dev->bus_id); +dev_warn (dev,"Drivers changed 'acpi_handle'\n" );return -EINVAL ; }get_device (dev);
@@ -195,8 +194,7 @@ static int acpi_unbind_one(struct device *dev)/* acpi_bind_one increase refcnt by one */ put_device (dev); }else { - printk(KERN_ERR PREFIX - "Oops, 'acpi_handle' corrupt for %s\n", dev->bus_id); +dev_err (dev,"Oops, 'acpi_handle' corrupt\n" ); }return 0 ; }
drivers/acpi/processor_core.c +2 -3
@@ -714,9 +714,8 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device) goto end; } - printk(KERN_INFO PREFIX -"%s is registered as cooling_device%d\n" , - device->dev.bus_id, pr->cdev->id); +dev_info (&device->dev,"registered as cooling_device%d\n" , + pr->cdev->id); result = sysfs_create_link(&device->dev.kobj, &pr->cdev->device.kobj,
drivers/acpi/scan.c +1 -1
@@ -471,7 +471,7 @@ static int acpi_device_register(struct acpi_device *device, device->dev.release = &acpi_device_release; result =device_add (&device->dev);if (result) { - printk(KERN_ERR PREFIX "Error adding device %s", device->dev.bus_id); +dev_err (&device->dev,"Error adding device\n" ); goto end; }
drivers/acpi/thermal.c +2 -2
@@ -1179,8 +1179,8 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz) tz->tz_enabled =1 ; - printk(KERN_INFO PREFIX "%s is registered as thermal_zone%d\n", - tz->device->dev.bus_id, tz->thermal_zone->id); +dev_info (&tz->device->dev,"registered as thermal_zone%d\n" , + tz->thermal_zone->id);return 0 ; }
drivers/acpi/video.c +2 -3
@@ -762,9 +762,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)if (IS_ERR (device->cdev))return ; - printk(KERN_INFO PREFIX -"%s is registered as cooling_device%d\n" , - device->dev->dev.bus_id, device->cdev->id); +dev_info (&device->dev->dev,"registered as cooling_device%d\n" , + device->cdev->id); result =sysfs_create_link (&device->dev->dev.kobj, &device->cdev->device.kobj,"thermal_cooling" );
drivers/base/power/trace.c +1 -1
@@ -194,7 +194,7 @@ static int show_dev_hash(unsigned int value)struct device * dev =to_device (entry);unsigned int hash =hash_string (DEVSEED , dev->bus_id,DEVHASH );if (hash == value) { -printk (" hash matches device %s\n" , dev->bus_id); +dev_info (dev,"hash matches\n" ); match++; } entry = entry->prev;
Signature · 1 line
1.5.6.3
PATCH 55/79 pnp: add acpi:* modalias entries
In reply to Greg KHFrom: Kay Sievers <[email protected]>
Along with the non-modalias conformant "pnp:*" aliases, we add "acpi:*" entries to PNP drivers, to allow module autoloading by ACPI PNP device entries, which export proper modalias information, without any specific userspace modprobe mangling.
--- scripts/mod/file2alias.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-)
scripts/mod/file2alias.c +16 -8
@@ -340,11 +340,18 @@ static int do_acpi_entry(const char *filename, }/* looks like: "pnp:dD" */ -static int do_pnp_entry (const char *filename, -struct pnp_device_id *id,char *alias) +static void do_pnp_device_entry (void *symval,unsigned long size, +struct module *mod) { -sprintf (alias,"pnp:d%s*" , id->id); -return 1 ; +const unsigned long id_size =sizeof (struct pnp_device_id ); +const struct pnp_device_id *id = symval; + +device_id_check (mod->name,"pnp" , size, id_size, symval); + +buf_printf (&mod->dev_table_buf, +"MODULE_ALIAS(\"pnp:d%s*\");\n" , id->id); +buf_printf (&mod->dev_table_buf, +"MODULE_ALIAS(\"acpi*:%s:*\");\n" , id->id); }/* looks like: "pnp:dD" for every device of the card */
@@ -388,9 +395,12 @@ static void do_pnp_card_entries(void *symval, unsigned long size, }/* add an individual alias for every device entry */ -if (!dup) +if (!dup) {buf_printf (&mod->dev_table_buf,"MODULE_ALIAS(\"pnp:d%s*\");\n" , id); +buf_printf (&mod->dev_table_buf, +"MODULE_ALIAS(\"acpi*:%s:*\");\n" , id); + } } } }
@@ -701,9 +711,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,sizeof (struct acpi_device_id ),"acpi" , do_acpi_entry, mod); else if (sym_is(symname, "__mod_pnp_device_table")) - do_table(symval, sym->st_size, - sizeof(struct pnp_device_id), "pnp", - do_pnp_entry, mod); + do_pnp_device_entry(symval, sym->st_size, mod); else if (sym_is(symname, "__mod_pnp_card_device_table")) do_pnp_card_entries(symval, sym->st_size, mod); else if (sym_is(symname, "__mod_pcmcia_device_table"))
Signature · 1 line
1.5.6.3
PATCH 56/79 UIO: fix UIO Kconfig dependencies
In reply to Greg KHFrom: Uwe Kleine-König <[email protected]>
ae210f188614bb3d1ee3f19c64e28e3cdd44877c introduced a big "if UIO"/"endif" where all uio drivers are defined. So know there is no need for them to depend explicitly on UIO.
--- drivers/uio/Kconfig | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-)
drivers/uio/Kconfig +1 -2
@@ -15,7 +15,7 @@ if UIO config UIO_CIF tristate "generic Hilscher CIF Card driver" - depends on UIO && PCI + depends on PCI default n help Driver for Hilscher CIF DeviceNet and Profibus cards. This
@@ -28,7 +28,6 @@ config UIO_CIF config UIO_SMX tristate "SMX cryptengine UIO interface" - depends on UIO default n help Userspace IO interface to the Cryptography engine found on the
Signature · 1 line
1.5.6.3
PATCH 57/79 UIO: Add write function to allow irq masking
In reply to Greg KHFrom: Hans J. Koch <[email protected]>
Sometimes it is necessary to enable/disable the interrupt of a UIO device from the userspace part of the driver. With this patch, the UIO kernel driver can implement an "irqcontrol()" function that does this. Userspace can write an s32 value to /dev/uioX (usually 0 or 1 to turn the irq off or on). The UIO core will then call the driver's irqcontrol function.
--- Documentation/DocBook/uio-howto.tmpl | 40 +++++++++++++++++++++++++++++++++- drivers/uio/uio.c | 26 ++++++++++++++++++++++ include/linux/uio_driver.h | 2 + 3 files changed, 67 insertions(+), 1 deletions(-)
Documentation/DocBook/uio-howto.tmpl +39 -1
@@ -30,6 +30,12 @@ <revhistory> <revision> + <revnumber>0.5</revnumber> + <date>2008-05-22</date> + <authorinitials>hjk</authorinitials> + <revremark>Added description of write() function.</revremark> + </revision> + <revision> <revnumber>0.4</revnumber> <date>2007-11-26</date> <authorinitials>hjk</authorinitials>
@@ -64,7 +70,7 @@ <?dbhtml filename="copyright.html"?> <title>Copyright and License</title> <para> - Copyright (c) 2006 by Hans-Jürgen Koch.</para> + Copyright (c) 2006-2008 by Hans-Jürgen Koch.</para> <para> This documentation is Free Software licensed under the terms of the GPL version 2.
@@ -189,6 +195,30 @@ interested in translating it, please email me represents the total interrupt count. You can use this number to figure out if you missed some interrupts. </para> + <para> + For some hardware that has more than one interrupt source internally, + but not separate IRQ mask and status registers, there might be + situations where userspace cannot determine what the interrupt source + was if the kernel handler disables them by writing to the chip's IRQ + register. In such a case, the kernel has to disable the IRQ completely + to leave the chip's register untouched. Now the userspace part can + determine the cause of the interrupt, but it cannot re-enable + interrupts. Another cornercase is chips where re-enabling interrupts + is a read-modify-write operation to a combined IRQ status/acknowledge + register. This would be racy if a new interrupt occurred + simultaneously. + </para> + <para> + To address these problems, UIO also implements a write() function. It + is normally not used and can be ignored for hardware that has only a + single interrupt source or has separate IRQ mask and status registers. + If you need it, however, a write to <filename>/dev/uioX</filename> + will call the <function>irqcontrol()</function> function implemented + by the driver. You have to write a 32-bit value that is usually either + 0 or 1 to disable or enable interrupts. If a driver does not implement + <function>irqcontrol()</function>, <function>write()</function> will + return with <varname>-ENOSYS</varname>. + </para> <para> To handle interrupts properly, your custom kernel module can
@@ -362,6 +392,14 @@ device is actually used. <function>open()</function>, you will probably also want a custom <function>release()</function> function. </para></listitem> + +<listitem><para> +<varname>int (*irqcontrol)(struct uio_info *info, s32 irq_on) +</varname>: Optional. If you need to be able to enable or disable +interrupts from userspace by writing to <filename>/dev/uioX</filename>, +you can implement this function. The parameter <varname>irq_on</varname> +will be 0 to disable interrupts and 1 to enable them. +</para></listitem> </itemizedlist> <para>
drivers/uio/uio.c +26 -0
@@ -427,6 +427,31 @@ static ssize_t uio_read(struct file *filep, char __user *buf,return retval; } +static ssize_t uio_write (struct file *filep,const char __user *buf, +size_t count,loff_t *ppos) +{ +struct uio_listener *listener = filep->private_data; +struct uio_device *idev = listener->dev; +ssize_t retval; +s32 irq_on; + +if (idev->info->irq ==UIO_IRQ_NONE ) +return -EIO ; + +if (count !=sizeof (s32)) +return -EINVAL ; + +if (!idev->info->irqcontrol) +return -ENOSYS ; + +if (copy_from_user (&irq_on, buf, count)) +return -EFAULT ; + + retval = idev->info->irqcontrol (idev->info, irq_on); + +return retval ? retval :sizeof (s32); +} +static int uio_find_mem_index (struct vm_area_struct *vma) {int mi;
@@ -546,6 +571,7 @@ static const struct file_operations uio_fops = { .open = uio_open, .release = uio_release, .read = uio_read, + .write = uio_write, .mmap = uio_mmap, .poll = uio_poll, .fasync = uio_fasync,
include/linux/uio_driver.h +2 -0
@@ -53,6 +53,7 @@ struct uio_device;* @mmap: mmap operation for this uio device * @open: open operation for this uio device * @release: release operation for this uio device +* @irqcontrol: disable/enable irqs when 0/1 is written to /dev/uioX */ struct uio_info {struct uio_device *uio_dev;
@@ -66,6 +67,7 @@ struct uio_info {int (*mmap)(struct uio_info *info,struct vm_area_struct *vma);int (*open)(struct uio_info *info,struct inode *inode);int (*release)(struct uio_info *info,struct inode *inode); +int (*irqcontrol)(struct uio_info *info,s32 irq_on); }; extern int __must_check
Signature · 1 line
1.5.6.3
PATCH 58/79 UIO: add generic UIO platform driver
In reply to Greg KHFrom: Uwe Kleine-König <[email protected]>
This patch adds a generic UIO platform driver. It eliminates the need for a dedicated kernel module for simple platform devices. Users only need to implement their irq handler in platform code and fill a struct uio_info there. This helps avoiding code duplication as UIO platform drivers often share a lot of common code.
--- drivers/uio/Kconfig | 7 +++ drivers/uio/Makefile | 1 + drivers/uio/uio_pdrv.c | 118 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 126 insertions(+), 0 deletions(-) create mode 100644 drivers/uio/uio_pdrv.c
drivers/uio/Kconfig +7 -0
@@ -26,6 +26,13 @@ config UIO_CIF To compile this driver as a module, choose M here: the module will be called uio_cif. +config UIO_PDRV + tristate "Userspace I/O platform driver" + help + Generic platform driver for Userspace I/O devices. + + If you don't know what to do here, say N. + config UIO_SMX tristate "SMX cryptengine UIO interface" default n
drivers/uio/Makefile +1 -0
@@ -1,3 +1,4 @@ obj-$(CONFIG_UIO) += uio.o obj-$(CONFIG_UIO_CIF) += uio_cif.o +obj-$(CONFIG_UIO_PDRV) += uio_pdrv.o obj-$(CONFIG_UIO_SMX) += uio_smx.o
drivers/uio/uio_pdrv.c new file +118 -0
118 lines not on this page · raw message
Signature · 1 line
1.5.6.3
Re: [PATCH 58/79] UIO: add generic UIO platform driver
Hi Greg,
I posted two minor updates to that patch some days ago.
If you don't find them in your mailbox anymore, you can find them at:
http://thread.gmane.org/gmane.linux.kernel/705243
IMHO they are obvious and already have Hans' Acked-by.
Can you please take them?
Best regards,
Uwe
Signature · 3 lines
Uwe Kleine-König, Software Engineer Digi International GmbH Branch Breisach, Küferstrasse 8, 79206 Breisach, Germany Tax: 315/5781/0242 / VAT: DE153662976 / Reg. Amtsgericht Dortmund HRB 13962
Re: [PATCH 58/79] UIO: add generic UIO platform driver
Quoted 11 lines · Uwe Kleine-König
Hi Greg,
I posted two minor updates to that patch some days ago.
If you don't find them in your mailbox anymore, you can find them at:
http://thread.gmane.org/gmane.linux.kernel/705243IMHO they are obvious and already have Hans' Acked-by.
Can you please take them?
Yes, I'm slowly catching up on stuff right now, I wanted to get the patches that had a lot of testing to Linus for -rc1, as that was most important at this moment in time. Your other patches are still in my queue for review, should get to them in a few days, but as OSCON is this week, I'm not guaranteeing anything...
thanks for your patience,
greg k-h
PATCH 59/79 UIO: minor style and comment fixes
In reply to Greg KHFrom: Uwe Kleine-König <[email protected]>
--- include/linux/uio_driver.h | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-)
include/linux/uio_driver.h +3 -3
@@ -36,7 +36,7 @@ struct uio_mem {struct uio_map *map; }; -#define MAX_UIO_MAPS 5 +#define MAX_UIO_MAPS 5struct uio_device ;
@@ -82,11 +82,11 @@ static inline int __must_checkextern void uio_unregister_device (struct uio_info *info);extern void uio_event_notify (struct uio_info *info); -/* defines for uio_device->irq */ +/* defines for uio_info->irq */ #define UIO_IRQ_CUSTOM -1#define UIO_IRQ_NONE -2 -/* defines for uio_device->memtype */ +/* defines for uio_mem->memtype */ #define UIO_MEM_NONE 0#define UIO_MEM_PHYS 1#define UIO_MEM_LOGICAL 2
Signature · 1 line
1.5.6.3
PATCH 60/79 kobject: reorder kobject to save space on 64 bit builds
In reply to Greg KHFrom: Richard Kennedy <[email protected]>
reorder kobject to save space on 64 bit builds.
shrinks from 72 to 64 bytes & moves allocated kobject to a smaller slab.
--- include/linux/kobject.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
include/linux/kobject.h +1 -1
@@ -58,12 +58,12 @@ enum kobject_action {struct kobject {const char *name; -struct kref kref;struct list_head entry;struct kobject *parent;struct kset *kset;struct kobj_type *ktype;struct sysfs_dirent *sd; +struct kref kref;unsigned int state_initialized:1 ;unsigned int state_in_sysfs:1 ;unsigned int state_add_uevent_sent:1 ;
Signature · 1 line
1.5.6.3
PATCH 61/79 kobject: should use kobject_put() in kset-example
In reply to Greg KHFrom: Li Zefan <[email protected]>
We should call kobject_put() instead of kfree() if kobject_init_and_add() returns an error, shouldn't we? Don't set up a bad example ;)
--- samples/kobject/kset-example.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
samples/kobject/kset-example.c +1 -1
@@ -211,7 +211,7 @@ static struct foo_obj *create_foo_obj(const char *name)*/ retval =kobject_init_and_add (&foo->kobj, &foo_ktype,NULL ,"%s" , name);if (retval) { -kfree (foo); +kobject_put (&foo->kobj);return NULL ; }
Signature · 1 line
1.5.6.3
PATCH 62/79 sysdev: fix debugging statements in registration code.
In reply to Greg KHFrom: Ben Dooks <[email protected]>
The systdev_class_register() and sysdev_register() functions have pr_debug() statements which are enabled when the user selects the driver core debug. Both of these routines do not produce the correct output, as they make assumptions about data which has not been initialised.
In sysdev_class_register() the code uses the kobject_name(&cls->kset.kobj) at the start of the function, but this is not setup until later in the same call. Change this to use cls->name which is passed in from the caller.
The sysdev_register() function tries to get the name of the sysdev by kobject_name(&sysdev->kobj), but that isn't setup until later in the same function so change this message to use the name of the sysdev's class and add another message once the name is initialised.
--- drivers/base/sys.c | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-)
drivers/base/sys.c +8 -3
@@ -130,8 +130,8 @@ static struct kset *system_kset;int sysdev_class_register (struct sysdev_class * cls) { -pr_debug ("Registering sysdev class '%s'\n" , -kobject_name (&cls->kset.kobj)); +pr_debug ("Registering sysdev class '%s'\n" , cls->name); +INIT_LIST_HEAD (&cls->drivers);memset (&cls->kset.kobj,0x00 ,sizeof (struct kobject )); cls->kset.kobj.parent = &system_kset->kobj;
@@ -241,7 +241,8 @@ int sysdev_register(struct sys_device * sysdev)if (!cls)return -EINVAL ; -pr_debug ("Registering sys device '%s'\n" ,kobject_name (&sysdev->kobj)); +pr_debug ("Registering sys device of class '%s'\n" , +kobject_name (&cls->kset.kobj));/* initialize the kobject to 0, in case it had previously been used */ memset (&sysdev->kobj,0x00 ,sizeof (struct kobject ));
@@ -257,6 +258,9 @@ int sysdev_register(struct sys_device * sysdev)if (!error) {struct sysdev_driver * drv; +pr_debug ("Registering sys device '%s'\n" , +kobject_name (&sysdev->kobj)); +mutex_lock (&sysdev_drivers_lock);/* Generic notification is implicit, because it's that * code that should have called us.
@@ -269,6 +273,7 @@ int sysdev_register(struct sys_device * sysdev) }mutex_unlock (&sysdev_drivers_lock); } +kobject_uevent (&sysdev->kobj,KOBJ_ADD );return error; }
Signature · 1 line
1.5.6.3
PATCH 63/79 sysfs: don't call notify_change
In reply to Greg KHFrom: Miklos Szeredi <[email protected]>
sysfs_chmod_file() calls notify_change() to change the permission bits on a sysfs file. Replace with explicit call to sysfs_setattr() and fsnotify_change().
This is equivalent, except that security_inode_setattr() is not called. This function is called by drivers, so the security checks do not make any sense.
--- fs/sysfs/file.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
fs/sysfs/file.c +4 -1
@@ -14,6 +14,7 @@#include <linux/kobject.h> #include <linux/kallsyms.h> #include <linux/slab.h> +#include <linux/fsnotify.h> #include <linux/namei.h> #include <linux/poll.h> #include <linux/list.h>
@@ -585,9 +586,11 @@ int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode) newattrs.ia_mode = (mode &S_IALLUGO ) | (inode->i_mode & ~S_IALLUGO ); newattrs.ia_valid =ATTR_MODE |ATTR_CTIME ; - rc =notify_change (victim, &newattrs); + newattrs.ia_ctime =current_fs_time (inode->i_sb); + rc =sysfs_setattr (victim, &newattrs);if (rc ==0 ) { +fsnotify_change (victim, newattrs.ia_valid);mutex_lock (&sysfs_mutex); victim_sd->s_mode = newattrs.ia_mode;mutex_unlock (&sysfs_mutex);
Signature · 1 line
1.5.6.3
PATCH 64/79 uio-howto.tmpl: use standard copyright/legal markings
In reply to Greg KHFrom: Mike Frysinger <[email protected]>
The Userspace I/O HOWTO document uses straight <sect1> tags and plain text to describe copyright/legal information. It should instead use the <copyright> and <legalnotice> tags like all other documents in the kernel.
--- Documentation/DocBook/uio-howto.tmpl | 23 ++++++++++++----------- 1 files changed, 12 insertions(+), 11 deletions(-)
Documentation/DocBook/uio-howto.tmpl +12 -11
@@ -21,6 +21,18 @@ </affiliation> </author> +<copyright> + <year>2006-2008</year> + <holder>Hans-Jürgen Koch.</holder> +</copyright> + +<legalnotice> +<para> +This documentation is Free Software licensed under the terms of the +GPL version 2. +</para> +</legalnotice> + <pubdate>2006-12-11</pubdate> <abstract>
@@ -66,17 +78,6 @@ <?dbhtml filename="about.html"?> <title>About this document</title> -<sect1 id="copyright"> -<?dbhtml filename="copyright.html"?> -<title>Copyright and License</title> -<para> - Copyright (c) 2006-2008 by Hans-Jürgen Koch.</para> -<para> -This documentation is Free Software licensed under the terms of the -GPL version 2. -</para> -</sect1> - <sect1 id="translations"> <?dbhtml filename="translations.html"?> <title>Translations</title>
Signature · 1 line
1.5.6.3
PATCH 65/79 uio-howto.tmpl: use unique output names
In reply to Greg KHFrom: Mike Frysinger <[email protected]>
The Userspace I/O HOWTO template sets two different sections with the same html output name (about.html). This clearly won't work, so change the first one to a unique "aboutthis.html" to prevent clobbering.
--- Documentation/DocBook/uio-howto.tmpl | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
Documentation/DocBook/uio-howto.tmpl +1 -1
@@ -75,7 +75,7 @@ GPL version 2. </bookinfo> <chapter id="aboutthisdoc"> -<?dbhtml filename="about.html"?> +<?dbhtml filename="aboutthis.html"?> <title>About this document</title> <sect1 id="translations">
Signature · 1 line
1.5.6.3
PATCH 66/79 always enable FW_LOADER unless EMBEDDED=y
In reply to Greg KHFrom: Adrian Bunk <[email protected]>
James Bottomley recently discovered that we have {request,release}_firmware() dummies for the case of the actual functions not being available and has a fix for the bug that was actually causing build errors for built-in users with CONFIG_FW_LOADER=m.
But now missing selects on FW_LOADER are no longer visible at compile-time at all and can become runtime problems.
FW_LOADER is infrastructure with relatively small codesize we can safely enable for everyone, and only for people who really need small kernels (and can be expected to know what they are doing) it matters being able to disable it.
This patch therefore always sets FW_LOADER=y and allows users only to disable it with EMBEDDED=y.
As a bonus, we can then get rid of all "select FW_LOADER" plus the due to it required "depends on HOTPLUG" which removes some complexity from our Kconfig files.
--- drivers/base/Kconfig | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
drivers/base/Kconfig +2 -1
@@ -27,8 +27,9 @@ config PREVENT_FIRMWARE_BUILD If unsure say Y here. config FW_LOADER - tristate "Userspace firmware loading support" + tristate "Userspace firmware loading support" if EMBEDDED depends on HOTPLUG + default y ---help--- This option is provided for the case where no in-kernel-tree modules require userspace firmware loading support, but a module built outside
Signature · 1 line
1.5.6.3
PATCH 67/79 HOWTO: change email addresses of James in HOWTO
In reply to Greg KHFrom: Tsugikazu Shibata <[email protected]>
--- Documentation/HOWTO | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
Documentation/HOWTO +1 -1
@@ -358,7 +358,7 @@ Here is a list of some of the different kernel trees available: - pcmcia, Dominik Brodowski <[email protected]> git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git - - SCSI, James Bottomley <[email protected]> + - SCSI, James Bottomley <[email protected]> git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git - x86, Ingo Molnar <[email protected]>
Signature · 1 line
1.5.6.3
PATCH 68/79 debugfs: Implement debugfs_remove_recursive()
In reply to Greg KHFrom: Haavard Skinnemoen <[email protected]>
debugfs_remove_recursive() will remove a dentry and all its children. Drivers can use this to zap their whole debugfs tree so that they don't need to keep track of every single debugfs dentry they created.
It may fail to remove the whole tree in certain cases:
sh-3.2# rmmod atmel-mci < /sys/kernel/debug/mmc0/ios/clock
mmc0: card b368 removedatmel_mci atmel_mci.0: Lost dma0chan1, falling back to PIO sh-3.2# ls /sys/kernel/debug/mmc0/
ios
But I'm not sure if that case can be handled in any sane manner.
--- fs/debugfs/inode.c | 114 +++++++++++++++++++++++++++++++++++++++------- include/linux/debugfs.h | 4 ++ 2 files changed, 100 insertions(+), 18 deletions(-)
fs/debugfs/inode.c +96 -18
@@ -309,6 +309,31 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent, }EXPORT_SYMBOL_GPL (debugfs_create_symlink); +static void __debugfs_remove (struct dentry *dentry,struct dentry *parent) +{ +int ret =0 ; + +if (debugfs_positive (dentry)) { +if (dentry->d_inode) { +dget (dentry); +switch (dentry->d_inode->i_mode &S_IFMT ) { +case S_IFDIR : + ret =simple_rmdir (parent->d_inode, dentry); +break ; +case S_IFLNK : +kfree (dentry->d_inode->i_private); +/* fall through */ +default : +simple_unlink (parent->d_inode, dentry); +break ; + } +if (!ret) +d_delete (dentry); +dput (dentry); + } + } +} +/** * debugfs_remove - removes a file or directory from the debugfs filesystem * @dentry: a pointer to a the dentry of the file or directory to be
@@ -325,7 +350,6 @@ EXPORT_SYMBOL_GPL(debugfs_create_symlink);void debugfs_remove (struct dentry *dentry) {struct dentry *parent; -int ret =0 ;if (!dentry)return ;
@@ -335,29 +359,83 @@ void debugfs_remove(struct dentry *dentry)return ;mutex_lock (&parent->d_inode->i_mutex); -if (debugfs_positive (dentry)) { -if (dentry->d_inode) { -dget (dentry); -switch (dentry->d_inode->i_mode &S_IFMT ) { -case S_IFDIR : - ret =simple_rmdir (parent->d_inode, dentry); -break ; -case S_IFLNK : -kfree (dentry->d_inode->i_private); -/* fall through */ -default : -simple_unlink (parent->d_inode, dentry); +__debugfs_remove (dentry, parent); +mutex_unlock (&parent->d_inode->i_mutex); +simple_release_fs (&debugfs_mount, &debugfs_mount_count); +} +EXPORT_SYMBOL_GPL (debugfs_remove); + +/** +* debugfs_remove_recursive - recursively removes a directory +* @dentry: a pointer to a the dentry of the directory to be removed. +* +* This function recursively removes a directory tree in debugfs that +* was previously created with a call to another debugfs function +* (like debugfs_create_file() or variants thereof.) +* +* This function is required to be called in order for the file to be +* removed, no automatic cleanup of files will happen when a module is +* removed, you are responsible here. +*/ +void debugfs_remove_recursive (struct dentry *dentry) +{ +struct dentry *child; +struct dentry *parent; + +if (!dentry) +return ; + + parent = dentry->d_parent; +if (!parent || !parent->d_inode) +return ; + + parent = dentry; +mutex_lock (&parent->d_inode->i_mutex); + +while (1 ) { +/* +* When all dentries under "parent" has been removed, +* walk up the tree until we reach our starting point. +*/ +if (list_empty (&parent->d_subdirs)) { +mutex_unlock (&parent->d_inode->i_mutex); +if (parent == dentry)break ; - } -if (!ret) -d_delete (dentry); -dput (dentry); + parent = parent->d_parent; +mutex_lock (&parent->d_inode->i_mutex); + } + child = list_entry(parent->d_subdirs.next, struct dentry, + d_u.d_child); + +/* +* If "child" isn't empty, walk down the tree and +* remove all its descendants first. +*/ +if (!list_empty (&child->d_subdirs)) { +mutex_unlock (&parent->d_inode->i_mutex); + parent = child; +mutex_lock (&parent->d_inode->i_mutex); +continue ; } +__debugfs_remove (child, parent); +if (parent->d_subdirs.next == &child->d_u.d_child) { +/* +* Avoid infinite loop if we fail to remove +* one dentry. +*/ +mutex_unlock (&parent->d_inode->i_mutex); +break ; + } +simple_release_fs (&debugfs_mount, &debugfs_mount_count); } + + parent = dentry->d_parent; +mutex_lock (&parent->d_inode->i_mutex); +__debugfs_remove (dentry, parent);mutex_unlock (&parent->d_inode->i_mutex);simple_release_fs (&debugfs_mount, &debugfs_mount_count); } -EXPORT_SYMBOL_GPL (debugfs_remove); +EXPORT_SYMBOL_GPL (debugfs_remove_recursive);/** * debugfs_rename - rename a file/directory in the debugfs filesystem
include/linux/debugfs.h +4 -0
@@ -44,6 +44,7 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent, const char *dest);void debugfs_remove (struct dentry *dentry); +void debugfs_remove_recursive (struct dentry *dentry);struct dentry *debugfs_rename (struct dentry *old_dir,struct dentry *old_dentry,struct dentry *new_dir,const char *new_name);
@@ -101,6 +102,9 @@ static inline struct dentry *debugfs_create_symlink(const char *name,static inline void debugfs_remove (struct dentry *dentry) { } +static inline void debugfs_remove_recursive (struct dentry *dentry) +{ } +static inline struct dentry *debugfs_rename (struct dentry *old_dir,struct dentry *old_dentry,struct dentry *new_dir,char *new_name) {
Signature · 1 line
1.5.6.3
PATCH 69/79 sysfs-rules.txt: reword API stability statement
In reply to Greg KHFrom: Nathan Lynch <[email protected]>
The first paragraph of this document implies that user space developers shouldn't use sysfs at all, but then it goes on to describe rules that developers should follow when accessing sysfs. Not only is this somewhat self-contradictory, it has been shown to discourage developers from using established sysfs interfaces.
A note of caution is more appropriate than a blanket "sysfs will never be stable" assertion.
--- Documentation/sysfs-rules.txt | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-)
Documentation/sysfs-rules.txt +2 -3
@@ -3,9 +3,8 @@ Rules on how to access information in the Linux kernel sysfs The kernel-exported sysfs exports internal kernel implementation details and depends on internal kernel structures and layout. It is agreed upon by the kernel developers that the Linux kernel does not provide a stable -internal API. As sysfs is a direct export of kernel internal -structures, the sysfs interface cannot provide a stable interface either; -it may always change along with internal kernel changes. +internal API. Therefore, there are aspects of the sysfs interface that +may not be stable across kernel releases. To minimize the risk of breaking users of sysfs, which are in most cases low-level userspace applications, with a new kernel release, the users
Signature · 1 line
1.5.6.3
PATCH 70/79 kobject: Transmit return value of call_usermodehelper() to caller
In reply to Greg KHFrom: Wang Chen <[email protected]>
kobject_uevent_env() drops the return value of call_usermodehelper(). It will make upper caller, such as dm_send_uevents(), to lose error information.
BTW, Previously kobject_uevent_env() transmitted return of call_usermodehelper() to callers, but
commit 5f123fbd80f4f788554636f02bf73e40f914e0d6
"[PATCH] merge kobject_uevent and kobject_hotplug" removed it.
--- lib/kobject_uevent.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
lib/kobject_uevent.c +2 -1
@@ -245,7 +245,8 @@ int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,if (retval) goto exit; -call_usermodehelper (argv[0 ], argv, env->envp,UMH_WAIT_EXEC ); + retval =call_usermodehelper (argv[0 ], argv, + env->envp,UMH_WAIT_EXEC ); } exit:
Signature · 1 line
1.5.6.3
PATCH 71/79 driver core: Suppress sysfs warnings for device_rename().
In reply to Greg KHFrom: Cornelia Huck <[email protected]>
driver core: Suppress sysfs warnings for device_rename().
Renaming network devices to an already existing name is not something we want sysfs to print a scary warning for, since the callers can deal with this correctly. So let's introduce sysfs_create_link_nowarn() which gets rid of the common warning.
--- drivers/base/core.c | 9 +++++---- fs/sysfs/dir.c | 37 +++++++++++++++++++++++++++++++++++-- fs/sysfs/symlink.c | 41 +++++++++++++++++++++++++++++++++-------- fs/sysfs/sysfs.h | 1 + include/linux/sysfs.h | 10 ++++++++++ 5 files changed, 84 insertions(+), 14 deletions(-)
drivers/base/core.c +5 -4
@@ -1345,8 +1345,9 @@ int device_rename(struct device *dev, char *new_name)if (old_class_name) { new_class_name =make_class_name (dev->class->name, &dev->kobj);if (new_class_name) { - error =sysfs_create_link (&dev->parent->kobj, - &dev->kobj, new_class_name); + error =sysfs_create_link_nowarn (&dev->parent->kobj, + &dev->kobj, + new_class_name);if (error) goto out;sysfs_remove_link (&dev->parent->kobj, old_class_name);
@@ -1354,8 +1355,8 @@ int device_rename(struct device *dev, char *new_name) }#else if (dev->class) { - error =sysfs_create_link (&dev->class->p->class_subsys.kobj, - &dev->kobj, dev->bus_id); + error =sysfs_create_link_nowarn (&dev->class->p->class_subsys.kobj, + &dev->kobj, dev->bus_id);if (error) goto out; sysfs_remove_link(&dev->class->p->class_subsys.kobj,
fs/sysfs/dir.c +35 -2
@@ -398,7 +398,7 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, }/** -* sysfs_add_one - add sysfs_dirent to parent +* __sysfs_add_one - add sysfs_dirent to parent without warning * @acxt: addrm context to use * @sd: sysfs_dirent to be added *
@@ -417,7 +417,7 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,* 0 on success, -EEXIST if entry with the given name already * exists. */ -int sysfs_add_one (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *sd) +int __sysfs_add_one (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *sd) {if (sysfs_find_dirent (acxt->parent_sd, sd->s_name))return -EEXIST ;
@@ -435,6 +435,39 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) }/** +* sysfs_add_one - add sysfs_dirent to parent +* @acxt: addrm context to use +* @sd: sysfs_dirent to be added +* +* Get @acxt->parent_sd and set sd->s_parent to it and increment +* nlink of parent inode if @sd is a directory and link into the +* children list of the parent. +* +* This function should be called between calls to +* sysfs_addrm_start() and sysfs_addrm_finish() and should be +* passed the same @acxt as passed to sysfs_addrm_start(). +* +* LOCKING: +* Determined by sysfs_addrm_start(). +* +* RETURNS: +* 0 on success, -EEXIST if entry with the given name already +* exists. +*/ +int sysfs_add_one (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *sd) +{ +int ret; + + ret =__sysfs_add_one (acxt, sd); +if (ret == -EEXIST ) { +printk (KERN_WARNING "sysfs: duplicate filename '%s' " +"can not be created\n" , sd->s_name); +WARN_ON (1 ); + } +return ret; +} + +/** * sysfs_remove_one - remove sysfs_dirent from parent * @acxt: addrm context to use * @sd: sysfs_dirent to be removed
fs/sysfs/symlink.c +33 -8
59 lines not on this page · raw message
fs/sysfs/sysfs.h +1 -0
@@ -107,6 +107,7 @@ struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd);void sysfs_put_active_two (struct sysfs_dirent *sd);void sysfs_addrm_start (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *parent_sd); +int __sysfs_add_one (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *sd);int sysfs_add_one (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *sd);void sysfs_remove_one (struct sysfs_addrm_cxt *acxt,struct sysfs_dirent *sd);void sysfs_addrm_finish (struct sysfs_addrm_cxt *acxt);
include/linux/sysfs.h +10 -0
@@ -101,6 +101,9 @@ void sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr);int __must_check sysfs_create_link (struct kobject *kobj,struct kobject *target,const char *name); +int __must_check sysfs_create_link_nowarn (struct kobject *kobj, +struct kobject *target, +const char *name);void sysfs_remove_link (struct kobject *kobj,const char *name); int __must_check sysfs_create_group(struct kobject *kobj,
@@ -180,6 +183,13 @@ static inline int sysfs_create_link(struct kobject *kobj,return 0 ; } +static inline int sysfs_create_link_nowarn (struct kobject *kobj, +struct kobject *target, +const char *name) +{ +return 0 ; +} +static inline void sysfs_remove_link (struct kobject *kobj,const char *name) { }
Signature · 1 line
1.5.6.3
PATCH 72/79 sysdev: Pass the attribute to the low level sysdev show/store function
In reply to Greg KHFrom: Andi Kleen <[email protected]>
This allow to dynamically generate attributes and share show/store functions between attributes. Right now most attributes are generated by special macros and lots of duplicated code. With the attribute passed it's instead possible to attach some data to the attribute and then use that in shared low level functions to do different things.
I need this for the dynamically generated bank attributes in the x86 machine check code, but it'll allow some further cleanups.
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32
--- arch/arm/kernel/time.c | 4 ++- arch/avr32/kernel/cpu.c | 38 ++++++++++++++++-------- arch/ia64/kernel/err_inject.c | 22 +++++++++---- arch/powerpc/kernel/sysfs.c | 15 +++++++-- arch/powerpc/platforms/cell/cbe_thermal.c | 45 +++++++++++++++++++--------- arch/powerpc/platforms/cell/spu_base.c | 3 +- arch/s390/kernel/smp.c | 36 +++++++++++++++-------- arch/s390/kernel/time.c | 35 +++++++++++++++------- arch/sh/drivers/dma/dma-sysfs.c | 15 +++++++-- arch/sparc64/kernel/sysfs.c | 16 +++++++--- arch/x86/kernel/cpu/mcheck/mce_64.c | 14 ++++++-- arch/x86/kernel/cpu/mcheck/therm_throt.c | 1 + arch/x86/kernel/microcode.c | 10 ++++-- drivers/base/cpu.c | 10 ++++-- drivers/base/memory.c | 12 +++++-- drivers/base/node.c | 15 ++++++--- drivers/base/sys.c | 4 +- drivers/base/topology.c | 17 ++++++++--- drivers/cpuidle/sysfs.c | 10 ++++-- drivers/xen/balloon.c | 1 + include/linux/sysdev.h | 5 ++- kernel/rtmutex-tester.c | 7 ++-- kernel/sched.c | 8 ++++- kernel/time/clocksource.c | 8 ++++- 24 files changed, 239 insertions(+), 112 deletions(-)
arch/arm/kernel/time.c +3 -1
@@ -130,7 +130,9 @@ static const struct leds_evt_name evt_names[] = { { "red", led_red_on, led_red_off }, }; -static ssize_t leds_store (struct sys_device *dev,const char *buf,size_t size) +static ssize_t leds_store (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t size) {int ret = -EINVAL , len =strcspn (buf," " );
arch/avr32/kernel/cpu.c +25 -13
@@ -26,14 +26,16 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);* XXX: If/when a SMP-capable implementation of AVR32 will ever be * made, we must make sure that the code executes on the correct CPU. */ -static ssize_t show_pc0event (struct sys_device *dev,char *buf) +static ssize_t show_pc0event (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned long pccr; pccr =sysreg_read (PCCR );return sprintf (buf,"0x%lx\n" , (pccr >>12 ) &0x3f ); } -static ssize_t store_pc0event (struct sys_device *dev,const char *buf, +static ssize_t store_pc0event (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {unsigned long val;
@@ -46,15 +48,17 @@ static ssize_t store_pc0event(struct sys_device *dev, const char *buf,sysreg_write (PCCR , val);return count; } -static ssize_t show_pc0count (struct sys_device *dev,char *buf) +static ssize_t show_pc0count (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned long pcnt0; pcnt0 =sysreg_read (PCNT0 );return sprintf (buf,"%lu\n" , pcnt0); } -static ssize_t store_pc0count (struct sys_device *dev,const char *buf, -size_t count) +static ssize_t store_pc0count (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t count) {unsigned long val;char *endp;
@@ -67,14 +71,16 @@ static ssize_t store_pc0count(struct sys_device *dev, const char *buf,return count; } -static ssize_t show_pc1event (struct sys_device *dev,char *buf) +static ssize_t show_pc1event (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned long pccr; pccr =sysreg_read (PCCR );return sprintf (buf,"0x%lx\n" , (pccr >>18 ) &0x3f ); } -static ssize_t store_pc1event (struct sys_device *dev,const char *buf, +static ssize_t store_pc1event (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {unsigned long val;
@@ -87,14 +93,16 @@ static ssize_t store_pc1event(struct sys_device *dev, const char *buf,sysreg_write (PCCR , val);return count; } -static ssize_t show_pc1count (struct sys_device *dev,char *buf) +static ssize_t show_pc1count (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned long pcnt1; pcnt1 =sysreg_read (PCNT1 );return sprintf (buf,"%lu\n" , pcnt1); } -static ssize_t store_pc1count (struct sys_device *dev,const char *buf, +static ssize_t store_pc1count (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {unsigned long val;
@@ -108,14 +116,16 @@ static ssize_t store_pc1count(struct sys_device *dev, const char *buf,return count; } -static ssize_t show_pccycles (struct sys_device *dev,char *buf) +static ssize_t show_pccycles (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned long pccnt; pccnt =sysreg_read (PCCNT );return sprintf (buf,"%lu\n" , pccnt); } -static ssize_t store_pccycles (struct sys_device *dev,const char *buf, +static ssize_t store_pccycles (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {unsigned long val;
@@ -129,14 +139,16 @@ static ssize_t store_pccycles(struct sys_device *dev, const char *buf,return count; } -static ssize_t show_pcenable (struct sys_device *dev,char *buf) +static ssize_t show_pcenable (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned long pccr; pccr =sysreg_read (PCCR );return sprintf (buf,"%c\n" , (pccr &1 )?'1' :'0' ); } -static ssize_t store_pcenable (struct sys_device *dev,const char *buf, +static ssize_t store_pcenable (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {unsigned long pccr, val;
arch/ia64/kernel/err_inject.c +15 -7
@@ -55,7 +55,8 @@ static u64 resources[NR_CPUS];#define show (name) \ static ssize_t \ -show_##name(struct sys_device *dev, char *buf) \ +show_##name(struct sys_device *dev, struct sysdev_attribute *attr, \ + char *buf) \ { \ u32 cpu=dev->id; \ return sprintf(buf, "%lx\n", name[cpu]); \
@@ -63,7 +64,8 @@ show_##name(struct sys_device *dev, char *buf) \#define store (name) \ static ssize_t \ -store_##name(struct sys_device *dev, const char *buf, size_t size) \ +store_##name(struct sys_device *dev, struct sysdev_attribute *attr, \ + const char *buf, size_t size) \ { \ unsigned int cpu=dev->id; \ name[cpu] = simple_strtoull(buf, NULL, 16); \
@@ -76,7 +78,8 @@ show(call_start)* processor. The cpu number in driver is only used for storing data. */ static ssize_t -store_call_start (struct sys_device *dev,const char *buf,size_t size) +store_call_start (struct sys_device *dev,struct sysdev_attribute *attr, +const char *buf,size_t size) {unsigned int cpu=dev->id;unsigned long call_start =simple_strtoull (buf,NULL ,16 );
@@ -124,14 +127,16 @@ show(err_type_info)store (err_type_info) static ssize_t -show_virtual_to_phys (struct sys_device *dev,char *buf) +show_virtual_to_phys (struct sys_device *dev,struct sysdev_attribute *attr, +char *buf) {unsigned int cpu=dev->id;return sprintf (buf,"%lx\n" , phys_addr[cpu]); }static ssize_t -store_virtual_to_phys (struct sys_device *dev,const char *buf,size_t size) +store_virtual_to_phys (struct sys_device *dev,struct sysdev_attribute *attr, +const char *buf,size_t size) {unsigned int cpu=dev->id;u64 virt_addr=simple_strtoull (buf,NULL ,16 );
@@ -154,7 +159,8 @@ show(err_struct_info)store (err_struct_info) static ssize_t -show_err_data_buffer (struct sys_device *dev,char *buf) +show_err_data_buffer (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned int cpu=dev->id;
@@ -165,7 +171,9 @@ show_err_data_buffer(struct sys_device *dev, char *buf) }static ssize_t -store_err_data_buffer (struct sys_device *dev,const char *buf,size_t size) +store_err_data_buffer (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t size) {unsigned int cpu=dev->id;int ret;
arch/powerpc/kernel/sysfs.c +11 -4
@@ -28,7 +28,9 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);/* Time in microseconds we delay before sleeping in the idle loop */ DEFINE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 }; -static ssize_t store_smt_snooze_delay (struct sys_device *dev,const char *buf, +static ssize_t store_smt_snooze_delay (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t count) { struct cpu *cpu = container_of(dev, struct cpu, sysdev);
@@ -44,7 +46,9 @@ static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf,return count; } -static ssize_t show_smt_snooze_delay (struct sys_device *dev,char *buf) +static ssize_t show_smt_snooze_delay (struct sys_device *dev, +struct sysdev_attribute *attr, +char *buf) { struct cpu *cpu = container_of(dev, struct cpu, sysdev);
@@ -152,14 +156,17 @@ static unsigned long write_##NAME(unsigned long val) \mtspr (ADDRESS , val); \return 0 ; \ } \ -static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ +static ssize_t show_##NAME(struct sys_device *dev, \ + struct sysdev_attribute *attr, \ + char *buf) \ { \ struct cpu *cpu = container_of(dev, struct cpu, sysdev); \ unsigned long val = run_on_cpu(cpu->sysdev.id, read_##NAME, 0); \ return sprintf(buf, "%lx\n", val); \ } \ static ssize_t __used \ - store_##NAME(struct sys_device *dev, const char *buf, size_t count) \ + store_##NAME(struct sys_device *dev, struct sysdev_attribute *attr, \ + const char *buf, size_t count) \ { \ struct cpu *cpu = container_of(dev, struct cpu, sysdev); \ unsigned long val; \
arch/powerpc/platforms/cell/cbe_thermal.c +30 -15
112 lines not on this page · raw message
arch/powerpc/platforms/cell/spu_base.c +2 -1
@@ -703,7 +703,8 @@ static unsigned long long spu_acct_time(struct spu *spu, } -static ssize_t spu_stat_show (struct sys_device *sysdev,char *buf) +static ssize_t spu_stat_show (struct sys_device *sysdev, +struct sysdev_attribute *attr,char *buf) { struct spu *spu = container_of(sysdev, struct spu, sysdev);
arch/s390/kernel/smp.c +24 -12
@@ -864,7 +864,8 @@ int setup_profiling_timer(unsigned int multiplier) }#ifdef CONFIG_HOTPLUG_CPU -static ssize_t cpu_configure_show (struct sys_device *dev,char *buf) +static ssize_t cpu_configure_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {ssize_t count;
@@ -874,8 +875,9 @@ static ssize_t cpu_configure_show(struct sys_device *dev, char *buf)return count; } -static ssize_t cpu_configure_store (struct sys_device *dev,const char *buf, -size_t count) +static ssize_t cpu_configure_store (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t count) {int cpu = dev->id;int val, rc;
@@ -922,7 +924,8 @@ out: static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store);#endif /* CONFIG_HOTPLUG_CPU */ -static ssize_t cpu_polarization_show (struct sys_device *dev,char *buf) +static ssize_t cpu_polarization_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {int cpu = dev->id;ssize_t count;
@@ -950,7 +953,8 @@ static ssize_t cpu_polarization_show(struct sys_device *dev, char *buf) } static SYSDEV_ATTR(polarization, 0444, cpu_polarization_show, NULL); -static ssize_t show_cpu_address (struct sys_device *dev,char *buf) +static ssize_t show_cpu_address (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {return sprintf (buf,"%d\n" , __cpu_logical_map[dev->id]); }
@@ -970,7 +974,8 @@ static struct attribute_group cpu_common_attr_group = { .attrs = cpu_common_attrs, }; -static ssize_t show_capability (struct sys_device *dev,char *buf) +static ssize_t show_capability (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {unsigned int capability;int rc;
@@ -982,7 +987,8 @@ static ssize_t show_capability(struct sys_device *dev, char *buf) } static SYSDEV_ATTR(capability, 0444, show_capability, NULL); -static ssize_t show_idle_count (struct sys_device *dev,char *buf) +static ssize_t show_idle_count (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct s390_idle_data *idle;unsigned long long idle_count;
@@ -995,7 +1001,8 @@ static ssize_t show_idle_count(struct sys_device *dev, char *buf) } static SYSDEV_ATTR(idle_count, 0444, show_idle_count, NULL); -static ssize_t show_idle_time (struct sys_device *dev,char *buf) +static ssize_t show_idle_time (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct s390_idle_data *idle;unsigned long long new_time;
@@ -1112,7 +1119,9 @@ out:return rc; } -static ssize_t __ref rescan_store (struct sys_device *dev,const char *buf, +static ssize_t __ref rescan_store (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t count) {int rc;
@@ -1123,7 +1132,9 @@ static ssize_t __ref rescan_store(struct sys_device *dev, const char *buf, static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store);#endif /* CONFIG_HOTPLUG_CPU */ -static ssize_t dispatching_show (struct sys_device *dev,char *buf) +static ssize_t dispatching_show (struct sys_device *dev, +struct sysdev_attribute *attr, +char *buf) {ssize_t count;
@@ -1133,8 +1144,9 @@ static ssize_t dispatching_show(struct sys_device *dev, char *buf)return count; } -static ssize_t dispatching_store (struct sys_device *dev,const char *buf, -size_t count) +static ssize_t dispatching_store (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t count) {int val, rc;char delim;
arch/s390/kernel/time.c +24 -11
@@ -1100,7 +1100,9 @@ static inline struct etr_aib *etr_aib_from_dev(struct sys_device *dev)return etr_port1_online ? &etr_port1 :NULL ; } -static ssize_t etr_online_show (struct sys_device *dev,char *buf) +static ssize_t etr_online_show (struct sys_device *dev, +struct sysdev_attribute *attr, +char *buf) {unsigned int online;
@@ -1109,7 +1111,8 @@ static ssize_t etr_online_show(struct sys_device *dev, char *buf) }static ssize_t etr_online_store (struct sys_device *dev, -const char *buf,size_t count) +struct sysdev_attribute *attr, +const char *buf,size_t count) {unsigned int value;
@@ -1136,7 +1139,9 @@ static ssize_t etr_online_store(struct sys_device *dev, static SYSDEV_ATTR(online, 0600, etr_online_show, etr_online_store); -static ssize_t etr_stepping_control_show (struct sys_device *dev,char *buf) +static ssize_t etr_stepping_control_show (struct sys_device *dev, +struct sysdev_attribute *attr, +char *buf) {return sprintf (buf,"%i\n" , (dev == &etr_port0_dev) ? etr_eacr.e0 : etr_eacr.e1);
@@ -1144,7 +1149,8 @@ static ssize_t etr_stepping_control_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(stepping_control, 0400, etr_stepping_control_show, NULL); -static ssize_t etr_mode_code_show (struct sys_device *dev,char *buf) +static ssize_t etr_mode_code_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {if (!etr_port0_online && !etr_port1_online)/* Status word is not uptodate if both ports are offline. */
@@ -1155,7 +1161,8 @@ static ssize_t etr_mode_code_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(state_code, 0400, etr_mode_code_show, NULL); -static ssize_t etr_untuned_show (struct sys_device *dev,char *buf) +static ssize_t etr_untuned_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
@@ -1166,7 +1173,8 @@ static ssize_t etr_untuned_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(untuned, 0400, etr_untuned_show, NULL); -static ssize_t etr_network_id_show (struct sys_device *dev,char *buf) +static ssize_t etr_network_id_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
@@ -1177,7 +1185,8 @@ static ssize_t etr_network_id_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(network, 0400, etr_network_id_show, NULL); -static ssize_t etr_id_show (struct sys_device *dev,char *buf) +static ssize_t etr_id_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
@@ -1188,7 +1197,8 @@ static ssize_t etr_id_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(id, 0400, etr_id_show, NULL); -static ssize_t etr_port_number_show (struct sys_device *dev,char *buf) +static ssize_t etr_port_number_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
@@ -1199,7 +1209,8 @@ static ssize_t etr_port_number_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(port, 0400, etr_port_number_show, NULL); -static ssize_t etr_coupled_show (struct sys_device *dev,char *buf) +static ssize_t etr_coupled_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
@@ -1210,7 +1221,8 @@ static ssize_t etr_coupled_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(coupled, 0400, etr_coupled_show, NULL); -static ssize_t etr_local_time_show (struct sys_device *dev,char *buf) +static ssize_t etr_local_time_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
@@ -1221,7 +1233,8 @@ static ssize_t etr_local_time_show(struct sys_device *dev, char *buf) static SYSDEV_ATTR(local_time, 0400, etr_local_time_show, NULL); -static ssize_t etr_utc_offset_show (struct sys_device *dev,char *buf) +static ssize_t etr_utc_offset_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct etr_aib *aib =etr_aib_from_dev (dev);
arch/sh/drivers/dma/dma-sysfs.c +11 -4
@@ -23,7 +23,8 @@ static struct sysdev_class dma_sysclass = { };EXPORT_SYMBOL (dma_sysclass); -static ssize_t dma_show_devices (struct sys_device *dev,char *buf) +static ssize_t dma_show_devices (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {ssize_t len =0 ;int i;
@@ -57,13 +58,15 @@ static int __init dma_sysclass_init(void) }postcore_initcall (dma_sysclass_init); -static ssize_t dma_show_dev_id (struct sys_device *dev,char *buf) +static ssize_t dma_show_dev_id (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct dma_channel *channel =to_dma_channel (dev);return sprintf (buf,"%s\n" , channel->dev_id); }static ssize_t dma_store_dev_id (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {struct dma_channel *channel =to_dma_channel (dev);
@@ -74,6 +77,7 @@ static ssize_t dma_store_dev_id(struct sys_device *dev, static SYSDEV_ATTR(dev_id, S_IRUGO | S_IWUSR, dma_show_dev_id, dma_store_dev_id);static ssize_t dma_store_config (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {struct dma_channel *channel =to_dma_channel (dev);
@@ -87,13 +91,15 @@ static ssize_t dma_store_config(struct sys_device *dev, static SYSDEV_ATTR(config, S_IWUSR, NULL, dma_store_config); -static ssize_t dma_show_mode (struct sys_device *dev,char *buf) +static ssize_t dma_show_mode (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct dma_channel *channel =to_dma_channel (dev);return sprintf (buf,"0x%08x\n" , channel->mode); }static ssize_t dma_store_mode (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {struct dma_channel *channel =to_dma_channel (dev);
@@ -104,7 +110,8 @@ static ssize_t dma_store_mode(struct sys_device *dev, static SYSDEV_ATTR(mode, S_IRUGO | S_IWUSR, dma_show_mode, dma_store_mode);#define dma_ro_attr (field, fmt) \ -static ssize_t dma_show_##field(struct sys_device *dev, char *buf) \ +static ssize_t dma_show_##field(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf)\ { \ struct dma_channel *channel = to_dma_channel(dev); \ return sprintf(buf, fmt, channel->field); \
arch/sparc64/kernel/sysfs.c +11 -5
@@ -14,7 +14,8 @@ static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64)));#define SHOW_MMUSTAT_ULONG (NAME ) \ -static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ +static ssize_t show_##NAME(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf) \ { \ struct hv_mmu_statistics *p = &per_cpu(mmu_stats, dev->id); \ return sprintf(buf, "%lu\n", p->NAME); \
@@ -135,13 +136,16 @@ static unsigned long write_mmustat_enable(unsigned long val)return sun4v_mmustat_conf (ra, &orig_ra); } -static ssize_t show_mmustat_enable (struct sys_device *s,char *buf) +static ssize_t show_mmustat_enable (struct sys_device *s, +struct sysdev_attribute *attr,char *buf) {unsigned long val =run_on_cpu (s->id, read_mmustat_enable,0 );return sprintf (buf,"%lx\n" , val); } -static ssize_t store_mmustat_enable (struct sys_device *s,const char *buf,size_t count) +static ssize_t store_mmustat_enable (struct sys_device *s, +struct sysdev_attribute *attr,const char *buf, +size_t count) {unsigned long val, err;int ret =sscanf (buf,"%ld" , &val);
@@ -179,14 +183,16 @@ static void unregister_mmu_stats(struct sys_device *s)#endif #define SHOW_CPUDATA_ULONG_NAME (NAME ,MEMBER ) \ -static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ +static ssize_t show_##NAME(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf) \ { \ cpuinfo_sparc *c = &cpu_data(dev->id); \ return sprintf(buf, "%lu\n", c->MEMBER); \ }#define SHOW_CPUDATA_UINT_NAME (NAME ,MEMBER ) \ -static ssize_t show_##NAME(struct sys_device *dev, char *buf) \ +static ssize_t show_##NAME(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf) \ { \ cpuinfo_sparc *c = &cpu_data(dev->id); \ return sprintf(buf, "%u\n", c->MEMBER); \
arch/x86/kernel/cpu/mcheck/mce_64.c +10 -4
@@ -762,10 +762,14 @@ DEFINE_PER_CPU(struct sys_device, device_mce);/* Why are there no generic functions for this? */ #define ACCESSOR (name, var, start) \ - static ssize_t show_ ## name(struct sys_device *s, char *buf) { \ + static ssize_t show_ ## name(struct sys_device *s, \ + struct sysdev_attribute *attr, \ + char *buf) { \ return sprintf(buf, "%lx\n", (unsigned long)var); \ } \ - static ssize_t set_ ## name(struct sys_device *s,const char *buf,size_t siz) { \ + static ssize_t set_ ## name(struct sys_device *s, \ + struct sysdev_attribute *attr, \ + const char *buf, size_t siz) { \ char *end; \ unsigned long new = simple_strtoul(buf, &end, 0); \ if (end == buf) return -EINVAL; \
@@ -786,14 +790,16 @@ ACCESSOR(bank3ctl,bank[3],mce_restart()) ACCESSOR(bank4ctl,bank[4],mce_restart()) ACCESSOR(bank5ctl,bank[5],mce_restart()) -static ssize_t show_trigger (struct sys_device *s,char *buf) +static ssize_t show_trigger (struct sys_device *s,struct sysdev_attribute *attr, +char *buf) {strcpy (buf, trigger);strcat (buf,"\n" );return strlen (trigger) +1 ; } -static ssize_t set_trigger (struct sys_device *s,const char *buf,size_t siz) +static ssize_t set_trigger (struct sys_device *s,struct sysdev_attribute *attr, +const char *buf,size_t siz) {char *p;int len;
arch/x86/kernel/cpu/mcheck/therm_throt.c +1 -0
@@ -35,6 +35,7 @@ atomic_t therm_throt_en = ATOMIC_INIT(0);#define define_therm_throt_sysdev_show_func (name) \ static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev, \ + struct sysdev_attribute *attr, \ char *buf) \ { \ unsigned int cpu = dev->id; \
arch/x86/kernel/microcode.c +7 -3
@@ -644,7 +644,9 @@ static void microcode_fini_cpu(int cpu)mutex_unlock (µcode_mutex); } -static ssize_t reload_store (struct sys_device *dev,const char *buf,size_t sz) +static ssize_t reload_store (struct sys_device *dev, +struct sysdev_attribute *attr, +const char *buf,size_t sz) {struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;char *end;
@@ -674,14 +676,16 @@ static ssize_t reload_store(struct sys_device *dev, const char *buf, size_t sz)return sz; } -static ssize_t version_show (struct sys_device *dev,char *buf) +static ssize_t version_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;return sprintf (buf,"0x%x\n" , uci->rev); } -static ssize_t pf_show (struct sys_device *dev,char *buf) +static ssize_t pf_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;
drivers/base/cpu.c +6 -4
@@ -21,15 +21,16 @@ EXPORT_SYMBOL(cpu_sysdev_class); static DEFINE_PER_CPU(struct sys_device *, cpu_sys_devices);#ifdef CONFIG_HOTPLUG_CPU -static ssize_t show_online (struct sys_device *dev,char *buf) +static ssize_t show_online (struct sys_device *dev,struct sysdev_attribute *attr, +char *buf) { struct cpu *cpu = container_of(dev, struct cpu, sysdev);return sprintf (buf,"%u\n" , !!cpu_online (cpu->sysdev.id)); } -static ssize_t __ref store_online (struct sys_device *dev,const char *buf, -size_t count) +static ssize_t __ref store_online (struct sys_device *dev,struct sysdev_attribute *attr, +const char *buf,size_t count) { struct cpu *cpu = container_of(dev, struct cpu, sysdev);ssize_t ret;
@@ -80,7 +81,8 @@ static inline void register_cpu_control(struct cpu *cpu)#ifdef CONFIG_KEXEC #include <linux/kexec.h> -static ssize_t show_crash_notes (struct sys_device *dev,char *buf) +static ssize_t show_crash_notes (struct sys_device *dev,struct sysdev_attribute *attr, +char *buf) { struct cpu *cpu = container_of(dev, struct cpu, sysdev);ssize_t rc;
drivers/base/memory.c +8 -4
@@ -92,7 +92,8 @@ unregister_memory(struct memory_block *memory, struct mem_section *section)* uses. */ -static ssize_t show_mem_phys_index (struct sys_device *dev,char *buf) +static ssize_t show_mem_phys_index (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct memory_block *mem = container_of(dev, struct memory_block, sysdev);
@@ -102,7 +103,8 @@ static ssize_t show_mem_phys_index(struct sys_device *dev, char *buf)/* * online, offline, going offline, etc. */ -static ssize_t show_mem_state (struct sys_device *dev,char *buf) +static ssize_t show_mem_state (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct memory_block *mem = container_of(dev, struct memory_block, sysdev);
@@ -217,7 +219,8 @@ out: }static ssize_t -store_mem_state (struct sys_device *dev,const char *buf,size_t count) +store_mem_state (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {struct memory_block *mem;unsigned int phys_section_nr;
@@ -248,7 +251,8 @@ out:* s.t. if I offline all of these sections I can then * remove the physical device? */ -static ssize_t show_phys_device (struct sys_device *dev,char *buf) +static ssize_t show_phys_device (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {struct memory_block *mem = container_of(dev, struct memory_block, sysdev);
drivers/base/node.c +10 -5
@@ -36,11 +36,13 @@ static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)return len; } -static inline ssize_t node_read_cpumask (struct sys_device *dev,char *buf) +static inline ssize_t node_read_cpumask (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {return node_read_cpumap (dev,0 , buf); } -static inline ssize_t node_read_cpulist (struct sys_device *dev,char *buf) +static inline ssize_t node_read_cpulist (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {return node_read_cpumap (dev,1 , buf); }
@@ -49,7 +51,8 @@ static SYSDEV_ATTR(cpumap, S_IRUGO, node_read_cpumask, NULL); static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL);#define K (x) ((x) << (PAGE_SHIFT - 10)) -static ssize_t node_read_meminfo (struct sys_device * dev,char * buf) +static ssize_t node_read_meminfo (struct sys_device * dev, +struct sysdev_attribute *attr,char * buf) {int n;int nid = dev->id;
@@ -112,7 +115,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)#undef K static SYSDEV_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL); -static ssize_t node_read_numastat (struct sys_device * dev,char * buf) +static ssize_t node_read_numastat (struct sys_device * dev, +struct sysdev_attribute *attr,char * buf) {return sprintf (buf, "numa_hit %lu\n"
@@ -130,7 +134,8 @@ static ssize_t node_read_numastat(struct sys_device * dev, char * buf) } static SYSDEV_ATTR(numastat, S_IRUGO, node_read_numastat, NULL); -static ssize_t node_read_distance (struct sys_device * dev,char * buf) +static ssize_t node_read_distance (struct sys_device * dev, +struct sysdev_attribute *attr,char * buf) {int nid = dev->id;int len =0 ;
drivers/base/sys.c +2 -2
@@ -36,7 +36,7 @@ sysdev_show(struct kobject * kobj, struct attribute * attr, char * buffer)struct sysdev_attribute * sysdev_attr =to_sysdev_attr (attr);if (sysdev_attr->show) -return sysdev_attr->show (sysdev, buffer); +return sysdev_attr->show (sysdev, sysdev_attr, buffer);return -EIO ; }
@@ -49,7 +49,7 @@ sysdev_store(struct kobject * kobj, struct attribute * attr,struct sysdev_attribute * sysdev_attr =to_sysdev_attr (attr);if (sysdev_attr->store) -return sysdev_attr->store (sysdev, buffer, count); +return sysdev_attr->store (sysdev, sysdev_attr, buffer, count);return -EIO ; }
drivers/base/topology.c +12 -5
@@ -34,7 +34,8 @@ static SYSDEV_ATTR(_name, 0444, show_##_name, NULL)#define define_id_show_func (name) \ -static ssize_t show_##name(struct sys_device *dev, char *buf) \ +static ssize_t show_##name(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf) \ { \ unsigned int cpu = dev->id; \ return sprintf(buf, "%d\n", topology_##name(cpu)); \
@@ -59,14 +60,17 @@ static ssize_t show_cpumap(int type, cpumask_t *mask, char *buf)#ifdef arch_provides_topology_pointers#define define_siblings_show_map (name) \ -static ssize_t show_##name(struct sys_device *dev, char *buf) \ +static ssize_t show_##name(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf) \ { \ unsigned int cpu = dev->id; \ return show_cpumap(0, &(topology_##name(cpu)), buf); \ }#define define_siblings_show_list (name) \ -static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ +static ssize_t show_##name##_list(struct sys_device *dev, \ + struct sysdev_attribute *attr, \ + char *buf) \ { \ unsigned int cpu = dev->id; \ return show_cpumap(1, &(topology_##name(cpu)), buf); \
@@ -74,7 +78,8 @@ static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \#else #define define_siblings_show_map (name) \ -static ssize_t show_##name(struct sys_device *dev, char *buf) \ +static ssize_t show_##name(struct sys_device *dev, \ + struct sysdev_attribute *attr, char *buf) \ { \ unsigned int cpu = dev->id; \ cpumask_t mask = topology_##name(cpu); \
@@ -82,7 +87,9 @@ static ssize_t show_##name(struct sys_device *dev, char *buf) \ }#define define_siblings_show_list (name) \ -static ssize_t show_##name##_list(struct sys_device *dev, char *buf) \ +static ssize_t show_##name##_list(struct sys_device *dev, \ + struct sysdev_attribute *attr, \ + char *buf) \ { \ unsigned int cpu = dev->id; \ cpumask_t mask = topology_##name(cpu); \
drivers/cpuidle/sysfs.c +7 -3
@@ -21,7 +21,8 @@ static int __init cpuidle_sysfs_setup(char *unused) }__setup ("cpuidle_sysfs_switch" , cpuidle_sysfs_setup); -static ssize_t show_available_governors (struct sys_device *dev,char *buf) +static ssize_t show_available_governors (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {ssize_t i =0 ;struct cpuidle_governor *tmp;
@@ -39,7 +40,8 @@ out:return i; } -static ssize_t show_current_driver (struct sys_device *dev,char *buf) +static ssize_t show_current_driver (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {ssize_t ret;
@@ -53,7 +55,8 @@ static ssize_t show_current_driver(struct sys_device *dev, char *buf)return ret; } -static ssize_t show_current_governor (struct sys_device *dev,char *buf) +static ssize_t show_current_governor (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {ssize_t ret;
@@ -68,6 +71,7 @@ static ssize_t show_current_governor(struct sys_device *dev, char *buf) }static ssize_t store_current_governor (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {char gov_name[CPUIDLE_NAME_LEN ];
drivers/xen/balloon.c +1 -0
@@ -610,6 +610,7 @@ static ssize_t show_target_kb(struct sys_device *dev, char *buf) }static ssize_t store_target_kb (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {
include/linux/sysdev.h +3 -2
@@ -99,8 +99,9 @@ extern void sysdev_unregister(struct sys_device *);struct sysdev_attribute {struct attribute attr; -ssize_t (*show)(struct sys_device *,char *); -ssize_t (*store)(struct sys_device *,const char *,size_t ); +ssize_t (*show)(struct sys_device *,struct sysdev_attribute *,char *); +ssize_t (*store)(struct sys_device *,struct sysdev_attribute *, +const char *,size_t ); };
kernel/rtmutex-tester.c +4 -3
@@ -297,8 +297,8 @@ static int test_func(void *data)* * opcode:data */ -static ssize_t sysfs_test_command (struct sys_device *dev,const char *buf, -size_t count) +static ssize_t sysfs_test_command (struct sys_device *dev,struct sysdev_attribute *attr, +const char *buf,size_t count) {struct sched_param schedpar;struct test_thread_data *td;
@@ -360,7 +360,8 @@ static ssize_t sysfs_test_command(struct sys_device *dev, const char *buf,* @dev: thread to query * @buf: char buffer to be filled with thread status info */ -static ssize_t sysfs_test_status (struct sys_device *dev,char *buf) +static ssize_t sysfs_test_status (struct sys_device *dev,struct sysdev_attribute *attr, +char *buf) {struct test_thread_data *td;struct task_struct *tsk;
kernel/sched.c +6 -2
@@ -7737,11 +7737,13 @@ static ssize_t sched_power_savings_store(const char *buf, size_t count, int smt) }#ifdef CONFIG_SCHED_MC -static ssize_t sched_mc_power_savings_show (struct sys_device *dev,char *page) +static ssize_t sched_mc_power_savings_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *page) {return sprintf (page,"%u\n" , sched_mc_power_savings); }static ssize_t sched_mc_power_savings_store (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {return sched_power_savings_store (buf, count,0 );
@@ -7751,11 +7753,13 @@ static SYSDEV_ATTR(sched_mc_power_savings, 0644, sched_mc_power_savings_show,#endif #ifdef CONFIG_SCHED_SMT -static ssize_t sched_smt_power_savings_show (struct sys_device *dev,char *page) +static ssize_t sched_smt_power_savings_show (struct sys_device *dev, +struct sysdev_attribute *attr,char *page) {return sprintf (page,"%u\n" , sched_smt_power_savings); }static ssize_t sched_smt_power_savings_store (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {return sched_power_savings_store (buf, count,1 );
kernel/time/clocksource.c +6 -2
@@ -376,7 +376,8 @@ void clocksource_unregister(struct clocksource *cs)* Provides sysfs interface for listing current clocksource. */ static ssize_t -sysfs_show_current_clocksources (struct sys_device *dev,char *buf) +sysfs_show_current_clocksources (struct sys_device *dev, +struct sysdev_attribute *attr,char *buf) {ssize_t count =0 ;
@@ -397,6 +398,7 @@ sysfs_show_current_clocksources(struct sys_device *dev, char *buf)* clocksource selction. */ static ssize_t sysfs_override_clocksource (struct sys_device *dev, +struct sysdev_attribute *attr,const char *buf,size_t count) {struct clocksource *ovr =NULL ;
@@ -449,7 +451,9 @@ static ssize_t sysfs_override_clocksource(struct sys_device *dev,* Provides sysfs interface for listing registered clocksources */ static ssize_t -sysfs_show_available_clocksources (struct sys_device *dev,char *buf) +sysfs_show_available_clocksources (struct sys_device *dev, +struct sysdev_attribute *attr, +char *buf) {struct clocksource *src;ssize_t count =0 ;
Signature · 1 line
1.5.6.3
Andrew Morton
maintainerRe: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 18 lines · On Mon, 21 Jul 2008 22:19:36 -0700 Greg Kroah-Hartman <[email protected]> wrote:
From: Andi Kleen <[email protected]>
This allow to dynamically generate attributes and share show/store functions between attributes. Right now most attributes are generated by special macros and lots of duplicated code. With the attribute passed it's instead possible to attach some data to the attribute and then use that in shared low level functions to do different things.
I need this for the dynamically generated bank attributes in the x86 machine check code, but it'll allow some further cleanups.
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32
Quoted 6 lines
Signed-off-by Andi Kleen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>...
kernel/sched.c | 8 ++++-
This wrecks use-sysdev_class-in-schedc.patch (below), which I merged a week ago and will now drop.
Why did this patch from Andi just turn up in linux-next now, halfway through the merge window? It has a commit date of July 1 yet it has never before been sighted in linux-next.
From: Takashi Iwai <[email protected]>
The power_saving* attributes are really sysdev_class stuff, so we must create them via sysdev_class_create_file(). The parameters of callback functions must be also fixed.
---
kernel/sched.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
kernel/sched.c renamed from kernel/sched.c~use-sysdev_class-in-schedc +16 -12
@@ -7732,31 +7732,35 @@ static ssize_t sched_power_savings_store }#ifdef CONFIG_SCHED_MC -static ssize_t sched_mc_power_savings_show (struct sys_device *dev,char *page) +static ssize_t sched_mc_power_savings_show (struct sysdev_class *cls, +char *page) {return sprintf (page,"%u\n" , sched_mc_power_savings); } -static ssize_t sched_mc_power_savings_store (struct sys_device *dev, +static ssize_t sched_mc_power_savings_store (struct sysdev_class *cls,const char *buf,size_t count) {return sched_power_savings_store (buf, count,0 ); } -static SYSDEV_ATTR(sched_mc_power_savings, 0644, sched_mc_power_savings_show, - sched_mc_power_savings_store); +static SYSDEV_CLASS_ATTR(sched_mc_power_savings, 0644, + sched_mc_power_savings_show, + sched_mc_power_savings_store);#endif #ifdef CONFIG_SCHED_SMT -static ssize_t sched_smt_power_savings_show (struct sys_device *dev,char *page) +static ssize_t sched_smt_power_savings_show (struct sysdev_class *cls, +char *page) {return sprintf (page,"%u\n" , sched_smt_power_savings); } -static ssize_t sched_smt_power_savings_store (struct sys_device *dev, +static ssize_t sched_smt_power_savings_store (struct sysdv_class *cls,const char *buf,size_t count) {return sched_power_savings_store (buf, count,1 ); } -static SYSDEV_ATTR(sched_smt_power_savings, 0644, sched_smt_power_savings_show, - sched_smt_power_savings_store); +static SYSDEV_CLASS_ATTR(sched_smt_power_savings, 0644, + sched_smt_power_savings_show, + sched_smt_power_savings_store);#endif int sched_create_sysfs_power_savings_entries (struct sysdev_class *cls)
@@ -7765,13 +7769,13 @@ int sched_create_sysfs_power_savings_ent#ifdef CONFIG_SCHED_SMT if (smt_capable ()) - err =sysfs_create_file (&cls->kset.kobj, - &attr_sched_smt_power_savings.attr); + err =sysdev_class_create_file (cls, + &attr_sched_smt_power_savings);#endif #ifdef CONFIG_SCHED_MC if (!err &&mc_capable ()) - err =sysfs_create_file (&cls->kset.kobj, - &attr_sched_mc_power_savings.attr); + err =sysdev_class_create_file (cls, + &attr_sched_mc_power_savings);#endif return err; }
_
Re: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 26 lines · Andrew Morton
Quoted 23 lines · On Mon, 21 Jul 2008 22:19:36 -0700 Greg Kroah-Hartman <[email protected]> wrote:
From: Andi Kleen <[email protected]>
This allow to dynamically generate attributes and share show/store functions between attributes. Right now most attributes are generated by special macros and lots of duplicated code. With the attribute passed it's instead possible to attach some data to the attribute and then use that in shared low level functions to do different things.
I need this for the dynamically generated bank attributes in the x86 machine check code, but it'll allow some further cleanups.
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32Signed-off-by Andi Kleen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>...
Quoted 8 lines
Quoted 1 line
kernel/sched.c | 8 ++++-This wrecks use-sysdev_class-in-schedc.patch (below), which I merged a week ago and will now drop.
Why did this patch from Andi just turn up in linux-next now, halfway through the merge window? It has a commit date of July 1 yet it has never before been sighted in linux-next.
What? It's been in linux-next for a while now as it's been in my tree for quite some time. Unless it somehow got reverted in -next and I didn't realize it? Which I kind of doubt as it was causing problems with the sparc build and I got reports of that.
This should be a simple merge, the show/store functions of sysdev now just got an additional parameter, like we've done for a while with other types of attributes.
thanks,
greg k-h
Andrew Morton
maintainerRe: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 36 lines · On Tue, 22 Jul 2008 13:49:39 -0700 Greg KH <[email protected]> wrote:
Quoted 26 lines · Andrew Morton
Quoted 23 lines · On Mon, 21 Jul 2008 22:19:36 -0700 Greg Kroah-Hartman <[email protected]> wrote:
From: Andi Kleen <[email protected]>
This allow to dynamically generate attributes and share show/store functions between attributes. Right now most attributes are generated by special macros and lots of duplicated code. With the attribute passed it's instead possible to attach some data to the attribute and then use that in shared low level functions to do different things.
I need this for the dynamically generated bank attributes in the x86 machine check code, but it'll allow some further cleanups.
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32Signed-off-by Andi Kleen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>...
Quoted 8 lines
Quoted 1 line
kernel/sched.c | 8 ++++-This wrecks use-sysdev_class-in-schedc.patch (below), which I merged a week ago and will now drop.
Why did this patch from Andi just turn up in linux-next now, halfway through the merge window? It has a commit date of July 1 yet it has never before been sighted in linux-next.
Quoted 9 lines
What? It's been in linux-next for a while now as it's been in my tree for quite some time. Unless it somehow got reverted in -next and I didn't realize it? Which I kind of doubt as it was causing problems with the sparc build and I got reports of that.
This should be a simple merge, the show/store functions of sysdev now just got an additional parameter, like we've done for a while with other types of attributes.
Well the changelog for yesterday's linux-next lists this change, but the diff to kernel/sched.c (below) does not contain it. No idea what caused that.
A whole pile of greggish stuff just turned up in linux-next and I'm fixing and dropping stuff left, right and centre over here.
kernel/sched.c renamed from kernel/sched.c~linux-next +19 -24
@@ -2108,7 +2108,7 @@ find_idlest_group(struct sched_domain *s/* Tally up the load of all CPUs in the group */ avg_load =0 ; -for_each_cpu_mask (i, group->cpumask) { +for_each_cpu_mask_nr (i, group->cpumask) {/* Bias balancing toward cpus of our domain */ if (local_group) load =source_load (i, load_idx);
@@ -2150,7 +2150,7 @@ find_idlest_cpu(struct sched_group *grou/* Traverse only the allowed CPUs */ cpus_and (*tmp, group->cpumask, p->cpus_allowed); -for_each_cpu_mask (i, *tmp) { +for_each_cpu_mask_nr (i, *tmp) { load =weighted_cpuload (i);if (load < min_load || (load == min_load && i == this_cpu)) {
@@ -3168,7 +3168,7 @@ find_busiest_group(struct sched_domain * max_cpu_load =0 ; min_cpu_load = ~0UL ; -for_each_cpu_mask (i, group->cpumask) { +for_each_cpu_mask_nr (i, group->cpumask) {struct rq *rq;if (!cpu_isset (i, *cpus))
@@ -3447,7 +3447,7 @@ find_busiest_queue(struct sched_group *gunsigned long max_load =0 ;int i; -for_each_cpu_mask (i, group->cpumask) { +for_each_cpu_mask_nr (i, group->cpumask) {unsigned long wl;if (!cpu_isset (i, *cpus))
@@ -3989,7 +3989,7 @@ static void run_rebalance_domains(structint balance_cpu;cpu_clear (this_cpu, cpus); -for_each_cpu_mask (balance_cpu, cpus) { +for_each_cpu_mask_nr (balance_cpu, cpus) {/* * If this cpu gets work to do, stop the load balancing * work being done for other cpus. Next load
@@ -5663,12 +5663,7 @@ void sched_show_task(struct task_structprintk (KERN_CONT " %016lx " ,thread_saved_pc (p));#endif #ifdef CONFIG_DEBUG_STACK_USAGE - { -unsigned long *n =end_of_stack (p); -while (!*n) - n++; - free = (unsigned long )n - (unsigned long )end_of_stack (p); - } + free =stack_not_used (p);#endif printk (KERN_CONT "%5lu %5d %6d\n" , free,task_pid_nr (p),task_pid_nr (p->real_parent));
@@ -6802,7 +6797,7 @@ init_sched_build_groups(const cpumask_tcpus_clear (*covered); -for_each_cpu_mask (i, *span) { +for_each_cpu_mask_nr (i, *span) {struct sched_group *sg;int group =group_fn (i, cpu_map, &sg, tmpmask);int j;
@@ -6813,7 +6808,7 @@ init_sched_build_groups(const cpumask_tcpus_clear (sg->cpumask); sg->__cpu_power =0 ; -for_each_cpu_mask (j, *span) { +for_each_cpu_mask_nr (j, *span) {if (group_fn (j, cpu_map,NULL , tmpmask) != group)continue ;
@@ -7013,7 +7008,7 @@ static void init_numa_sched_groups_powerif (!sg)return ; do { - for_each_cpu_mask(j, sg->cpumask) { + for_each_cpu_mask_nr(j, sg->cpumask) { struct sched_domain *sd; sd = &per_cpu(phys_domains, j);
@@ -7038,7 +7033,7 @@ static void free_sched_groups(const cpum {int cpu, i; -for_each_cpu_mask (cpu, *cpu_map) { +for_each_cpu_mask_nr (cpu, *cpu_map) {struct sched_group **sched_group_nodes = sched_group_nodes_bycpu[cpu];
@@ -7277,7 +7272,7 @@ static int __build_sched_domains(const c/* * Set up domains for cpus specified by the cpu_map. */ -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {struct sched_domain *sd =NULL , *p;SCHED_CPUMASK_VAR (nodemask, allmasks);
@@ -7344,7 +7339,7 @@ static int __build_sched_domains(const c#ifdef CONFIG_SCHED_SMT /* Set up CPU (sibling) groups */ -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {SCHED_CPUMASK_VAR (this_sibling_map, allmasks);SCHED_CPUMASK_VAR (send_covered, allmasks);
@@ -7361,7 +7356,7 @@ static int __build_sched_domains(const c#ifdef CONFIG_SCHED_MC /* Set up multi-core groups */ -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {SCHED_CPUMASK_VAR (this_core_map, allmasks);SCHED_CPUMASK_VAR (send_covered, allmasks);
@@ -7428,7 +7423,7 @@ static int __build_sched_domains(const c goto error; } sched_group_nodes[i] = sg; -for_each_cpu_mask (j, *nodemask) { +for_each_cpu_mask_nr (j, *nodemask) {struct sched_domain *sd; sd = &per_cpu (node_domains, j);
@@ -7474,21 +7469,21 @@ static int __build_sched_domains(const c/* Calculate CPU power for physical packages and nodes */ #ifdef CONFIG_SCHED_SMT -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {struct sched_domain *sd = &per_cpu (cpu_domains, i);init_sched_groups_power (i, sd); }#endif #ifdef CONFIG_SCHED_MC -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {struct sched_domain *sd = &per_cpu (core_domains, i);init_sched_groups_power (i, sd); }#endif -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {struct sched_domain *sd = &per_cpu (phys_domains, i);init_sched_groups_power (i, sd);
@@ -7508,7 +7503,7 @@ static int __build_sched_domains(const c#endif /* Attach the domains */ -for_each_cpu_mask (i, *cpu_map) { +for_each_cpu_mask_nr (i, *cpu_map) {struct sched_domain *sd;#ifdef CONFIG_SCHED_SMT sd = &per_cpu (cpu_domains, i);
@@ -7603,7 +7598,7 @@ static void detach_destroy_domains(constunregister_sched_domain_sysctl (); -for_each_cpu_mask (i, *cpu_map) +for_each_cpu_mask_nr (i, *cpu_map)cpu_attach_domain (NULL , &def_root_domain, i);synchronize_sched ();arch_destroy_sched_domains (cpu_map, &tmpmask);
Re: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 44 lines · Andrew Morton
Quoted 41 lines · On Tue, 22 Jul 2008 13:49:39 -0700 Greg KH <[email protected]> wrote:
Quoted 26 lines · Andrew Morton
Quoted 23 lines · On Mon, 21 Jul 2008 22:19:36 -0700 Greg Kroah-Hartman <[email protected]> wrote:
From: Andi Kleen <[email protected]>
This allow to dynamically generate attributes and share show/store functions between attributes. Right now most attributes are generated by special macros and lots of duplicated code. With the attribute passed it's instead possible to attach some data to the attribute and then use that in shared low level functions to do different things.
I need this for the dynamically generated bank attributes in the x86 machine check code, but it'll allow some further cleanups.
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32Signed-off-by Andi Kleen <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>...
Quoted 8 lines
Quoted 1 line
kernel/sched.c | 8 ++++-This wrecks use-sysdev_class-in-schedc.patch (below), which I merged a week ago and will now drop.
Why did this patch from Andi just turn up in linux-next now, halfway through the merge window? It has a commit date of July 1 yet it has never before been sighted in linux-next.
What? It's been in linux-next for a while now as it's been in my tree for quite some time. Unless it somehow got reverted in -next and I didn't realize it? Which I kind of doubt as it was causing problems with the sparc build and I got reports of that.
Quoted 8 lines
Quoted 4 lines
This should be a simple merge, the show/store functions of sysdev now just got an additional parameter, like we've done for a while with other types of attributes.
Well the changelog for yesterday's linux-next lists this change, but the diff to
kernel/sched.c(below) does not contain it. No idea what caused that.
Andi any thoughts?
Re: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Hi Greg,
Quoted 2 lines · On Tue, 22 Jul 2008 14:19:19 -0700 Greg KH <[email protected]> wrote:
Andi any thoughts?
The patch (sysdev-pass-the-attribute-to-the-low-level-sysdev-show-store-function.patch) has existed in the driver-core part of linux-next since July 4, but the kernel/sched.c part only got added yesterday.
Signature · 3 lines
Cheers, Stephen Rothwell [email protected] http://www.canb.auug.org.au/~sfr/
Re: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 10 lines · Stephen Rothwell
Hi Greg,
Quoted 2 lines · On Tue, 22 Jul 2008 14:19:19 -0700 Greg KH <[email protected]> wrote:
Andi any thoughts?
The patch (sysdev-pass-the-attribute-to-the-low-level-sysdev-show-store-function.patch) has existed in the driver-core part of linux-next since July 4, but the
kernel/sched.cpart only got added yesterday.
That came from the updated version that Andi sent me to fix the sparc64 build problems the original version had.
Stephen, thanks for diging this out.
greg k-h
Re: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 4 lines · Greg KH
Quoted 3 lines · Stephen Rothwell
Hi Greg,
On Tue, 22 Jul 2008 14:19:19 -0700 Greg KH <[email protected]> wrote:
[...]
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines · Andrew Morton
Quoted 7 lines
This wrecks use-sysdev_class-in-schedc.patch (below), which I merged a week ago and will now drop.
Why did this patch from Andi just turn up in linux-next now, halfway through the merge window? It has a commit date of July 1 yet it has never before been sighted in linux-next.
[...]
Quoted 8 lines
Quoted 7 lines
Quoted 2 lines
Andi any thoughts?
The patch (sysdev-pass-the-attribute-to-the-low-level-sysdev-show-store-function.patch) has existed in the driver-core part of linux-next since July 4, but the
kernel/sched.cpart only got added yesterday.
Quoted 4 lines
That came from the updated version that Andi sent me to fix the sparc64 build problems the original version had.
Stephen, thanks for diging this out.
ok, lemme do a bit of merge window flaming here, in defense of Andrew.
This commit history:
commit 4a0b2b4dbe1335b8b9886ba3dc85a145d5d938ed
Author: Andi Kleen <[email protected]>
AuthorDate: Tue Jul 1 18:48:41 2008 +0200
Commit: Greg Kroah-Hartman <[email protected]>
CommitDate: Mon Jul 21 21:55:02 2008 -0700
sysdev: Pass the attribute to the low level sysdev show/store function
[...]
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32
covers a relatively trivial patch that we'd normally not notice, but it is ... a ... misrepresentation of the true situation on several levels:
1) The changelog. The updated patch Andi sent did not declare the other incremental changes (to sched.c) it also included freshly.
2) The date. This patch did not originate on Jul 1 - if Andi sent a material update yesterday it should say Jul 21, not Jul 1.
3) The justification. Huge atomic patches are fine and can indeed be much simpler than a gradual switchover, _iff_ they are done perfectly. If there's any doubt then they are by far not the only option to pursue - we've done finegrained API changeovers for years.
... which all we still wouldnt worry much about (the whole change is relatively trivial), if it had been done more carefully without wrecking Andrew's workflow in the middle of the merge window.
If every upstream pull - no matter how trivial - caused such work flow problems for Andrew (who is sitting at the _end_ of all linux-next stuff so is particularly hard hit by last-minute updates - especially if they are not append-only) then Andrew would never be able to get his stuff from -mm into -git.
If Andi cannot be bothered to do a proper finegrained workflow _or_ at least make it damned sure that he does not mess up other people's work via one huge patch modified on the last day (instead of at least sending an incremental patch for the last delta) then he should not be doing such complex changes.
Grmbl!
Ingo
Re: [PATCH 72/79] sysdev: Pass the attribute to the low level sysdev show/store function
Quoted 21 lines · Ingo Molnar
ok, lemme do a bit of merge window flaming here, in defense of Andrew.
This commit history:
commit
4a0b2b4dbe1335b8b9886ba3dc85a145d5d938ed
Author: Andi Kleen <[email protected]>
AuthorDate: Tue Jul 1 18:48:41 2008 +0200
Commit: Greg Kroah-Hartman <[email protected]>
CommitDate: Mon Jul 21 21:55:02 2008 -0700sysdev: Pass the attribute to the low level sysdev show/store function
[...]
I converted all users in tree to the new show/store prototype. It's a single huge patch to avoid unbisectable sections.
Runtime tested: x86-32, x86-64
Compiled only: ia64, powerpc
Not compile tested/only grep converted: sh, arm, avr32
Quoted 5 lines
covers a relatively trivial patch that we'd normally not notice, but it is ... a ... misrepresentation of the true situation on several levels:
1) The changelog. The updated patch Andi sent did not declare the other incremental changes (to
sched.c) it also included freshly.
Andi's original patch that he sent me _did_ declare that he had updated the patch, I didn't change the changelog as it didn't make sense to do so.
Quoted 2 lines
2) The date. This patch did not originate on Jul 1 - if Andi sent a material update yesterday it should say Jul 21, not Jul 1.
Again, my fault, I kept the original email headers and just updated the patch portion. It's easier for me to do that using quilt, hence the lack of the date change.
Quoted 4 lines
3) The justification. Huge atomic patches are fine and can indeed be much simpler than a gradual switchover, _iff_ they are done perfectly. If there's any doubt then they are by far not the only option to pursue - we've done finegrained API changeovers for years.
This kind of API change is atomic, sorry. It was tiny enough that it didn't justify a big rework (like I did on the recent device_create() stuff for example) to get it modified.
Quoted 3 lines
... which all we still wouldnt worry much about (the whole change is relatively trivial), if it had been done more carefully without wrecking Andrew's workflow in the middle of the merge window.
I understand, and I apologize.
thanks,
greg k-h
PATCH 73/79 sysdev: Add utility functions for simple int/ulong variable sysdev attributes
In reply to Greg KHFrom: Andi Kleen <[email protected]>
This adds a new sysdev_ext_attribute that stores a pointer to the variable it manages and some utility functions/macro to easily use them.
Previously all users wrote custom macros to generate show/store functions for each variable, with this it is possible to avoid that in many cases.
--- drivers/base/sys.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/sysdev.h | 34 +++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 0 deletions(-)
drivers/base/sys.c +49 -0
@@ -479,3 +479,52 @@ int __init system_bus_init(void)EXPORT_SYMBOL_GPL (sysdev_register);EXPORT_SYMBOL_GPL (sysdev_unregister); + +#define to_ext_attr (x) container_of(x, struct sysdev_ext_attribute, attr) + +ssize_t sysdev_store_ulong (struct sys_device *sysdev, +struct sysdev_attribute *attr, +const char *buf,size_t size) +{ +struct sysdev_ext_attribute *ea =to_ext_attr (attr); +char *end; +unsigned long new =simple_strtoul (buf, &end,0 ); +if (end == buf) +return -EINVAL ; + *(unsigned long *)(ea->var) = new; +return end - buf; +} +EXPORT_SYMBOL_GPL (sysdev_store_ulong); + +ssize_t sysdev_show_ulong (struct sys_device *sysdev, +struct sysdev_attribute *attr, +char *buf) +{ +struct sysdev_ext_attribute *ea =to_ext_attr (attr); +return snprintf (buf,PAGE_SIZE ,"%lx\n" , *(unsigned long *)(ea->var)); +} +EXPORT_SYMBOL_GPL (sysdev_show_ulong); + +ssize_t sysdev_store_int (struct sys_device *sysdev, +struct sysdev_attribute *attr, +const char *buf,size_t size) +{ +struct sysdev_ext_attribute *ea =to_ext_attr (attr); +char *end; +long new =simple_strtol (buf, &end,0 ); +if (end == buf || new >INT_MAX || new <INT_MIN ) +return -EINVAL ; + *(int *)(ea->var) = new; +return end - buf; +} +EXPORT_SYMBOL_GPL (sysdev_store_int); + +ssize_t sysdev_show_int (struct sys_device *sysdev, +struct sysdev_attribute *attr, +char *buf) +{ +struct sysdev_ext_attribute *ea =to_ext_attr (attr); +return snprintf (buf,PAGE_SIZE ,"%d\n" , *(int *)(ea->var)); +} +EXPORT_SYMBOL_GPL (sysdev_show_int); +
include/linux/sysdev.h +34 -0
@@ -119,4 +119,38 @@ struct sysdev_attribute {extern int sysdev_create_file (struct sys_device *,struct sysdev_attribute *);extern void sysdev_remove_file (struct sys_device *,struct sysdev_attribute *); +struct sysdev_ext_attribute { +struct sysdev_attribute attr; +void *var; +}; + +/* +* Support for simple variable sysdev attributes. +* The pointer to the variable is stored in a sysdev_ext_attribute +*/ + +/* Add more types as needed */ + +extern ssize_t sysdev_show_ulong (struct sys_device *,struct sysdev_attribute *, +char *); +extern ssize_t sysdev_store_ulong (struct sys_device *, +struct sysdev_attribute *,const char *,size_t ); +extern ssize_t sysdev_show_int (struct sys_device *,struct sysdev_attribute *, +char *); +extern ssize_t sysdev_store_int (struct sys_device *, +struct sysdev_attribute *,const char *,size_t ); + +#define _SYSDEV_ULONG_ATTR (_name, _mode, _var) \ + { _SYSDEV_ATTR(_name, _mode, sysdev_show_ulong, sysdev_store_ulong), \ + &(_var) } +#define SYSDEV_ULONG_ATTR (_name, _mode, _var) \ + struct sysdev_ext_attribute attr_##_name = \ + _SYSDEV_ULONG_ATTR(_name, _mode, _var); +#define _SYSDEV_INT_ATTR (_name, _mode, _var) \ + { _SYSDEV_ATTR(_name, _mode, sysdev_show_int, sysdev_store_int), \ + &(_var) } +#define SYSDEV_INT_ATTR (_name, _mode, _var) \ + struct sysdev_ext_attribute attr_##_name = \ + _SYSDEV_INT_ATTR(_name, _mode, _var); +#endif /* _SYSDEV_H_ */
Signature · 1 line
1.5.6.3
PATCH 74/79 sysdev: Convert the x86 mce tolerant sysdev attribute to generic attribute
In reply to Greg KHFrom: Andi Kleen <[email protected]>
Use the new generic int attribute accessors for the x86 mce tolerant attribute. Simple example to illustrate the new macros.
There are much more places all over the tree that could be converted like this.
--- arch/x86/kernel/cpu/mcheck/mce_64.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/mcheck/mce_64.c +2 -2
@@ -812,12 +812,12 @@ static ssize_t set_trigger(struct sys_device *s, struct sysdev_attribute *attr, } static SYSDEV_ATTR(trigger, 0644, show_trigger, set_trigger); -ACCESSOR(tolerant,tolerant,) +static SYSDEV_INT_ATTR(tolerant, 0644, tolerant); ACCESSOR(check_interval,check_interval,mce_restart()) static struct sysdev_attribute *mce_attributes[] = { &attr_bank0ctl, &attr_bank1ctl, &attr_bank2ctl, &attr_bank3ctl, &attr_bank4ctl, &attr_bank5ctl, - &attr_tolerant, &attr_check_interval, &attr_trigger, + &attr_tolerant.attr, &attr_check_interval, &attr_trigger,NULL };
Signature · 1 line
1.5.6.3
PATCH 75/79 HP iLO driver
In reply to Greg KHFrom: David Altobelli <[email protected]>
A driver for the HP iLO/iLO2 management processor, which allows userspace programs to query the management processor. Programs can open a channel to the device (/dev/hpilo/dXccbN), and use this to send/receive queries. The O_EXCL open flag is used to indicate that a particular channel cannot be shared between processes. This driver will replace various packages HP has shipped, including hprsm and hp-ilo.
--- drivers/misc/Kconfig | 13 + drivers/misc/Makefile | 1 + drivers/misc/hpilo.c | 768 +++++++++++++++++++++++++++++++++++++++++++++++++ drivers/misc/hpilo.h | 189 ++++++++++++ 4 files changed, 971 insertions(+), 0 deletions(-) create mode 100644 drivers/misc/hpilo.c create mode 100644 drivers/misc/hpilo.h
drivers/misc/Kconfig +13 -0
@@ -420,4 +420,17 @@ config SGI_XP this feature will allow for direct communication between SSIs based on a network adapter and DMA messaging. +config HP_ILO + tristate "Channel interface driver for HP iLO/iLO2 processor" + default n + help + The channel interface driver allows applications to communicate + with iLO/iLO2 management processors present on HP ProLiant + servers. Upon loading, the driver creates /dev/hpilo/dXccbN files, + which can be used to gather data from the management processor, + via read and write system calls. + + To compile this driver as a module, choose M here: the + module will be called hpilo. + endif # MISC_DEVICES
drivers/misc/Makefile +1 -0
@@ -27,3 +27,4 @@ obj-$(CONFIG_INTEL_MENLOW) += intel_menlow.o obj-$(CONFIG_ENCLOSURE_SERVICES) += enclosure.o obj-$(CONFIG_KGDB_TESTS) += kgdbts.o obj-$(CONFIG_SGI_XP) += sgi-xp/ +obj-$(CONFIG_HP_ILO) += hpilo.o
drivers/misc/hpilo.c new file +768 -0
768 lines not on this page · raw message
drivers/misc/hpilo.h new file +189 -0
189 lines not on this page · raw message
Signature · 1 line
1.5.6.3
RE: [PATCH 75/79] HP iLO driver
drivers/misc/Kconfig config SGI_XP · line 425
Quoted 11 lines · Greg Kroah-Hartman
drivers/misc/Kconfig +3
-0@@ -420,4 +420,17 @@ config SGI_XP this feature will allow for direct communication between SSIs based on a network adapter and DMA messaging. +config HP_ILO + tristate "Channel interface driver for HP iLO/iLO2 processor" + default n
Heiko Carstens submitted a Kconfig "depend on PCI" patch to linux-next, and that should be included with this series. His mail is below. Outlook might well mangle the diff, but that's my fault, not his.
----
Subject: [PATCH] Let HP iLO driver depend on PCI
From: Heiko Carstens <[email protected]>
"HP iLO driver" causes this:
drivers/misc/hpilo.c: In function 'doorbell_set':drivers/misc/hpilo.c:147: error: implicit declaration of function 'iowrite8' drivers/misc/hpilo.c: In function 'ilo_ccb_close':drivers/misc/hpilo.c:204: error: implicit declaration of function 'iowrite32' drivers/misc/hpilo.c:204: error: implicit declaration of function 'ioread32' drivers/misc/hpilo.c:222: error: implicit declaration of function 'memset_io' drivers/misc/hpilo.c:225: error: implicit declaration of function 'pci_free_consistent' drivers/misc/hpilo.c: In function 'ilo_ccb_open':drivers/misc/hpilo.c:244: error: implicit declaration of function 'pci_alloc_consistent' drivers/misc/hpilo.c:245: warning: assignment makes pointer from integer without a cast drivers/misc/hpilo.c:296: error: implicit declaration of function 'memcpy_toio' drivers/misc/hpilo.c: In function 'ilo_unmap_device':drivers/misc/hpilo.c:575: error: implicit declaration of function 'pci_iounmap' drivers/misc/hpilo.c: In function 'ilo_map_device':drivers/misc/hpilo.c:585: error: implicit declaration of function 'pci_iomap' drivers/misc/hpilo.c:585: warning: assignment makes pointer from integer without a cast drivers/misc/hpilo.c:592: warning: assignment makes pointer from integer without a cast drivers/misc/hpilo.c:599: warning: assignment makes pointer from integer without a cast make[2]: *** [drivers/misc/hpilo.o] Error 1
Just let it depend on PCI.
---
Greg, this came in via one of your git trees. Please merge/apply. Thanks.
drivers/misc/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/misc/Kconfig +1 -0
@@ -423,6 +423,7 @@ config SGI_XP config HP_ILO tristate "Channel interface driver for HP iLO/iLO2 processor" default n + depends on PCI help The channel interface driver allows applications to communicate with iLO/iLO2 management processors present on HP ProLiant
Re: [PATCH 75/79] HP iLO driver
Quoted 9 lines · David
Quoted 8 lines · Greg Kroah-Hartman
drivers/misc/Kconfig +0
-0@@ -420,4 +420,17 @@ config SGI_XP this feature will allow for direct communication between SSIs based on a network adapter and DMA messaging.
Quoted 7 lines
drivers/misc/Kconfig config SGI_XP · line 425
Quoted 3 lines
drivers/misc/Kconfig +3
-0+config HP_ILO + tristate "Channel interface driver for HP iLO/iLO2 processor" + default nHeiko Carstens submitted a
Kconfig"depend on PCI" patch to linux-next, and that should be included with this series. His mail is below. Outlook might well mangle the diff, but that's my fault, not his.
Thanks, sorry I missed that one, I'll add it to my queue for the next patch series to go to Linus.
greg k-h
PATCH 76/79 MTD: handle pci_name() being const
In reply to Greg KHThis changes the MTD core to handle pci_name() now returning a constant string.
--- drivers/mtd/devices/block2mtd.c | 8 +++++--- include/linux/mtd/map.h | 2 +- include/linux/mtd/mtd.h | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-)
drivers/mtd/devices/block2mtd.c +5 -3
@@ -241,6 +241,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) {struct block_device *bdev;struct block2mtd_dev *dev; +char *name;if (!devname)return NULL ;
@@ -279,12 +280,13 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)/* Setup the MTD structure */ /* make the name contain the block device in */ - dev->mtd.name =kmalloc (sizeof ("block2mtd: " ) +strlen (devname), + name =kmalloc (sizeof ("block2mtd: " ) +strlen (devname) +1 ,GFP_KERNEL ); -if (!dev->mtd.name) +if (!name) goto devinit_err; -sprintf (dev->mtd.name,"block2mtd: %s" , devname); +sprintf (name,"block2mtd: %s" , devname); + dev->mtd.name = name; dev->mtd.size = dev->blkdev->bd_inode->i_size &PAGE_MASK ; dev->mtd.erasesize = erase_size;
include/linux/mtd/map.h +1 -1
@@ -189,7 +189,7 @@ typedef union {*/ struct map_info { -char *name; +const char *name;unsigned long size;resource_size_t phys;#define NO_XIP (-1UL)
include/linux/mtd/mtd.h +1 -1
@@ -121,7 +121,7 @@ struct mtd_info {u_int32_t oobavail;// Available OOB bytes per block // Kernel-only stuff starts here. -char *name; +const char *name;int index;/* ecc layout structure pointer - read only ! */
Signature · 1 line
1.5.6.3
PATCH 77/79 3c59x: handle pci_name() being const
In reply to Greg KHThis changes vortex_prob1() to handle pci_name() now returning a constant string.
--- drivers/net/3c59x.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/net/3c59x.c +1 -1
@@ -1010,7 +1010,7 @@ static int __devinit vortex_probe1(struct device *gendev,static int printed_version;int retval, print_info;struct vortex_chip_info *const vci = &vortex_info_tbl[chip_idx]; -char *print_name ="3c59x" ; +const char *print_name ="3c59x" ;struct pci_dev *pdev =NULL ;struct eisa_device *edev =NULL ;DECLARE_MAC_BUF (mac);
Signature · 1 line
1.5.6.3
PATCH 78/79 sparc64: fix up bus_id changes in sparc core code
In reply to Greg KHThis converts all instances of bus_id in the sparc core kernel to use either dev_set_name(), or dev_name() depending on the need.
This is done in anticipation of removing the bus_id field from struct driver.
--- arch/sparc64/kernel/ebus.c | 4 ++-- arch/sparc64/kernel/of_device.c | 4 ++-- arch/sparc64/kernel/pci.c | 2 +- arch/sparc64/kernel/vio.c | 16 +++++++--------- drivers/sbus/sbus.c | 6 +++--- 5 files changed, 15 insertions(+), 17 deletions(-)
arch/sparc64/kernel/ebus.c +2 -2
@@ -401,7 +401,7 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de dev->ofdev.node = dp; dev->ofdev.dev.parent = &dev->bus->ofdev.dev; dev->ofdev.dev.bus = &ebus_bus_type; -sprintf (dev->ofdev.dev.bus_id,"ebus[%08x]" , dp->node); +dev_set_name (&dev->ofdev.dev,"ebus[%08x]" , dp->node);/* Register with core */ if (of_device_register (&dev->ofdev) !=0 )
@@ -501,7 +501,7 @@ void __init ebus_init(void) ebus->ofdev.node = dp; ebus->ofdev.dev.parent = &pdev->dev; ebus->ofdev.dev.bus = &ebus_bus_type; -sprintf (ebus->ofdev.dev.bus_id,"ebus%d" , num_ebus); +dev_set_name (&ebus->ofdev.dev,"ebus%d" , num_ebus);/* Register with core */ if (of_device_register (&ebus->ofdev) !=0 )
arch/sparc64/kernel/of_device.c +2 -2
@@ -797,9 +797,9 @@ static struct of_device * __init scan_one_device(struct device_node *dp, op->dev.parent = parent; op->dev.bus = &of_platform_bus_type;if (!parent) -strcpy (op->dev.bus_id,"root" ); +dev_set_name (&op->dev,"root" );else -sprintf (op->dev.bus_id,"%08x" , dp->node); +dev_set_name (&op->dev,"%08x" , dp->node);if (of_device_register (op)) { printk("%s: Could not register of device.\n",
arch/sparc64/kernel/pci.c +1 -1
@@ -408,7 +408,7 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm, dev->class = class >>8 ; dev->revision = class &0xff ; -sprintf (dev->dev.bus_id,"%04x:%02x:%02x.%d" ,pci_domain_nr (bus), +dev_set_name (&dev->dev,"%04x:%02x:%02x.%d" ,pci_domain_nr (bus), dev->bus->number,PCI_SLOT (devfn),PCI_FUNC (devfn));if (ofpci_verbose)
arch/sparc64/kernel/vio.c +7 -9
@@ -260,16 +260,14 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp,vio_fill_channel_info (hp, mp, vdev);if (!id) { -snprintf (vdev->dev.bus_id,BUS_ID_SIZE ,"%s" , - bus_id_name); +dev_set_name (&vdev->dev,"%s" , bus_id_name); vdev->dev_no = ~(u64 )0 ; }else if (!cfg_handle) { -snprintf (vdev->dev.bus_id,BUS_ID_SIZE ,"%s-%lu" , - bus_id_name, *id); +dev_set_name (&vdev->dev,"%s-%lu" , bus_id_name, *id); vdev->dev_no = *id; }else { -snprintf (vdev->dev.bus_id,BUS_ID_SIZE ,"%s-%lu-%lu" , - bus_id_name, *cfg_handle, *id); +dev_set_name (&vdev->dev,"%s-%lu-%lu" , bus_id_name, + *cfg_handle, *id); vdev->dev_no = *cfg_handle; }
@@ -292,12 +290,12 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp, } vdev->dp = dp; -printk (KERN_INFO "VIO: Adding device %s\n" , vdev->dev.bus_id); +printk (KERN_INFO "VIO: Adding device %s\n" ,dev_name (&vdev->dev)); err =device_register (&vdev->dev);if (err) {printk (KERN_ERR "VIO: Could not register device %s, err=%d\n" , - vdev->dev.bus_id, err); +dev_name (&vdev->dev), err);kfree (vdev);return NULL ; }
@@ -330,7 +328,7 @@ static void vio_remove(struct mdesc_handle *hp, u64 node) dev =device_find_child (&root_vdev->dev, (void *) node, vio_md_node_match);if (dev) { -printk (KERN_INFO "VIO: Removing device %s\n" , dev->bus_id); +printk (KERN_INFO "VIO: Removing device %s\n" ,dev_name (dev));device_unregister (dev); }
drivers/sbus/sbus.c +3 -3
@@ -78,7 +78,7 @@ static void __init fill_sbus_device(struct device_node *dp, struct sbus_dev *sdeelse sdev->ofdev.dev.parent = &sdev->bus->ofdev.dev; sdev->ofdev.dev.bus = &sbus_bus_type; -sprintf (sdev->ofdev.dev.bus_id,"sbus[%08x]" , dp->node); +dev_set_name (&sdev->ofdev.dev,"sbus[%08x]" , dp->node);if (of_device_register (&sdev->ofdev) !=0 ) printk(KERN_DEBUG "sbus: device registration error for %s!\n",
@@ -257,11 +257,11 @@ static void __init build_one_sbus(struct device_node *dp, int num_sbus) sbus->ofdev.node = dp; sbus->ofdev.dev.parent =NULL ; sbus->ofdev.dev.bus = &sbus_bus_type; -sprintf (sbus->ofdev.dev.bus_id,"sbus%d" , num_sbus); +dev_set_name (&sbus->ofdev.dev,"sbus%d" , num_sbus);if (of_device_register (&sbus->ofdev) !=0 )printk (KERN_DEBUG "sbus: device registration error for %s!\n" , - sbus->ofdev.dev.bus_id); +dev_name (&sbus->ofdev.dev)); dev_dp = dp->child;while (dev_dp) {
Signature · 1 line
1.5.6.3
PATCH 79/79 arm: bus_id -> dev_name() and dev_set_name() conversions
In reply to Greg KHFrom: Kay Sievers <[email protected]>
--- arch/arm/common/locomo.c | 2 +- arch/arm/common/sa1111.c | 7 +++---- arch/arm/common/scoop.c | 2 +- arch/arm/kernel/ecard.c | 2 +- arch/arm/mach-integrator/impd1.c | 4 +--- arch/arm/mach-integrator/lm.c | 6 ++++-- arch/arm/plat-omap/mailbox.c | 2 +- drivers/net/arm/at91_ether.c | 2 +- drivers/net/arm/ep93xx_eth.c | 2 +- drivers/net/arm/etherh.c | 6 +++--- 10 files changed, 17 insertions(+), 18 deletions(-)
arch/arm/common/locomo.c +1 -1
@@ -543,7 +543,6 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) goto out; } -strncpy (dev->dev.bus_id, info->name,sizeof (dev->dev.bus_id));/* * If the parent device has a DMA mask associated with it, * propagate it down to the children.
@@ -553,6 +552,7 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) dev->dev.dma_mask = &dev->dma_mask; } +dev_set_name (&dev->dev,"%s" , info->name); dev->devid = info->devid; dev->dev.parent = lchip->dev; dev->dev.bus = &locomo_bus_type;
arch/arm/common/sa1111.c +3 -4
@@ -550,9 +550,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, goto out; } -snprintf (dev->dev.bus_id,sizeof (dev->dev.bus_id), -"%4.4lx" , info->offset); - +dev_set_name (&dev->dev,"%4.4lx" , info->offset); dev->devid = info->devid; dev->dev.parent = sachip->dev; dev->dev.bus = &sa1111_bus_type;
@@ -560,7 +558,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask; dev->res.start = sachip->phys + info->offset; dev->res.end = dev->res.start +511 ; - dev->res.name = dev->dev.bus_id; + dev->res.name =dev_name (&dev->dev); dev->res.flags =IORESOURCE_MEM ; dev->mapbase = sachip->base + info->offset; dev->skpcr_mask = info->skpcr_mask;
@@ -570,6 +568,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,if (ret) {printk ("SA1111: failed to allocate resource for %s\n" , dev->res.name); +dev_set_name (&dev->dev,NULL );kfree (dev); goto out; }
arch/arm/common/scoop.c +1 -1
@@ -247,7 +247,7 @@ static int __devinit scoop_probe(struct platform_device *pdev) devptr->gpio.base =-1 ;if (inf->gpio_base !=0 ) { - devptr->gpio.label = pdev->dev.bus_id; + devptr->gpio.label =dev_name (&pdev->dev); devptr->gpio.base = inf->gpio_base; devptr->gpio.ngpio =12 ;/* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */ devptr->gpio.set = scoop_gpio_set;
arch/arm/kernel/ecard.c +1 -1
@@ -783,7 +783,7 @@ static void ecard_proc_init(void)#define ec_set_resource (ec,nr,st,sz) \ do { \ - (ec)->resource[nr].name = ec->dev.bus_id; \ + (ec)->resource[nr].name = dev_name(&ec->dev); \ (ec)->resource[nr].start = st; \ (ec)->resource[nr].end = (st) + (sz) - 1; \ (ec)->resource[nr].flags = IORESOURCE_MEM; \
arch/arm/mach-integrator/impd1.c +1 -3
@@ -393,9 +393,7 @@ static int impd1_probe(struct lm_device *dev)if (!d)continue ; -snprintf (d->dev.bus_id,sizeof (d->dev.bus_id), -"lm%x:%5.5lx" , dev->id, idev->offset >>12 ); - +dev_set_name (&d->dev,"lm%x:%5.5lx" , dev->id, idev->offset >>12 ); d->dev.parent = &dev->dev; d->res.start = dev->resource.start + idev->offset; d->res.end = d->res.start +SZ_4K -1 ;
arch/arm/mach-integrator/lm.c +4 -2
@@ -81,8 +81,10 @@ int lm_device_register(struct lm_device *dev) dev->dev.release = lm_device_release; dev->dev.bus = &lm_bustype; -snprintf (dev->dev.bus_id,sizeof (dev->dev.bus_id),"lm%d" , dev->id); - dev->resource.name = dev->dev.bus_id; + ret =dev_set_name (&dev->dev,"lm%d" , dev->id); +if (ret) +return ret; + dev->resource.name =dev_name (&dev->dev); ret =request_resource (&iomem_resource, &dev->resource);if (ret ==0 ) {
arch/arm/plat-omap/mailbox.c +1 -1
@@ -334,7 +334,7 @@ static int omap_mbox_init(struct omap_mbox *mbox) } mbox->dev.class = &omap_mbox_class; -strlcpy (mbox->dev.bus_id, mbox->name,BUS_ID_SIZE ); +dev_set_name (&mbox->dev,"%s" , mbox->name);dev_set_drvdata (&mbox->dev, mbox); ret =device_register (&mbox->dev);
drivers/net/arm/at91_ether.c +1 -1
@@ -677,7 +677,7 @@ static void at91ether_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo {strlcpy (info->driver,DRV_NAME ,sizeof (info->driver));strlcpy (info->version,DRV_VERSION ,sizeof (info->version)); -strlcpy (info->bus_info, dev->dev.parent->bus_id,sizeof (info->bus_info)); +strlcpy (info->bus_info,dev_name (dev->dev.parent),sizeof (info->bus_info)); }static const struct ethtool_ops at91ether_ethtool_ops = {
drivers/net/arm/ep93xx_eth.c +1 -1
@@ -848,7 +848,7 @@ static int ep93xx_eth_probe(struct platform_device *pdev) ep->res =request_mem_region (pdev->resource[0 ].start, pdev->resource[0 ].end - pdev->resource[0 ].start +1 , - pdev->dev.bus_id); +dev_name (&pdev->dev));if (ep->res ==NULL ) {dev_err (&pdev->dev,"Could not reserve memory region\n" ); err = -ENOMEM ;
drivers/net/arm/etherh.c +3 -3
@@ -535,7 +535,7 @@ static int __init etherh_addr(char *addr, struct expansion_card *ec)if (!ecard_readchunk (&cd, ec,0xf5 ,0 )) {printk (KERN_ERR "%s: unable to read podule description string\n" , - ec->dev.bus_id); +dev_name (&ec->dev)); goto no_addr; }
@@ -554,7 +554,7 @@ static int __init etherh_addr(char *addr, struct expansion_card *ec) }printk (KERN_ERR "%s: unable to parse MAC address: %s\n" , - ec->dev.bus_id, cd.d.string); +dev_name (&ec->dev), cd.d.string); no_addr:return -ENODEV ;
@@ -585,7 +585,7 @@ static void etherh_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *i {strlcpy (info->driver,DRV_NAME ,sizeof (info->driver));strlcpy (info->version,DRV_VERSION ,sizeof (info->version)); -strlcpy (info->bus_info, dev->dev.parent->bus_id, +strlcpy (info->bus_info,dev_name (dev->dev.parent),sizeof (info->bus_info)); }
Signature · 1 line
1.5.6.3