Browse Source

Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core-2.6: (79 commits)
  arm: bus_id -> dev_name() and dev_set_name() conversions
  sparc64: fix up bus_id changes in sparc core code
  3c59x: handle pci_name() being const
  MTD: handle pci_name() being const
  HP iLO driver
  sysdev: Convert the x86 mce tolerant sysdev attribute to generic attribute
  sysdev: Add utility functions for simple int/ulong variable sysdev attributes
  sysdev: Pass the attribute to the low level sysdev show/store function
  driver core: Suppress sysfs warnings for device_rename().
  kobject: Transmit return value of call_usermodehelper() to caller
  sysfs-rules.txt: reword API stability statement
  debugfs: Implement debugfs_remove_recursive()
  HOWTO: change email addresses of James in HOWTO
  always enable FW_LOADER unless EMBEDDED=y
  uio-howto.tmpl: use unique output names
  uio-howto.tmpl: use standard copyright/legal markings
  sysfs: don't call notify_change
  sysdev: fix debugging statements in registration code.
  kobject: should use kobject_put() in kset-example
  kobject: reorder kobject to save space on 64 bit builds
  ...
Linus Torvalds 17 years ago
parent
commit
53baaaa968
100 changed files with 959 additions and 574 deletions
  1. 20 0
      Documentation/ABI/testing/sysfs-dev
  2. 51 12
      Documentation/DocBook/uio-howto.tmpl
  3. 1 1
      Documentation/HOWTO
  4. 6 0
      Documentation/filesystems/sysfs.txt
  5. 2 3
      Documentation/sysfs-rules.txt
  6. 9 13
      arch/arm/common/dmabounce.c
  7. 1 1
      arch/arm/common/locomo.c
  8. 5 5
      arch/arm/common/sa1111.c
  9. 1 1
      arch/arm/common/scoop.c
  10. 2 3
      arch/arm/kernel/ecard.c
  11. 3 1
      arch/arm/kernel/time.c
  12. 2 5
      arch/arm/mach-integrator/impd1.c
  13. 4 2
      arch/arm/mach-integrator/lm.c
  14. 1 1
      arch/arm/plat-omap/mailbox.c
  15. 25 13
      arch/avr32/kernel/cpu.c
  16. 15 7
      arch/ia64/kernel/err_inject.c
  17. 2 2
      arch/mips/kernel/rtlx.c
  18. 2 1
      arch/mips/sibyte/common/sb_tbprof.c
  19. 11 4
      arch/powerpc/kernel/sysfs.c
  20. 30 15
      arch/powerpc/platforms/cell/cbe_thermal.c
  21. 2 1
      arch/powerpc/platforms/cell/spu_base.c
  22. 1 1
      arch/powerpc/platforms/chrp/pci.c
  23. 24 12
      arch/s390/kernel/smp.c
  24. 24 11
      arch/s390/kernel/time.c
  25. 11 4
      arch/sh/drivers/dma/dma-sysfs.c
  26. 2 2
      arch/sparc64/kernel/ebus.c
  27. 2 2
      arch/sparc64/kernel/of_device.c
  28. 1 1
      arch/sparc64/kernel/pci.c
  29. 11 5
      arch/sparc64/kernel/sysfs.c
  30. 8 10
      arch/sparc64/kernel/vio.c
  31. 12 6
      arch/x86/kernel/cpu/mcheck/mce_64.c
  32. 1 0
      arch/x86/kernel/cpu/mcheck/therm_throt.c
  33. 2 2
      arch/x86/kernel/cpuid.c
  34. 7 3
      arch/x86/kernel/microcode.c
  35. 2 2
      arch/x86/kernel/msr.c
  36. 2 4
      arch/x86/kernel/pci-dma.c
  37. 1 3
      arch/x86/kernel/pci-gart_64.c
  38. 2 1
      block/bsg.c
  39. 119 86
      block/genhd.c
  40. 5 5
      drivers/acpi/fan.c
  41. 2 4
      drivers/acpi/glue.c
  42. 2 3
      drivers/acpi/processor_core.c
  43. 1 1
      drivers/acpi/scan.c
  44. 2 2
      drivers/acpi/thermal.c
  45. 2 3
      drivers/acpi/video.c
  46. 2 1
      drivers/base/Kconfig
  47. 27 0
      drivers/base/base.h
  48. 89 64
      drivers/base/class.c
  49. 124 72
      drivers/base/core.c
  50. 6 4
      drivers/base/cpu.c
  51. 8 4
      drivers/base/memory.c
  52. 10 5
      drivers/base/node.c
  53. 1 1
      drivers/base/power/trace.c
  54. 59 5
      drivers/base/sys.c
  55. 12 5
      drivers/base/topology.c
  56. 3 2
      drivers/block/aoe/aoechr.c
  57. 3 2
      drivers/block/paride/pg.c
  58. 6 4
      drivers/block/paride/pt.c
  59. 3 1
      drivers/block/pktcdvd.c
  60. 2 1
      drivers/char/dsp56k.c
  61. 6 6
      drivers/char/ip2/ip2main.c
  62. 1 1
      drivers/char/ipmi/ipmi_devintf.c
  63. 3 2
      drivers/char/istallion.c
  64. 2 1
      drivers/char/lp.c
  65. 3 3
      drivers/char/mem.c
  66. 2 2
      drivers/char/misc.c
  67. 1 1
      drivers/char/pcmcia/cm4000_cs.c
  68. 2 1
      drivers/char/pcmcia/cm4040_cs.c
  69. 3 2
      drivers/char/ppdev.c
  70. 4 3
      drivers/char/raw.c
  71. 2 1
      drivers/char/snsc.c
  72. 2 2
      drivers/char/stallion.c
  73. 7 5
      drivers/char/tty_io.c
  74. 6 6
      drivers/char/vc_screen.c
  75. 4 4
      drivers/char/viotape.c
  76. 8 6
      drivers/char/vt.c
  77. 3 2
      drivers/char/xilinx_hwicap/xilinx_hwicap.c
  78. 7 3
      drivers/cpuidle/sysfs.c
  79. 5 3
      drivers/dca/dca-sysfs.c
  80. 1 1
      drivers/eisa/Makefile
  81. 2 2
      drivers/eisa/eisa-bus.c
  82. 3 2
      drivers/hid/hidraw.c
  83. 2 1
      drivers/hwmon/hwmon.c
  84. 4 2
      drivers/i2c/i2c-core.c
  85. 3 3
      drivers/i2c/i2c-dev.c
  86. 6 4
      drivers/ide/ide-tape.c
  87. 4 3
      drivers/ieee1394/dv1394.c
  88. 15 8
      drivers/ieee1394/nodemgr.c
  89. 2 2
      drivers/ieee1394/raw1394.c
  90. 3 3
      drivers/ieee1394/video1394.c
  91. 31 41
      drivers/infiniband/core/cm.c
  92. 1 1
      drivers/infiniband/hw/ipath/ipath_file_ops.c
  93. 2 1
      drivers/isdn/capi/capi.c
  94. 2 1
      drivers/macintosh/adb.c
  95. 1 1
      drivers/mca/mca-bus.c
  96. 2 2
      drivers/media/dvb/dvb-core/dvbdev.c
  97. 2 2
      drivers/memstick/host/jmb38x_ms.c
  98. 2 1
      drivers/message/fusion/mptbase.c
  99. 2 2
      drivers/message/fusion/mptbase.h
  100. 2 2
      drivers/message/fusion/mptfc.c

+ 20 - 0
Documentation/ABI/testing/sysfs-dev

@@ -0,0 +1,20 @@
+What:		/sys/dev
+Date:		April 2008
+KernelVersion:	2.6.26
+Contact:	Dan Williams <dan.j.williams@intel.com>
+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 <linux-raid@vger.kernel.org>

+ 51 - 12
Documentation/DocBook/uio-howto.tmpl

@@ -21,6 +21,18 @@
     </affiliation>
     </affiliation>
 </author>
 </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>
 <pubdate>2006-12-11</pubdate>
 
 
 <abstract>
 <abstract>
@@ -29,6 +41,12 @@
 </abstract>
 </abstract>
 
 
 <revhistory>
 <revhistory>
+	<revision>
+	<revnumber>0.5</revnumber>
+	<date>2008-05-22</date>
+	<authorinitials>hjk</authorinitials>
+	<revremark>Added description of write() function.</revremark>
+	</revision>
 	<revision>
 	<revision>
 	<revnumber>0.4</revnumber>
 	<revnumber>0.4</revnumber>
 	<date>2007-11-26</date>
 	<date>2007-11-26</date>
@@ -57,20 +75,9 @@
 </bookinfo>
 </bookinfo>
 
 
 <chapter id="aboutthisdoc">
 <chapter id="aboutthisdoc">
-<?dbhtml filename="about.html"?>
+<?dbhtml filename="aboutthis.html"?>
 <title>About this document</title>
 <title>About this document</title>
 
 
-<sect1 id="copyright">
-<?dbhtml filename="copyright.html"?>
-<title>Copyright and License</title>
-<para>
-      Copyright (c) 2006 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">
 <sect1 id="translations">
 <?dbhtml filename="translations.html"?>
 <?dbhtml filename="translations.html"?>
 <title>Translations</title>
 <title>Translations</title>
@@ -189,6 +196,30 @@ interested in translating it, please email me
 	represents the total interrupt count. You can use this number
 	represents the total interrupt count. You can use this number
 	to figure out if you missed some interrupts.
 	to figure out if you missed some interrupts.
 	</para>
 	</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>
 	<para>
 	To handle interrupts properly, your custom kernel module can
 	To handle interrupts properly, your custom kernel module can
@@ -362,6 +393,14 @@ device is actually used.
 <function>open()</function>, you will probably also want a custom
 <function>open()</function>, you will probably also want a custom
 <function>release()</function> function.
 <function>release()</function> function.
 </para></listitem>
 </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>
 </itemizedlist>
 
 
 <para>
 <para>

+ 1 - 1
Documentation/HOWTO

@@ -358,7 +358,7 @@ Here is a list of some of the different kernel trees available:
     - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
     - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
 	git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
 	git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
 
 
-    - SCSI, James Bottomley <James.Bottomley@SteelEye.com>
+    - SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
 	git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
 	git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
 
 
     - x86, Ingo Molnar <mingo@elte.hu>
     - x86, Ingo Molnar <mingo@elte.hu>

+ 6 - 0
Documentation/filesystems/sysfs.txt

@@ -248,6 +248,7 @@ The top level sysfs directory looks like:
 block/
 block/
 bus/
 bus/
 class/
 class/
+dev/
 devices/
 devices/
 firmware/
 firmware/
 net/
 net/
@@ -274,6 +275,11 @@ fs/ contains a directory for some filesystems.  Currently each
 filesystem wanting to export attributes must create its own hierarchy
 filesystem wanting to export attributes must create its own hierarchy
 below fs/ (see ./fuse.txt for an example).
 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
 More information can driver-model specific features can be found in
 Documentation/driver-model/. 
 Documentation/driver-model/. 

+ 2 - 3
Documentation/sysfs-rules.txt

@@ -3,9 +3,8 @@ Rules on how to access information in the Linux kernel sysfs
 The kernel-exported sysfs exports internal kernel implementation details
 The kernel-exported sysfs exports internal kernel implementation details
 and depends on internal kernel structures and layout. It is agreed upon
 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
 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
 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
 low-level userspace applications, with a new kernel release, the users

+ 9 - 13
arch/arm/common/dmabounce.c

@@ -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);
 	device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC);
 	if (!device_info) {
 	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;
 		return -ENOMEM;
 	}
 	}
 
 
@@ -594,8 +593,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
 
 
 	dev->archdata.dmabounce = device_info;
 	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;
 	return 0;
 
 
@@ -614,16 +612,15 @@ dmabounce_unregister_dev(struct device *dev)
 	dev->archdata.dmabounce = NULL;
 	dev->archdata.dmabounce = NULL;
 
 
 	if (!device_info) {
 	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;
 		return;
 	}
 	}
 
 
 	if (!list_empty(&device_info->safe_buffers)) {
 	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();
 		BUG();
 	}
 	}
 
 
@@ -639,8 +636,7 @@ dmabounce_unregister_dev(struct device *dev)
 
 
 	kfree(device_info);
 	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");
 }
 }
 
 
 
 

+ 1 - 1
arch/arm/common/locomo.c

@@ -543,7 +543,6 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
 		goto out;
 		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,
 	 * If the parent device has a DMA mask associated with it,
 	 * propagate it down to the children.
 	 * 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->dev.dma_mask = &dev->dma_mask;
 	}
 	}
 
 
+	dev_set_name(&dev->dev, "%s", info->name);
 	dev->devid	 = info->devid;
 	dev->devid	 = info->devid;
 	dev->dev.parent  = lchip->dev;
 	dev->dev.parent  = lchip->dev;
 	dev->dev.bus     = &locomo_bus_type;
 	dev->dev.bus     = &locomo_bus_type;

+ 5 - 5
arch/arm/common/sa1111.c

@@ -550,9 +550,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
 		goto out;
 		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->devid	 = info->devid;
 	dev->dev.parent  = sachip->dev;
 	dev->dev.parent  = sachip->dev;
 	dev->dev.bus     = &sa1111_bus_type;
 	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->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask;
 	dev->res.start   = sachip->phys + info->offset;
 	dev->res.start   = sachip->phys + info->offset;
 	dev->res.end     = dev->res.start + 511;
 	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->res.flags   = IORESOURCE_MEM;
 	dev->mapbase     = sachip->base + info->offset;
 	dev->mapbase     = sachip->base + info->offset;
 	dev->skpcr_mask  = info->skpcr_mask;
 	dev->skpcr_mask  = info->skpcr_mask;
@@ -570,6 +568,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
 	if (ret) {
 	if (ret) {
 		printk("SA1111: failed to allocate resource for %s\n",
 		printk("SA1111: failed to allocate resource for %s\n",
 			dev->res.name);
 			dev->res.name);
+		dev_set_name(&dev->dev, NULL);
 		kfree(dev);
 		kfree(dev);
 		goto out;
 		goto out;
 	}
 	}
@@ -593,7 +592,8 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
 		if (dev->dma_mask != 0xffffffffUL) {
 		if (dev->dma_mask != 0xffffffffUL) {
 			ret = dmabounce_register_dev(&dev->dev, 1024, 4096);
 			ret = dmabounce_register_dev(&dev->dev, 1024, 4096);
 			if (ret) {
 			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);
 				device_unregister(&dev->dev);
 			}
 			}
 		}
 		}

+ 1 - 1
arch/arm/common/scoop.c

@@ -247,7 +247,7 @@ static int __devinit scoop_probe(struct platform_device *pdev)
 	devptr->gpio.base = -1;
 	devptr->gpio.base = -1;
 
 
 	if (inf->gpio_base != 0) {
 	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.base = inf->gpio_base;
 		devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */
 		devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */
 		devptr->gpio.set = scoop_gpio_set;
 		devptr->gpio.set = scoop_gpio_set;

+ 2 - 3
arch/arm/kernel/ecard.c

@@ -783,7 +783,7 @@ static void ecard_proc_init(void)
 
 
 #define ec_set_resource(ec,nr,st,sz)				\
 #define ec_set_resource(ec,nr,st,sz)				\
 	do {							\
 	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].start = st;			\
 		(ec)->resource[nr].end = (st) + (sz) - 1;	\
 		(ec)->resource[nr].end = (st) + (sz) - 1;	\
 		(ec)->resource[nr].flags = IORESOURCE_MEM;	\
 		(ec)->resource[nr].flags = IORESOURCE_MEM;	\
@@ -853,8 +853,7 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot)
 	for (i = 0; i < ECARD_NUM_RESOURCES; i++) {
 	for (i = 0; i < ECARD_NUM_RESOURCES; i++) {
 		if (ec->resource[i].flags &&
 		if (ec->resource[i].flags &&
 		    request_resource(&iomem_resource, &ec->resource[i])) {
 		    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].end -= ec->resource[i].start;
 			ec->resource[i].start = 0;
 			ec->resource[i].start = 0;
 			ec->resource[i].flags = 0;
 			ec->resource[i].flags = 0;

+ 3 - 1
arch/arm/kernel/time.c

@@ -130,7 +130,9 @@ static const struct leds_evt_name evt_names[] = {
 	{ "red",   led_red_on,   led_red_off   },
 	{ "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, " ");
 	int ret = -EINVAL, len = strcspn(buf, " ");
 
 

+ 2 - 5
arch/arm/mach-integrator/impd1.c

@@ -393,9 +393,7 @@ static int impd1_probe(struct lm_device *dev)
 		if (!d)
 		if (!d)
 			continue;
 			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->dev.parent	= &dev->dev;
 		d->res.start	= dev->resource.start + idev->offset;
 		d->res.start	= dev->resource.start + idev->offset;
 		d->res.end	= d->res.start + SZ_4K - 1;
 		d->res.end	= d->res.start + SZ_4K - 1;
@@ -407,8 +405,7 @@ static int impd1_probe(struct lm_device *dev)
 
 
 		ret = amba_device_register(d, &dev->resource);
 		ret = amba_device_register(d, &dev->resource);
 		if (ret) {
 		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);
 			kfree(d);
 		}
 		}
 	}
 	}

+ 4 - 2
arch/arm/mach-integrator/lm.c

@@ -81,8 +81,10 @@ int lm_device_register(struct lm_device *dev)
 	dev->dev.release = lm_device_release;
 	dev->dev.release = lm_device_release;
 	dev->dev.bus = &lm_bustype;
 	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);
 	ret = request_resource(&iomem_resource, &dev->resource);
 	if (ret == 0) {
 	if (ret == 0) {

+ 1 - 1
arch/arm/plat-omap/mailbox.c

@@ -334,7 +334,7 @@ static int omap_mbox_init(struct omap_mbox *mbox)
 	}
 	}
 
 
 	mbox->dev.class = &omap_mbox_class;
 	mbox->dev.class = &omap_mbox_class;
-	strlcpy(mbox->dev.bus_id, mbox->name, KOBJ_NAME_LEN);
+	dev_set_name(&mbox->dev, "%s", mbox->name);
 	dev_set_drvdata(&mbox->dev, mbox);
 	dev_set_drvdata(&mbox->dev, mbox);
 
 
 	ret = device_register(&mbox->dev);
 	ret = device_register(&mbox->dev);

+ 25 - 13
arch/avr32/kernel/cpu.c

@@ -26,14 +26,16 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);
  * XXX: If/when a SMP-capable implementation of AVR32 will ever be
  * 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.
  * 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;
 	unsigned long pccr;
 
 
 	pccr = sysreg_read(PCCR);
 	pccr = sysreg_read(PCCR);
 	return sprintf(buf, "0x%lx\n", (pccr >> 12) & 0x3f);
 	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)
 			      size_t count)
 {
 {
 	unsigned long val;
 	unsigned long val;
@@ -46,15 +48,17 @@ static ssize_t store_pc0event(struct sys_device *dev, const char *buf,
 	sysreg_write(PCCR, val);
 	sysreg_write(PCCR, val);
 	return count;
 	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;
 	unsigned long pcnt0;
 
 
 	pcnt0 = sysreg_read(PCNT0);
 	pcnt0 = sysreg_read(PCNT0);
 	return sprintf(buf, "%lu\n", 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;
 	unsigned long val;
 	char *endp;
 	char *endp;
@@ -67,14 +71,16 @@ static ssize_t store_pc0count(struct sys_device *dev, const char *buf,
 	return count;
 	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;
 	unsigned long pccr;
 
 
 	pccr = sysreg_read(PCCR);
 	pccr = sysreg_read(PCCR);
 	return sprintf(buf, "0x%lx\n", (pccr >> 18) & 0x3f);
 	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)
 			      size_t count)
 {
 {
 	unsigned long val;
 	unsigned long val;
@@ -87,14 +93,16 @@ static ssize_t store_pc1event(struct sys_device *dev, const char *buf,
 	sysreg_write(PCCR, val);
 	sysreg_write(PCCR, val);
 	return count;
 	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;
 	unsigned long pcnt1;
 
 
 	pcnt1 = sysreg_read(PCNT1);
 	pcnt1 = sysreg_read(PCNT1);
 	return sprintf(buf, "%lu\n", 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)
 			      size_t count)
 {
 {
 	unsigned long val;
 	unsigned long val;
@@ -108,14 +116,16 @@ static ssize_t store_pc1count(struct sys_device *dev, const char *buf,
 	return count;
 	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;
 	unsigned long pccnt;
 
 
 	pccnt = sysreg_read(PCCNT);
 	pccnt = sysreg_read(PCCNT);
 	return sprintf(buf, "%lu\n", 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)
 			      size_t count)
 {
 {
 	unsigned long val;
 	unsigned long val;
@@ -129,14 +139,16 @@ static ssize_t store_pccycles(struct sys_device *dev, const char *buf,
 	return count;
 	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;
 	unsigned long pccr;
 
 
 	pccr = sysreg_read(PCCR);
 	pccr = sysreg_read(PCCR);
 	return sprintf(buf, "%c\n", (pccr & 1)?'1':'0');
 	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)
 			      size_t count)
 {
 {
 	unsigned long pccr, val;
 	unsigned long pccr, val;

+ 15 - 7
arch/ia64/kernel/err_inject.c

@@ -55,7 +55,8 @@ static u64 resources[NR_CPUS];
 
 
 #define show(name) 							\
 #define show(name) 							\
 static ssize_t 								\
 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;						\
 	u32 cpu=dev->id;						\
 	return sprintf(buf, "%lx\n", name[cpu]);			\
 	return sprintf(buf, "%lx\n", name[cpu]);			\
@@ -63,7 +64,8 @@ show_##name(struct sys_device *dev, char *buf)				\
 
 
 #define store(name)							\
 #define store(name)							\
 static ssize_t 								\
 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;					\
 	unsigned int cpu=dev->id;					\
 	name[cpu] = simple_strtoull(buf, NULL, 16);			\
 	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.
  * processor. The cpu number in driver is only used for storing data.
  */
  */
 static ssize_t
 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 int cpu=dev->id;
 	unsigned long call_start = simple_strtoull(buf, NULL, 16);
 	unsigned long call_start = simple_strtoull(buf, NULL, 16);
@@ -124,14 +127,16 @@ show(err_type_info)
 store(err_type_info)
 store(err_type_info)
 
 
 static ssize_t
 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;
 	unsigned int cpu=dev->id;
 	return sprintf(buf, "%lx\n", phys_addr[cpu]);
 	return sprintf(buf, "%lx\n", phys_addr[cpu]);
 }
 }
 
 
 static ssize_t
 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;
 	unsigned int cpu=dev->id;
 	u64 virt_addr=simple_strtoull(buf, NULL, 16);
 	u64 virt_addr=simple_strtoull(buf, NULL, 16);
@@ -154,7 +159,8 @@ show(err_struct_info)
 store(err_struct_info)
 store(err_struct_info)
 
 
 static ssize_t
 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;
 	unsigned int cpu=dev->id;
 
 
@@ -165,7 +171,9 @@ show_err_data_buffer(struct sys_device *dev, char *buf)
 }
 }
 
 
 static ssize_t
 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;
 	unsigned int cpu=dev->id;
 	int ret;
 	int ret;

+ 2 - 2
arch/mips/kernel/rtlx.c

@@ -522,8 +522,8 @@ static int __init rtlx_module_init(void)
 		atomic_set(&channel_wqs[i].in_open, 0);
 		atomic_set(&channel_wqs[i].in_open, 0);
 		mutex_init(&channel_wqs[i].mutex);
 		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)) {
 		if (IS_ERR(dev)) {
 			err = PTR_ERR(dev);
 			err = PTR_ERR(dev);
 			goto out_chrdev;
 			goto out_chrdev;

+ 2 - 1
arch/mips/sibyte/common/sb_tbprof.c

@@ -576,7 +576,8 @@ static int __init sbprof_tb_init(void)
 
 
 	tb_class = tbc;
 	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)) {
 	if (IS_ERR(dev)) {
 		err = PTR_ERR(dev);
 		err = PTR_ERR(dev);
 		goto out_class;
 		goto out_class;

+ 11 - 4
arch/powerpc/kernel/sysfs.c

@@ -28,7 +28,9 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);
 /* Time in microseconds we delay before sleeping in the idle loop */
 /* Time in microseconds we delay before sleeping in the idle loop */
 DEFINE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 };
 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)
 				      size_t count)
 {
 {
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
 	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;
 	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);
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
 
 
@@ -152,14 +156,17 @@ static unsigned long write_##NAME(unsigned long val) \
 	mtspr(ADDRESS, val); \
 	mtspr(ADDRESS, val); \
 	return 0; \
 	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); \
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
 	unsigned long val = run_on_cpu(cpu->sysdev.id, read_##NAME, 0); \
 	unsigned long val = run_on_cpu(cpu->sysdev.id, read_##NAME, 0); \
 	return sprintf(buf, "%lx\n", val); \
 	return sprintf(buf, "%lx\n", val); \
 } \
 } \
 static ssize_t __used \
 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); \
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
 	unsigned long val; \
 	unsigned long val; \

+ 30 - 15
arch/powerpc/platforms/cell/cbe_thermal.c

@@ -97,7 +97,8 @@ static u8 spu_read_register_value(struct sys_device *sysdev, union spe_reg __iom
 	return value.spe[spu->spe_id];
 	return value.spe[spu->spe_id];
 }
 }
 
 
-static ssize_t spu_show_temp(struct sys_device *sysdev, char *buf)
+static ssize_t spu_show_temp(struct sys_device *sysdev, struct sysdev_attribute *attr,
+			char *buf)
 {
 {
 	u8 value;
 	u8 value;
 	struct cbe_pmd_regs __iomem *pmd_regs;
 	struct cbe_pmd_regs __iomem *pmd_regs;
@@ -146,32 +147,38 @@ static ssize_t store_throttle(struct cbe_pmd_regs __iomem *pmd_regs, const char
 	return size;
 	return size;
 }
 }
 
 
-static ssize_t spu_show_throttle_end(struct sys_device *sysdev, char *buf)
+static ssize_t spu_show_throttle_end(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return show_throttle(get_pmd_regs(sysdev), buf, 0);
 	return show_throttle(get_pmd_regs(sysdev), buf, 0);
 }
 }
 
 
-static ssize_t spu_show_throttle_begin(struct sys_device *sysdev, char *buf)
+static ssize_t spu_show_throttle_begin(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return show_throttle(get_pmd_regs(sysdev), buf, 8);
 	return show_throttle(get_pmd_regs(sysdev), buf, 8);
 }
 }
 
 
-static ssize_t spu_show_throttle_full_stop(struct sys_device *sysdev, char *buf)
+static ssize_t spu_show_throttle_full_stop(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return show_throttle(get_pmd_regs(sysdev), buf, 16);
 	return show_throttle(get_pmd_regs(sysdev), buf, 16);
 }
 }
 
 
-static ssize_t spu_store_throttle_end(struct sys_device *sysdev, const char *buf, size_t size)
+static ssize_t spu_store_throttle_end(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, const char *buf, size_t size)
 {
 {
 	return store_throttle(get_pmd_regs(sysdev), buf, size, 0);
 	return store_throttle(get_pmd_regs(sysdev), buf, size, 0);
 }
 }
 
 
-static ssize_t spu_store_throttle_begin(struct sys_device *sysdev, const char *buf, size_t size)
+static ssize_t spu_store_throttle_begin(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, const char *buf, size_t size)
 {
 {
 	return store_throttle(get_pmd_regs(sysdev), buf, size, 8);
 	return store_throttle(get_pmd_regs(sysdev), buf, size, 8);
 }
 }
 
 
-static ssize_t spu_store_throttle_full_stop(struct sys_device *sysdev, const char *buf, size_t size)
+static ssize_t spu_store_throttle_full_stop(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, const char *buf, size_t size)
 {
 {
 	return store_throttle(get_pmd_regs(sysdev), buf, size, 16);
 	return store_throttle(get_pmd_regs(sysdev), buf, size, 16);
 }
 }
@@ -192,43 +199,51 @@ static ssize_t ppe_show_temp(struct sys_device *sysdev, char *buf, int pos)
 
 
 /* shows the temperature of the DTS on the PPE,
 /* shows the temperature of the DTS on the PPE,
  * located near the linear thermal sensor */
  * located near the linear thermal sensor */
-static ssize_t ppe_show_temp0(struct sys_device *sysdev, char *buf)
+static ssize_t ppe_show_temp0(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return ppe_show_temp(sysdev, buf, 32);
 	return ppe_show_temp(sysdev, buf, 32);
 }
 }
 
 
 /* shows the temperature of the second DTS on the PPE */
 /* shows the temperature of the second DTS on the PPE */
-static ssize_t ppe_show_temp1(struct sys_device *sysdev, char *buf)
+static ssize_t ppe_show_temp1(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return ppe_show_temp(sysdev, buf, 0);
 	return ppe_show_temp(sysdev, buf, 0);
 }
 }
 
 
-static ssize_t ppe_show_throttle_end(struct sys_device *sysdev, char *buf)
+static ssize_t ppe_show_throttle_end(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 32);
 	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 32);
 }
 }
 
 
-static ssize_t ppe_show_throttle_begin(struct sys_device *sysdev, char *buf)
+static ssize_t ppe_show_throttle_begin(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 40);
 	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 40);
 }
 }
 
 
-static ssize_t ppe_show_throttle_full_stop(struct sys_device *sysdev, char *buf)
+static ssize_t ppe_show_throttle_full_stop(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, char *buf)
 {
 {
 	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 48);
 	return show_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, 48);
 }
 }
 
 
-static ssize_t ppe_store_throttle_end(struct sys_device *sysdev, const char *buf, size_t size)
+static ssize_t ppe_store_throttle_end(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, const char *buf, size_t size)
 {
 {
 	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 32);
 	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 32);
 }
 }
 
 
-static ssize_t ppe_store_throttle_begin(struct sys_device *sysdev, const char *buf, size_t size)
+static ssize_t ppe_store_throttle_begin(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, const char *buf, size_t size)
 {
 {
 	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 40);
 	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 40);
 }
 }
 
 
-static ssize_t ppe_store_throttle_full_stop(struct sys_device *sysdev, const char *buf, size_t size)
+static ssize_t ppe_store_throttle_full_stop(struct sys_device *sysdev,
+			struct sysdev_attribute *attr, const char *buf, size_t size)
 {
 {
 	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 48);
 	return store_throttle(cbe_get_cpu_pmd_regs(sysdev->id), buf, size, 48);
 }
 }

+ 2 - 1
arch/powerpc/platforms/cell/spu_base.c

@@ -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);
 	struct spu *spu = container_of(sysdev, struct spu, sysdev);
 
 

+ 1 - 1
arch/powerpc/platforms/chrp/pci.c

@@ -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);
 	viaisa = pci_get_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
 	if (!viaisa)
 	if (!viaisa)
 		return;
 		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_read_config_byte(viaide, PCI_CLASS_PROG, &progif);
 	pci_write_config_byte(viaide, PCI_CLASS_PROG, progif & ~0x5);
 	pci_write_config_byte(viaide, PCI_CLASS_PROG, progif & ~0x5);

+ 24 - 12
arch/s390/kernel/smp.c

@@ -864,7 +864,8 @@ int setup_profiling_timer(unsigned int multiplier)
 }
 }
 
 
 #ifdef CONFIG_HOTPLUG_CPU
 #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;
 	ssize_t count;
 
 
@@ -874,8 +875,9 @@ static ssize_t cpu_configure_show(struct sys_device *dev, char *buf)
 	return count;
 	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 cpu = dev->id;
 	int val, rc;
 	int val, rc;
@@ -922,7 +924,8 @@ out:
 static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store);
 static SYSDEV_ATTR(configure, 0644, cpu_configure_show, cpu_configure_store);
 #endif /* CONFIG_HOTPLUG_CPU */
 #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;
 	int cpu = dev->id;
 	ssize_t count;
 	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 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]);
 	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,
 	.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;
 	unsigned int capability;
 	int rc;
 	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 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;
 	struct s390_idle_data *idle;
 	unsigned long long idle_count;
 	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 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;
 	struct s390_idle_data *idle;
 	unsigned long long new_time;
 	unsigned long long new_time;
@@ -1112,7 +1119,9 @@ out:
 	return rc;
 	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)
 				  size_t count)
 {
 {
 	int rc;
 	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);
 static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store);
 #endif /* CONFIG_HOTPLUG_CPU */
 #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;
 	ssize_t count;
 
 
@@ -1133,8 +1144,9 @@ static ssize_t dispatching_show(struct sys_device *dev, char *buf)
 	return count;
 	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;
 	int val, rc;
 	char delim;
 	char delim;

+ 24 - 11
arch/s390/kernel/time.c

@@ -1100,7 +1100,9 @@ static inline struct etr_aib *etr_aib_from_dev(struct sys_device *dev)
 		return etr_port1_online ? &etr_port1 : NULL;
 		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;
 	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,
 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;
 	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 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) ?
 	return sprintf(buf, "%i\n", (dev == &etr_port0_dev) ?
 		       etr_eacr.e0 : etr_eacr.e1);
 		       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 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)
 	if (!etr_port0_online && !etr_port1_online)
 		/* Status word is not uptodate if both ports are offline. */
 		/* 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 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);
 	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 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);
 	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 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);
 	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 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);
 	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 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);
 	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 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);
 	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 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);
 	struct etr_aib *aib = etr_aib_from_dev(dev);
 
 

+ 11 - 4
arch/sh/drivers/dma/dma-sysfs.c

@@ -23,7 +23,8 @@ static struct sysdev_class dma_sysclass = {
 };
 };
 EXPORT_SYMBOL(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;
 	ssize_t len = 0;
 	int i;
 	int i;
@@ -57,13 +58,15 @@ static int __init dma_sysclass_init(void)
 }
 }
 postcore_initcall(dma_sysclass_init);
 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);
 	struct dma_channel *channel = to_dma_channel(dev);
 	return sprintf(buf, "%s\n", channel->dev_id);
 	return sprintf(buf, "%s\n", channel->dev_id);
 }
 }
 
 
 static ssize_t dma_store_dev_id(struct sys_device *dev,
 static ssize_t dma_store_dev_id(struct sys_device *dev,
+				struct sysdev_attribute *attr,
 				const char *buf, size_t count)
 				const char *buf, size_t count)
 {
 {
 	struct dma_channel *channel = to_dma_channel(dev);
 	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 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,
 static ssize_t dma_store_config(struct sys_device *dev,
+				struct sysdev_attribute *attr,
 				const char *buf, size_t count)
 				const char *buf, size_t count)
 {
 {
 	struct dma_channel *channel = to_dma_channel(dev);
 	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 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);
 	struct dma_channel *channel = to_dma_channel(dev);
 	return sprintf(buf, "0x%08x\n", channel->mode);
 	return sprintf(buf, "0x%08x\n", channel->mode);
 }
 }
 
 
 static ssize_t dma_store_mode(struct sys_device *dev,
 static ssize_t dma_store_mode(struct sys_device *dev,
+			      struct sysdev_attribute *attr,
 			      const char *buf, size_t count)
 			      const char *buf, size_t count)
 {
 {
 	struct dma_channel *channel = to_dma_channel(dev);
 	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);
 static SYSDEV_ATTR(mode, S_IRUGO | S_IWUSR, dma_show_mode, dma_store_mode);
 
 
 #define dma_ro_attr(field, fmt)						\
 #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);		\
 	struct dma_channel *channel = to_dma_channel(dev);		\
 	return sprintf(buf, fmt, channel->field);			\
 	return sprintf(buf, fmt, channel->field);			\

+ 2 - 2
arch/sparc64/kernel/ebus.c

@@ -401,7 +401,7 @@ static void __init fill_ebus_device(struct device_node *dp, struct linux_ebus_de
 	dev->ofdev.node = dp;
 	dev->ofdev.node = dp;
 	dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
 	dev->ofdev.dev.parent = &dev->bus->ofdev.dev;
 	dev->ofdev.dev.bus = &ebus_bus_type;
 	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 */
 	/* Register with core */
 	if (of_device_register(&dev->ofdev) != 0)
 	if (of_device_register(&dev->ofdev) != 0)
@@ -501,7 +501,7 @@ void __init ebus_init(void)
 		ebus->ofdev.node = dp;
 		ebus->ofdev.node = dp;
 		ebus->ofdev.dev.parent = &pdev->dev;
 		ebus->ofdev.dev.parent = &pdev->dev;
 		ebus->ofdev.dev.bus = &ebus_bus_type;
 		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 */
 		/* Register with core */
 		if (of_device_register(&ebus->ofdev) != 0)
 		if (of_device_register(&ebus->ofdev) != 0)

+ 2 - 2
arch/sparc64/kernel/of_device.c

@@ -797,9 +797,9 @@ static struct of_device * __init scan_one_device(struct device_node *dp,
 	op->dev.parent = parent;
 	op->dev.parent = parent;
 	op->dev.bus = &of_platform_bus_type;
 	op->dev.bus = &of_platform_bus_type;
 	if (!parent)
 	if (!parent)
-		strcpy(op->dev.bus_id, "root");
+		dev_set_name(&op->dev, "root");
 	else
 	else
-		sprintf(op->dev.bus_id, "%08x", dp->node);
+		dev_set_name(&op->dev, "%08x", dp->node);
 
 
 	if (of_device_register(op)) {
 	if (of_device_register(op)) {
 		printk("%s: Could not register of device.\n",
 		printk("%s: Could not register of device.\n",

+ 1 - 1
arch/sparc64/kernel/pci.c

@@ -408,7 +408,7 @@ struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
 	dev->class = class >> 8;
 	dev->class = class >> 8;
 	dev->revision = class & 0xff;
 	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));
 		dev->bus->number, PCI_SLOT(devfn), PCI_FUNC(devfn));
 
 
 	if (ofpci_verbose)
 	if (ofpci_verbose)

+ 11 - 5
arch/sparc64/kernel/sysfs.c

@@ -14,7 +14,8 @@
 static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64)));
 static DEFINE_PER_CPU(struct hv_mmu_statistics, mmu_stats) __attribute__((aligned(64)));
 
 
 #define SHOW_MMUSTAT_ULONG(NAME) \
 #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); \
 	struct hv_mmu_statistics *p = &per_cpu(mmu_stats, dev->id); \
 	return sprintf(buf, "%lu\n", p->NAME); \
 	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);
 	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);
 	unsigned long val = run_on_cpu(s->id, read_mmustat_enable, 0);
 	return sprintf(buf, "%lx\n", val);
 	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;
 	unsigned long val, err;
 	int ret = sscanf(buf, "%ld", &val);
 	int ret = sscanf(buf, "%ld", &val);
@@ -179,14 +183,16 @@ static void unregister_mmu_stats(struct sys_device *s)
 #endif
 #endif
 
 
 #define SHOW_CPUDATA_ULONG_NAME(NAME, MEMBER) \
 #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); \
 	cpuinfo_sparc *c = &cpu_data(dev->id); \
 	return sprintf(buf, "%lu\n", c->MEMBER); \
 	return sprintf(buf, "%lu\n", c->MEMBER); \
 }
 }
 
 
 #define SHOW_CPUDATA_UINT_NAME(NAME, 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); \
 	cpuinfo_sparc *c = &cpu_data(dev->id); \
 	return sprintf(buf, "%u\n", c->MEMBER); \
 	return sprintf(buf, "%u\n", c->MEMBER); \

+ 8 - 10
arch/sparc64/kernel/vio.c

@@ -224,7 +224,7 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp,
 	if (!strcmp(type, "domain-services-port"))
 	if (!strcmp(type, "domain-services-port"))
 		bus_id_name = "ds";
 		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",
 		printk(KERN_ERR "VIO: bus_id_name [%s] is too long.\n",
 		       bus_id_name);
 		       bus_id_name);
 		return NULL;
 		return NULL;
@@ -260,16 +260,14 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp,
 	vio_fill_channel_info(hp, mp, vdev);
 	vio_fill_channel_info(hp, mp, vdev);
 
 
 	if (!id) {
 	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;
 		vdev->dev_no = ~(u64)0;
 	} else if (!cfg_handle) {
 	} 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;
 		vdev->dev_no = *id;
 	} else {
 	} 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;
 		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;
 	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);
 	err = device_register(&vdev->dev);
 	if (err) {
 	if (err) {
 		printk(KERN_ERR "VIO: Could not register device %s, err=%d\n",
 		printk(KERN_ERR "VIO: Could not register device %s, err=%d\n",
-		       vdev->dev.bus_id, err);
+		       dev_name(&vdev->dev), err);
 		kfree(vdev);
 		kfree(vdev);
 		return NULL;
 		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,
 	dev = device_find_child(&root_vdev->dev, (void *) node,
 				vio_md_node_match);
 				vio_md_node_match);
 	if (dev) {
 	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);
 		device_unregister(dev);
 	}
 	}

+ 12 - 6
arch/x86/kernel/cpu/mcheck/mce_64.c

@@ -762,10 +762,14 @@ DEFINE_PER_CPU(struct sys_device, device_mce);
 
 
 /* Why are there no generic functions for this? */
 /* Why are there no generic functions for this? */
 #define ACCESSOR(name, var, start) \
 #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);	\
 		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;						\
 		char *end;						\
 		unsigned long new = simple_strtoul(buf, &end, 0);	\
 		unsigned long new = simple_strtoul(buf, &end, 0);	\
 		if (end == buf) return -EINVAL;				\
 		if (end == buf) return -EINVAL;				\
@@ -786,14 +790,16 @@ ACCESSOR(bank3ctl,bank[3],mce_restart())
 ACCESSOR(bank4ctl,bank[4],mce_restart())
 ACCESSOR(bank4ctl,bank[4],mce_restart())
 ACCESSOR(bank5ctl,bank[5],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);
 	strcpy(buf, trigger);
 	strcat(buf, "\n");
 	strcat(buf, "\n");
 	return strlen(trigger) + 1;
 	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;
 	char *p;
 	int len;
 	int len;
@@ -806,12 +812,12 @@ static ssize_t set_trigger(struct sys_device *s,const char *buf,size_t siz)
 }
 }
 
 
 static SYSDEV_ATTR(trigger, 0644, show_trigger, set_trigger);
 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())
 ACCESSOR(check_interval,check_interval,mce_restart())
 static struct sysdev_attribute *mce_attributes[] = {
 static struct sysdev_attribute *mce_attributes[] = {
 	&attr_bank0ctl, &attr_bank1ctl, &attr_bank2ctl,
 	&attr_bank0ctl, &attr_bank1ctl, &attr_bank2ctl,
 	&attr_bank3ctl, &attr_bank4ctl, &attr_bank5ctl,
 	&attr_bank3ctl, &attr_bank4ctl, &attr_bank5ctl,
-	&attr_tolerant, &attr_check_interval, &attr_trigger,
+	&attr_tolerant.attr, &attr_check_interval, &attr_trigger,
 	NULL
 	NULL
 };
 };
 
 

+ 1 - 0
arch/x86/kernel/cpu/mcheck/therm_throt.c

@@ -35,6 +35,7 @@ atomic_t therm_throt_en = ATOMIC_INIT(0);
 
 
 #define define_therm_throt_sysdev_show_func(name)                            \
 #define define_therm_throt_sysdev_show_func(name)                            \
 static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev,        \
 static ssize_t therm_throt_sysdev_show_##name(struct sys_device *dev,        \
+					struct sysdev_attribute *attr,	     \
                                               char *buf)                     \
                                               char *buf)                     \
 {                                                                            \
 {                                                                            \
 	unsigned int cpu = dev->id;                                          \
 	unsigned int cpu = dev->id;                                          \

+ 2 - 2
arch/x86/kernel/cpuid.c

@@ -141,8 +141,8 @@ static __cpuinit int cpuid_device_create(int cpu)
 {
 {
 	struct device *dev;
 	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;
 	return IS_ERR(dev) ? PTR_ERR(dev) : 0;
 }
 }
 
 

+ 7 - 3
arch/x86/kernel/microcode.c

@@ -644,7 +644,9 @@ static void microcode_fini_cpu(int cpu)
 	mutex_unlock(&microcode_mutex);
 	mutex_unlock(&microcode_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;
 	struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;
 	char *end;
 	char *end;
@@ -674,14 +676,16 @@ static ssize_t reload_store(struct sys_device *dev, const char *buf, size_t sz)
 	return 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;
 	struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;
 
 
 	return sprintf(buf, "0x%x\n", uci->rev);
 	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;
 	struct ucode_cpu_info *uci = ucode_cpu_info + dev->id;
 
 

+ 2 - 2
arch/x86/kernel/msr.c

@@ -149,8 +149,8 @@ static int __cpuinit msr_device_create(int cpu)
 {
 {
 	struct device *dev;
 	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;
 	return IS_ERR(dev) ? PTR_ERR(dev) : 0;
 }
 }
 
 

+ 2 - 4
arch/x86/kernel/pci-dma.c

@@ -314,8 +314,7 @@ int dma_supported(struct device *dev, u64 mask)
 {
 {
 #ifdef CONFIG_PCI
 #ifdef CONFIG_PCI
 	if (mask > 0xffffffff && forbid_dac > 0) {
 	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;
 		return 0;
 	}
 	}
 #endif
 #endif
@@ -342,8 +341,7 @@ int dma_supported(struct device *dev, u64 mask)
 	   type. Normally this doesn't make any difference, but gives
 	   type. Normally this doesn't make any difference, but gives
 	   more gentle handling of IOMMU overflow. */
 	   more gentle handling of IOMMU overflow. */
 	if (iommu_sac_force && (mask >= DMA_40BIT_MASK)) {
 	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;
 		return 0;
 	}
 	}
 
 

+ 1 - 3
arch/x86/kernel/pci-gart_64.c

@@ -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.
 	 * 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 (size > PAGE_SIZE*EMERGENCY_PAGES) {
 		if (dir == PCI_DMA_FROMDEVICE || dir == PCI_DMA_BIDIRECTIONAL)
 		if (dir == PCI_DMA_FROMDEVICE || dir == PCI_DMA_BIDIRECTIONAL)

+ 2 - 1
block/bsg.c

@@ -1044,7 +1044,8 @@ int bsg_register_queue(struct request_queue *q, struct device *parent,
 	bcd->release = release;
 	bcd->release = release;
 	kref_init(&bcd->ref);
 	kref_init(&bcd->ref);
 	dev = MKDEV(bsg_major, bcd->minor);
 	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)) {
 	if (IS_ERR(class_dev)) {
 		ret = PTR_ERR(class_dev);
 		ret = PTR_ERR(class_dev);
 		goto put_dev;
 		goto put_dev;

+ 119 - 86
block/genhd.c

@@ -183,6 +183,7 @@ static int exact_lock(dev_t devt, void *data)
 void add_disk(struct gendisk *disk)
 void add_disk(struct gendisk *disk)
 {
 {
 	struct backing_dev_info *bdi;
 	struct backing_dev_info *bdi;
+	int retval;
 
 
 	disk->flags |= GENHD_FL_UP;
 	disk->flags |= GENHD_FL_UP;
 	blk_register_region(MKDEV(disk->major, disk->first_minor),
 	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 = &disk->queue->backing_dev_info;
 	bdi_register_dev(bdi, MKDEV(disk->major, disk->first_minor));
 	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);
 EXPORT_SYMBOL(add_disk);
@@ -225,89 +227,111 @@ 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;
 	struct gendisk *sgp;
 	char buf[BDEVNAME_SIZE];
 	char buf[BDEVNAME_SIZE];
 	int n;
 	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);
 	mutex_unlock(&block_class_lock);
 }
 }
 
 
 #ifdef CONFIG_PROC_FS
 #ifdef CONFIG_PROC_FS
 /* iterator */
 /* 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)
 static void *part_start(struct seq_file *part, loff_t *pos)
 {
 {
-	loff_t k = *pos;
 	struct device *dev;
 	struct device *dev;
+	loff_t n = *pos;
+
+	if (!n)
+		seq_puts(part, "major minor  #blocks  name\n\n");
 
 
 	mutex_lock(&block_class_lock);
 	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;
 	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)
 static void *part_next(struct seq_file *part, void *v, loff_t *pos)
 {
 {
 	struct gendisk *gp = v;
 	struct gendisk *gp = v;
 	struct device *dev;
 	struct device *dev;
 	++*pos;
 	++*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;
 	return NULL;
 }
 }
 
 
@@ -322,9 +346,6 @@ static int show_partition(struct seq_file *part, void *v)
 	int n;
 	int n;
 	char buf[BDEVNAME_SIZE];
 	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 */
 	/* Don't show non-partitionable removeable devices or empty devices */
 	if (!get_capacity(sgp) ||
 	if (!get_capacity(sgp) ||
 			(sgp->minors == 1 && (sgp->flags & GENHD_FL_REMOVABLE)))
 			(sgp->minors == 1 && (sgp->flags & GENHD_FL_REMOVABLE)))
@@ -370,7 +391,10 @@ static struct kobject *base_probe(dev_t devt, int *part, void *data)
 
 
 static int __init genhd_device_init(void)
 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))
 	if (unlikely(error))
 		return error;
 		return error;
 	bdev_map = kobj_map_init(base_probe, &block_class_lock);
 	bdev_map = kobj_map_init(base_probe, &block_class_lock);
@@ -532,6 +556,7 @@ static struct device_type disk_type = {
 	.release	= disk_release,
 	.release	= disk_release,
 };
 };
 
 
+#ifdef CONFIG_PROC_FS
 /*
 /*
  * aggregate disk stat collector.  Uses the same stats that the sysfs
  * aggregate disk stat collector.  Uses the same stats that the sysfs
  * entries do, above, but makes them available through one seq_file.
  * entries do, above, but makes them available through one seq_file.
@@ -542,16 +567,12 @@ static struct device_type disk_type = {
 
 
 static void *diskstats_start(struct seq_file *part, loff_t *pos)
 static void *diskstats_start(struct seq_file *part, loff_t *pos)
 {
 {
-	loff_t k = *pos;
 	struct device *dev;
 	struct device *dev;
 
 
 	mutex_lock(&block_class_lock);
 	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;
 	return NULL;
 }
 }
 
 
@@ -561,12 +582,9 @@ static void *diskstats_next(struct seq_file *part, void *v, loff_t *pos)
 	struct device *dev;
 	struct device *dev;
 
 
 	++*pos;
 	++*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;
 	return NULL;
 }
 }
 
 
@@ -641,6 +659,7 @@ const struct seq_operations diskstats_op = {
 	.stop	= diskstats_stop,
 	.stop	= diskstats_stop,
 	.show	= diskstats_show
 	.show	= diskstats_show
 };
 };
+#endif /* CONFIG_PROC_FS */
 
 
 static void media_change_notify_thread(struct work_struct *work)
 static void media_change_notify_thread(struct work_struct *work)
 {
 {
@@ -665,24 +684,38 @@ void genhd_media_change_notify(struct gendisk *disk)
 EXPORT_SYMBOL_GPL(genhd_media_change_notify);
 EXPORT_SYMBOL_GPL(genhd_media_change_notify);
 #endif  /*  0  */
 #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)
 dev_t blk_lookup_devt(const char *name, int part)
 {
 {
 	struct device *dev;
 	struct device *dev;
 	dev_t devt = MKDEV(0, 0);
 	dev_t devt = MKDEV(0, 0);
+	struct find_block find;
 
 
 	mutex_lock(&block_class_lock);
 	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);
 	mutex_unlock(&block_class_lock);
 
 
 	return devt;
 	return devt;

+ 5 - 5
drivers/acpi/fan.c

@@ -263,22 +263,22 @@ static int acpi_fan_add(struct acpi_device *device)
 		goto end;
 		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;
 	acpi_driver_data(device) = cdev;
 	result = sysfs_create_link(&device->dev.kobj,
 	result = sysfs_create_link(&device->dev.kobj,
 				   &cdev->device.kobj,
 				   &cdev->device.kobj,
 				   "thermal_cooling");
 				   "thermal_cooling");
 	if (result)
 	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,
 	result = sysfs_create_link(&cdev->device.kobj,
 				   &device->dev.kobj,
 				   &device->dev.kobj,
 				   "device");
 				   "device");
 	if (result)
 	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);
 	result = acpi_fan_add_fs(device);
 	if (result)
 	if (result)

+ 2 - 4
drivers/acpi/glue.c

@@ -146,8 +146,7 @@ static int acpi_bind_one(struct device *dev, acpi_handle handle)
 	acpi_status status;
 	acpi_status status;
 
 
 	if (dev->archdata.acpi_handle) {
 	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;
 		return -EINVAL;
 	}
 	}
 	get_device(dev);
 	get_device(dev);
@@ -195,8 +194,7 @@ static int acpi_unbind_one(struct device *dev)
 		/* acpi_bind_one increase refcnt by one */
 		/* acpi_bind_one increase refcnt by one */
 		put_device(dev);
 		put_device(dev);
 	} else {
 	} 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;
 	return 0;
 }
 }

+ 2 - 3
drivers/acpi/processor_core.c

@@ -714,9 +714,8 @@ static int __cpuinit acpi_processor_start(struct acpi_device *device)
 		goto end;
 		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,
 	result = sysfs_create_link(&device->dev.kobj,
 				   &pr->cdev->device.kobj,
 				   &pr->cdev->device.kobj,

+ 1 - 1
drivers/acpi/scan.c

@@ -471,7 +471,7 @@ static int acpi_device_register(struct acpi_device *device,
 	device->dev.release = &acpi_device_release;
 	device->dev.release = &acpi_device_release;
 	result = device_add(&device->dev);
 	result = device_add(&device->dev);
 	if(result) {
 	if(result) {
-		printk(KERN_ERR PREFIX "Error adding device %s", device->dev.bus_id);
+		dev_err(&device->dev, "Error adding device\n");
 		goto end;
 		goto end;
 	}
 	}
 
 

+ 2 - 2
drivers/acpi/thermal.c

@@ -1179,8 +1179,8 @@ static int acpi_thermal_register_thermal_zone(struct acpi_thermal *tz)
 
 
 	tz->tz_enabled = 1;
 	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;
 	return 0;
 }
 }
 
 

+ 2 - 3
drivers/acpi/video.c

@@ -762,9 +762,8 @@ static void acpi_video_device_find_cap(struct acpi_video_device *device)
 		if (IS_ERR(device->cdev))
 		if (IS_ERR(device->cdev))
 			return;
 			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,
 		result = sysfs_create_link(&device->dev->dev.kobj,
 				&device->cdev->device.kobj,
 				&device->cdev->device.kobj,
 				"thermal_cooling");
 				"thermal_cooling");

+ 2 - 1
drivers/base/Kconfig

@@ -27,8 +27,9 @@ config PREVENT_FIRMWARE_BUILD
 	  If unsure say Y here.
 	  If unsure say Y here.
 
 
 config FW_LOADER
 config FW_LOADER
-	tristate "Userspace firmware loading support"
+	tristate "Userspace firmware loading support" if EMBEDDED
 	depends on HOTPLUG
 	depends on HOTPLUG
+	default y
 	---help---
 	---help---
 	  This option is provided for the case where no in-kernel-tree modules
 	  This option is provided for the case where no in-kernel-tree modules
 	  require userspace firmware loading support, but a module built outside
 	  require userspace firmware loading support, but a module built outside

+ 27 - 0
drivers/base/base.h

@@ -36,6 +36,33 @@ struct driver_private {
 };
 };
 #define to_driver(obj) container_of(obj, struct driver_private, kobj)
 #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.
+ *
+ * @class_subsys - the struct kset that defines this class.  This is the main kobject
+ * @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_mutex - mutex 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 class_subsys;
+	struct list_head class_devices;
+	struct list_head class_interfaces;
+	struct kset class_dirs;
+	struct mutex class_mutex;
+	struct class *class;
+};
+#define to_class(obj)	\
+	container_of(obj, struct class_private, class_subsys.kobj)
+
 /* initialisation functions */
 /* initialisation functions */
 extern int devices_init(void);
 extern int devices_init(void);
 extern int buses_init(void);
 extern int buses_init(void);

+ 89 - 64
drivers/base/class.c

@@ -18,20 +18,20 @@
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/genhd.h>
 #include <linux/genhd.h>
+#include <linux/mutex.h>
 #include "base.h"
 #include "base.h"
 
 
 #define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr)
 #define to_class_attr(_attr) container_of(_attr, struct class_attribute, attr)
-#define to_class(obj) container_of(obj, struct class, subsys.kobj)
 
 
 static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr,
 static ssize_t class_attr_show(struct kobject *kobj, struct attribute *attr,
 			       char *buf)
 			       char *buf)
 {
 {
 	struct class_attribute *class_attr = to_class_attr(attr);
 	struct class_attribute *class_attr = to_class_attr(attr);
-	struct class *dc = to_class(kobj);
+	struct class_private *cp = to_class(kobj);
 	ssize_t ret = -EIO;
 	ssize_t ret = -EIO;
 
 
 	if (class_attr->show)
 	if (class_attr->show)
-		ret = class_attr->show(dc, buf);
+		ret = class_attr->show(cp->class, buf);
 	return ret;
 	return ret;
 }
 }
 
 
@@ -39,17 +39,18 @@ static ssize_t class_attr_store(struct kobject *kobj, struct attribute *attr,
 				const char *buf, size_t count)
 				const char *buf, size_t count)
 {
 {
 	struct class_attribute *class_attr = to_class_attr(attr);
 	struct class_attribute *class_attr = to_class_attr(attr);
-	struct class *dc = to_class(kobj);
+	struct class_private *cp = to_class(kobj);
 	ssize_t ret = -EIO;
 	ssize_t ret = -EIO;
 
 
 	if (class_attr->store)
 	if (class_attr->store)
-		ret = class_attr->store(dc, buf, count);
+		ret = class_attr->store(cp->class, buf, count);
 	return ret;
 	return ret;
 }
 }
 
 
 static void class_release(struct kobject *kobj)
 static void class_release(struct kobject *kobj)
 {
 {
-	struct class *class = to_class(kobj);
+	struct class_private *cp = to_class(kobj);
+	struct class *class = cp->class;
 
 
 	pr_debug("class '%s': release.\n", class->name);
 	pr_debug("class '%s': release.\n", class->name);
 
 
@@ -70,7 +71,7 @@ static struct kobj_type class_ktype = {
 	.release	= class_release,
 	.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;
 static struct kset *class_kset;
 
 
 
 
@@ -78,7 +79,8 @@ int class_create_file(struct class *cls, const struct class_attribute *attr)
 {
 {
 	int error;
 	int error;
 	if (cls)
 	if (cls)
-		error = sysfs_create_file(&cls->subsys.kobj, &attr->attr);
+		error = sysfs_create_file(&cls->p->class_subsys.kobj,
+					  &attr->attr);
 	else
 	else
 		error = -EINVAL;
 		error = -EINVAL;
 	return error;
 	return error;
@@ -87,21 +89,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)
 void class_remove_file(struct class *cls, const struct class_attribute *attr)
 {
 {
 	if (cls)
 	if (cls)
-		sysfs_remove_file(&cls->subsys.kobj, &attr->attr);
+		sysfs_remove_file(&cls->p->class_subsys.kobj, &attr->attr);
 }
 }
 
 
 static struct class *class_get(struct class *cls)
 static struct class *class_get(struct class *cls)
 {
 {
 	if (cls)
 	if (cls)
-		return container_of(kset_get(&cls->subsys),
-				    struct class, subsys);
-	return NULL;
+		kset_get(&cls->p->class_subsys);
+	return cls;
 }
 }
 
 
 static void class_put(struct class *cls)
 static void class_put(struct class *cls)
 {
 {
 	if (cls)
 	if (cls)
-		kset_put(&cls->subsys);
+		kset_put(&cls->p->class_subsys);
 }
 }
 
 
 static int add_class_attrs(struct class *cls)
 static int add_class_attrs(struct class *cls)
@@ -134,42 +135,57 @@ 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;
 	int error;
 
 
 	pr_debug("device class '%s': registering\n", cls->name);
 	pr_debug("device class '%s': registering\n", cls->name);
 
 
-	INIT_LIST_HEAD(&cls->devices);
-	INIT_LIST_HEAD(&cls->interfaces);
-	kset_init(&cls->class_dirs);
-	init_MUTEX(&cls->sem);
-	error = kobject_set_name(&cls->subsys.kobj, "%s", cls->name);
-	if (error)
+	cp = kzalloc(sizeof(*cp), GFP_KERNEL);
+	if (!cp)
+		return -ENOMEM;
+	INIT_LIST_HEAD(&cp->class_devices);
+	INIT_LIST_HEAD(&cp->class_interfaces);
+	kset_init(&cp->class_dirs);
+	__mutex_init(&cp->class_mutex, "struct class mutex", key);
+	error = kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name);
+	if (error) {
+		kfree(cp);
 		return 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)
 #if defined(CONFIG_SYSFS_DEPRECATED) && defined(CONFIG_BLOCK)
 	/* let the block class directory show up in the root of sysfs */
 	/* let the block class directory show up in the root of sysfs */
 	if (cls != &block_class)
 	if (cls != &block_class)
-		cls->subsys.kobj.kset = class_kset;
+		cp->class_subsys.kobj.kset = class_kset;
 #else
 #else
-	cls->subsys.kobj.kset = class_kset;
+	cp->class_subsys.kobj.kset = class_kset;
 #endif
 #endif
-	cls->subsys.kobj.ktype = &class_ktype;
+	cp->class_subsys.kobj.ktype = &class_ktype;
+	cp->class = cls;
+	cls->p = cp;
 
 
-	error = kset_register(&cls->subsys);
-	if (!error) {
-		error = add_class_attrs(class_get(cls));
-		class_put(cls);
+	error = kset_register(&cp->class_subsys);
+	if (error) {
+		kfree(cp);
+		return error;
 	}
 	}
+	error = add_class_attrs(class_get(cls));
+	class_put(cls);
 	return error;
 	return error;
 }
 }
+EXPORT_SYMBOL_GPL(__class_register);
 
 
 void class_unregister(struct class *cls)
 void class_unregister(struct class *cls)
 {
 {
 	pr_debug("device class '%s': unregistering\n", cls->name);
 	pr_debug("device class '%s': unregistering\n", cls->name);
 	remove_class_attrs(cls);
 	remove_class_attrs(cls);
-	kset_unregister(&cls->subsys);
+	kset_unregister(&cls->p->class_subsys);
 }
 }
 
 
 static void class_create_release(struct class *cls)
 static void class_create_release(struct class *cls)
@@ -189,7 +205,8 @@ static void class_create_release(struct class *cls)
  * Note, the pointer created here is to be destroyed when finished by
  * Note, the pointer created here is to be destroyed when finished by
  * making a call to class_destroy().
  * 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;
 	struct class *cls;
 	int retval;
 	int retval;
@@ -204,7 +221,7 @@ struct class *class_create(struct module *owner, const char *name)
 	cls->owner = owner;
 	cls->owner = owner;
 	cls->class_release = class_create_release;
 	cls->class_release = class_create_release;
 
 
-	retval = class_register(cls);
+	retval = __class_register(cls, key);
 	if (retval)
 	if (retval)
 		goto error;
 		goto error;
 
 
@@ -214,6 +231,7 @@ error:
 	kfree(cls);
 	kfree(cls);
 	return ERR_PTR(retval);
 	return ERR_PTR(retval);
 }
 }
+EXPORT_SYMBOL_GPL(__class_create);
 
 
 /**
 /**
  * class_destroy - destroys a struct class structure
  * class_destroy - destroys a struct class structure
@@ -252,39 +270,44 @@ char *make_class_name(const char *name, struct kobject *kobj)
 /**
 /**
  * class_for_each_device - device iterator
  * class_for_each_device - device iterator
  * @class: the class we're iterating
  * @class: the class we're iterating
+ * @start: the device to start with in the list, if any.
  * @data: data for the callback
  * @data: data for the callback
  * @fn: function to be called for each device
  * @fn: function to be called for each device
  *
  *
  * Iterate over @class's list of devices, and call @fn for each,
  * 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
  * We check the return of @fn each time. If it returns anything
  * other than 0, we break out and return that value.
  * 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_mutex in this function, so it can not be
  * re-acquired in @fn, otherwise it will self-deadlocking. For
  * re-acquired in @fn, otherwise it will self-deadlocking. For
  * example, calls to add or remove class members would be verboten.
  * 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;
 	struct device *dev;
 	int error = 0;
 	int error = 0;
 
 
 	if (!class)
 	if (!class)
 		return -EINVAL;
 		return -EINVAL;
-	down(&class->sem);
-	list_for_each_entry(dev, &class->devices, node) {
+	mutex_lock(&class->p->class_mutex);
+	list_for_each_entry(dev, &class->p->class_devices, node) {
+		if (start) {
+			if (start == dev)
+				start = NULL;
+			continue;
+		}
 		dev = get_device(dev);
 		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)
 		if (error)
 			break;
 			break;
 	}
 	}
-	up(&class->sem);
+	mutex_unlock(&class->p->class_mutex);
 
 
 	return error;
 	return error;
 }
 }
@@ -293,6 +316,7 @@ EXPORT_SYMBOL_GPL(class_for_each_device);
 /**
 /**
  * class_find_device - device iterator for locating a particular device
  * class_find_device - device iterator for locating a particular device
  * @class: the class we're iterating
  * @class: the class we're iterating
+ * @start: Device to begin with
  * @data: data for the match function
  * @data: data for the match function
  * @match: function to check device
  * @match: function to check device
  *
  *
@@ -306,12 +330,13 @@ EXPORT_SYMBOL_GPL(class_for_each_device);
  *
  *
  * Note, you will need to drop the reference with put_device() after use.
  * 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_mutex in this function, so it can not be
  * re-acquired in @match, otherwise it will self-deadlocking. For
  * re-acquired in @match, otherwise it will self-deadlocking. For
  * example, calls to add or remove class members would be verboten.
  * 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;
 	struct device *dev;
 	int found = 0;
 	int found = 0;
@@ -319,19 +344,21 @@ struct device *class_find_device(struct class *class, void *data,
 	if (!class)
 	if (!class)
 		return NULL;
 		return NULL;
 
 
-	down(&class->sem);
-	list_for_each_entry(dev, &class->devices, node) {
+	mutex_lock(&class->p->class_mutex);
+	list_for_each_entry(dev, &class->p->class_devices, node) {
+		if (start) {
+			if (start == dev)
+				start = NULL;
+			continue;
+		}
 		dev = get_device(dev);
 		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;
 			break;
+		} else
+			put_device(dev);
 	}
 	}
-	up(&class->sem);
+	mutex_unlock(&class->p->class_mutex);
 
 
 	return found ? dev : NULL;
 	return found ? dev : NULL;
 }
 }
@@ -349,13 +376,13 @@ int class_interface_register(struct class_interface *class_intf)
 	if (!parent)
 	if (!parent)
 		return -EINVAL;
 		return -EINVAL;
 
 
-	down(&parent->sem);
-	list_add_tail(&class_intf->node, &parent->interfaces);
+	mutex_lock(&parent->p->class_mutex);
+	list_add_tail(&class_intf->node, &parent->p->class_interfaces);
 	if (class_intf->add_dev) {
 	if (class_intf->add_dev) {
-		list_for_each_entry(dev, &parent->devices, node)
+		list_for_each_entry(dev, &parent->p->class_devices, node)
 			class_intf->add_dev(dev, class_intf);
 			class_intf->add_dev(dev, class_intf);
 	}
 	}
-	up(&parent->sem);
+	mutex_unlock(&parent->p->class_mutex);
 
 
 	return 0;
 	return 0;
 }
 }
@@ -368,13 +395,13 @@ void class_interface_unregister(struct class_interface *class_intf)
 	if (!parent)
 	if (!parent)
 		return;
 		return;
 
 
-	down(&parent->sem);
+	mutex_lock(&parent->p->class_mutex);
 	list_del_init(&class_intf->node);
 	list_del_init(&class_intf->node);
 	if (class_intf->remove_dev) {
 	if (class_intf->remove_dev) {
-		list_for_each_entry(dev, &parent->devices, node)
+		list_for_each_entry(dev, &parent->p->class_devices, node)
 			class_intf->remove_dev(dev, class_intf);
 			class_intf->remove_dev(dev, class_intf);
 	}
 	}
-	up(&parent->sem);
+	mutex_unlock(&parent->p->class_mutex);
 
 
 	class_put(parent);
 	class_put(parent);
 }
 }
@@ -389,9 +416,7 @@ int __init classes_init(void)
 
 
 EXPORT_SYMBOL_GPL(class_create_file);
 EXPORT_SYMBOL_GPL(class_create_file);
 EXPORT_SYMBOL_GPL(class_remove_file);
 EXPORT_SYMBOL_GPL(class_remove_file);
-EXPORT_SYMBOL_GPL(class_register);
 EXPORT_SYMBOL_GPL(class_unregister);
 EXPORT_SYMBOL_GPL(class_unregister);
-EXPORT_SYMBOL_GPL(class_create);
 EXPORT_SYMBOL_GPL(class_destroy);
 EXPORT_SYMBOL_GPL(class_destroy);
 
 
 EXPORT_SYMBOL_GPL(class_interface_register);
 EXPORT_SYMBOL_GPL(class_interface_register);

+ 124 - 72
drivers/base/core.c

@@ -21,12 +21,16 @@
 #include <linux/genhd.h>
 #include <linux/genhd.h>
 #include <linux/kallsyms.h>
 #include <linux/kallsyms.h>
 #include <linux/semaphore.h>
 #include <linux/semaphore.h>
+#include <linux/mutex.h>
 
 
 #include "base.h"
 #include "base.h"
 #include "power/power.h"
 #include "power/power.h"
 
 
 int (*platform_notify)(struct device *dev) = NULL;
 int (*platform_notify)(struct device *dev) = NULL;
 int (*platform_notify_remove)(struct device *dev) = NULL;
 int (*platform_notify_remove)(struct device *dev) = NULL;
+static struct kobject *dev_kobj;
+struct kobject *sysfs_dev_char_kobj;
+struct kobject *sysfs_dev_block_kobj;
 
 
 #ifdef CONFIG_BLOCK
 #ifdef CONFIG_BLOCK
 static inline int device_is_not_partition(struct device *dev)
 static inline int device_is_not_partition(struct device *dev)
@@ -548,7 +552,7 @@ static struct kobject *get_device_parent(struct device *dev,
 {
 {
 	/* class devices without a parent live in /sys/class/<classname>/ */
 	/* class devices without a parent live in /sys/class/<classname>/ */
 	if (dev->class && (!parent || parent->class != dev->class))
 	if (dev->class && (!parent || parent->class != dev->class))
-		return &dev->class->subsys.kobj;
+		return &dev->class->p->class_subsys.kobj;
 	/* all other devices keep their parent */
 	/* all other devices keep their parent */
 	else if (parent)
 	else if (parent)
 		return &parent->kobj;
 		return &parent->kobj;
@@ -594,13 +598,13 @@ static struct kobject *get_device_parent(struct device *dev,
 			parent_kobj = &parent->kobj;
 			parent_kobj = &parent->kobj;
 
 
 		/* find our class-directory at the parent and reference it */
 		/* find our class-directory at the parent and reference it */
-		spin_lock(&dev->class->class_dirs.list_lock);
-		list_for_each_entry(k, &dev->class->class_dirs.list, entry)
+		spin_lock(&dev->class->p->class_dirs.list_lock);
+		list_for_each_entry(k, &dev->class->p->class_dirs.list, entry)
 			if (k->parent == parent_kobj) {
 			if (k->parent == parent_kobj) {
 				kobj = kobject_get(k);
 				kobj = kobject_get(k);
 				break;
 				break;
 			}
 			}
-		spin_unlock(&dev->class->class_dirs.list_lock);
+		spin_unlock(&dev->class->p->class_dirs.list_lock);
 		if (kobj)
 		if (kobj)
 			return kobj;
 			return kobj;
 
 
@@ -608,7 +612,7 @@ static struct kobject *get_device_parent(struct device *dev,
 		k = kobject_create();
 		k = kobject_create();
 		if (!k)
 		if (!k)
 			return NULL;
 			return NULL;
-		k->kset = &dev->class->class_dirs;
+		k->kset = &dev->class->p->class_dirs;
 		retval = kobject_add(k, parent_kobj, "%s", dev->class->name);
 		retval = kobject_add(k, parent_kobj, "%s", dev->class->name);
 		if (retval < 0) {
 		if (retval < 0) {
 			kobject_put(k);
 			kobject_put(k);
@@ -627,7 +631,7 @@ static void cleanup_glue_dir(struct device *dev, struct kobject *glue_dir)
 {
 {
 	/* see if we live in a "glue" directory */
 	/* see if we live in a "glue" directory */
 	if (!glue_dir || !dev->class ||
 	if (!glue_dir || !dev->class ||
-	    glue_dir->kset != &dev->class->class_dirs)
+	    glue_dir->kset != &dev->class->p->class_dirs)
 		return;
 		return;
 
 
 	kobject_put(glue_dir);
 	kobject_put(glue_dir);
@@ -654,17 +658,18 @@ static int device_add_class_symlinks(struct device *dev)
 	if (!dev->class)
 	if (!dev->class)
 		return 0;
 		return 0;
 
 
-	error = sysfs_create_link(&dev->kobj, &dev->class->subsys.kobj,
+	error = sysfs_create_link(&dev->kobj,
+				  &dev->class->p->class_subsys.kobj,
 				  "subsystem");
 				  "subsystem");
 	if (error)
 	if (error)
 		goto out;
 		goto out;
 
 
 #ifdef CONFIG_SYSFS_DEPRECATED
 #ifdef CONFIG_SYSFS_DEPRECATED
 	/* stacked class devices need a symlink in the class directory */
 	/* stacked class devices need a symlink in the class directory */
-	if (dev->kobj.parent != &dev->class->subsys.kobj &&
+	if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
 	    device_is_not_partition(dev)) {
 	    device_is_not_partition(dev)) {
-		error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj,
-					  dev->bus_id);
+		error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
+					  &dev->kobj, dev->bus_id);
 		if (error)
 		if (error)
 			goto out_subsys;
 			goto out_subsys;
 	}
 	}
@@ -701,13 +706,14 @@ out_device:
 	if (dev->parent && device_is_not_partition(dev))
 	if (dev->parent && device_is_not_partition(dev))
 		sysfs_remove_link(&dev->kobj, "device");
 		sysfs_remove_link(&dev->kobj, "device");
 out_busid:
 out_busid:
-	if (dev->kobj.parent != &dev->class->subsys.kobj &&
+	if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
 	    device_is_not_partition(dev))
 	    device_is_not_partition(dev))
-		sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id);
+		sysfs_remove_link(&dev->class->p->class_subsys.kobj,
+				  dev->bus_id);
 #else
 #else
 	/* link in the class directory pointing to the device */
 	/* link in the class directory pointing to the device */
-	error = sysfs_create_link(&dev->class->subsys.kobj, &dev->kobj,
-				  dev->bus_id);
+	error = sysfs_create_link(&dev->class->p->class_subsys.kobj,
+				  &dev->kobj, dev->bus_id);
 	if (error)
 	if (error)
 		goto out_subsys;
 		goto out_subsys;
 
 
@@ -720,7 +726,7 @@ out_busid:
 	return 0;
 	return 0;
 
 
 out_busid:
 out_busid:
-	sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id);
+	sysfs_remove_link(&dev->class->p->class_subsys.kobj, dev->bus_id);
 #endif
 #endif
 
 
 out_subsys:
 out_subsys:
@@ -746,14 +752,15 @@ static void device_remove_class_symlinks(struct device *dev)
 		sysfs_remove_link(&dev->kobj, "device");
 		sysfs_remove_link(&dev->kobj, "device");
 	}
 	}
 
 
-	if (dev->kobj.parent != &dev->class->subsys.kobj &&
+	if (dev->kobj.parent != &dev->class->p->class_subsys.kobj &&
 	    device_is_not_partition(dev))
 	    device_is_not_partition(dev))
-		sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id);
+		sysfs_remove_link(&dev->class->p->class_subsys.kobj,
+				  dev->bus_id);
 #else
 #else
 	if (dev->parent && device_is_not_partition(dev))
 	if (dev->parent && device_is_not_partition(dev))
 		sysfs_remove_link(&dev->kobj, "device");
 		sysfs_remove_link(&dev->kobj, "device");
 
 
-	sysfs_remove_link(&dev->class->subsys.kobj, dev->bus_id);
+	sysfs_remove_link(&dev->class->p->class_subsys.kobj, dev->bus_id);
 #endif
 #endif
 
 
 	sysfs_remove_link(&dev->kobj, "subsystem");
 	sysfs_remove_link(&dev->kobj, "subsystem");
@@ -775,6 +782,54 @@ int dev_set_name(struct device *dev, const char *fmt, ...)
 }
 }
 EXPORT_SYMBOL_GPL(dev_set_name);
 EXPORT_SYMBOL_GPL(dev_set_name);
 
 
+/**
+ * device_to_dev_kobj - select a /sys/dev/ directory for the device
+ * @dev: device
+ *
+ * By default we select char/ for new entries.  Setting class->dev_obj
+ * to NULL prevents an entry from being created.  class->dev_kobj must
+ * be set (or cleared) before any devices are registered to the class
+ * otherwise device_create_sys_dev_entry() and
+ * device_remove_sys_dev_entry() will disagree about the the presence
+ * of the link.
+ */
+static struct kobject *device_to_dev_kobj(struct device *dev)
+{
+	struct kobject *kobj;
+
+	if (dev->class)
+		kobj = dev->class->dev_kobj;
+	else
+		kobj = sysfs_dev_char_kobj;
+
+	return kobj;
+}
+
+static int device_create_sys_dev_entry(struct device *dev)
+{
+	struct kobject *kobj = device_to_dev_kobj(dev);
+	int error = 0;
+	char devt_str[15];
+
+	if (kobj) {
+		format_dev_t(devt_str, dev->devt);
+		error = sysfs_create_link(kobj, &dev->kobj, devt_str);
+	}
+
+	return error;
+}
+
+static void device_remove_sys_dev_entry(struct device *dev)
+{
+	struct kobject *kobj = device_to_dev_kobj(dev);
+	char devt_str[15];
+
+	if (kobj) {
+		format_dev_t(devt_str, dev->devt);
+		sysfs_remove_link(kobj, devt_str);
+	}
+}
+
 /**
 /**
  * device_add - add device to device hierarchy.
  * device_add - add device to device hierarchy.
  * @dev: device.
  * @dev: device.
@@ -829,6 +884,10 @@ int device_add(struct device *dev)
 		error = device_create_file(dev, &devt_attr);
 		error = device_create_file(dev, &devt_attr);
 		if (error)
 		if (error)
 			goto ueventattrError;
 			goto ueventattrError;
+
+		error = device_create_sys_dev_entry(dev);
+		if (error)
+			goto devtattrError;
 	}
 	}
 
 
 	error = device_add_class_symlinks(dev);
 	error = device_add_class_symlinks(dev);
@@ -849,15 +908,16 @@ int device_add(struct device *dev)
 		klist_add_tail(&dev->knode_parent, &parent->klist_children);
 		klist_add_tail(&dev->knode_parent, &parent->klist_children);
 
 
 	if (dev->class) {
 	if (dev->class) {
-		down(&dev->class->sem);
+		mutex_lock(&dev->class->p->class_mutex);
 		/* tie the class to the device */
 		/* tie the class to the device */
-		list_add_tail(&dev->node, &dev->class->devices);
+		list_add_tail(&dev->node, &dev->class->p->class_devices);
 
 
 		/* notify any interfaces that the device is here */
 		/* notify any interfaces that the device is here */
-		list_for_each_entry(class_intf, &dev->class->interfaces, node)
+		list_for_each_entry(class_intf,
+				    &dev->class->p->class_interfaces, node)
 			if (class_intf->add_dev)
 			if (class_intf->add_dev)
 				class_intf->add_dev(dev, class_intf);
 				class_intf->add_dev(dev, class_intf);
-		up(&dev->class->sem);
+		mutex_unlock(&dev->class->p->class_mutex);
 	}
 	}
  Done:
  Done:
 	put_device(dev);
 	put_device(dev);
@@ -872,6 +932,9 @@ int device_add(struct device *dev)
  AttrsError:
  AttrsError:
 	device_remove_class_symlinks(dev);
 	device_remove_class_symlinks(dev);
  SymlinkError:
  SymlinkError:
+	if (MAJOR(dev->devt))
+		device_remove_sys_dev_entry(dev);
+ devtattrError:
 	if (MAJOR(dev->devt))
 	if (MAJOR(dev->devt))
 		device_remove_file(dev, &devt_attr);
 		device_remove_file(dev, &devt_attr);
  ueventattrError:
  ueventattrError:
@@ -948,19 +1011,22 @@ void device_del(struct device *dev)
 	device_pm_remove(dev);
 	device_pm_remove(dev);
 	if (parent)
 	if (parent)
 		klist_del(&dev->knode_parent);
 		klist_del(&dev->knode_parent);
-	if (MAJOR(dev->devt))
+	if (MAJOR(dev->devt)) {
+		device_remove_sys_dev_entry(dev);
 		device_remove_file(dev, &devt_attr);
 		device_remove_file(dev, &devt_attr);
+	}
 	if (dev->class) {
 	if (dev->class) {
 		device_remove_class_symlinks(dev);
 		device_remove_class_symlinks(dev);
 
 
-		down(&dev->class->sem);
+		mutex_lock(&dev->class->p->class_mutex);
 		/* notify any interfaces that the device is now gone */
 		/* notify any interfaces that the device is now gone */
-		list_for_each_entry(class_intf, &dev->class->interfaces, node)
+		list_for_each_entry(class_intf,
+				    &dev->class->p->class_interfaces, node)
 			if (class_intf->remove_dev)
 			if (class_intf->remove_dev)
 				class_intf->remove_dev(dev, class_intf);
 				class_intf->remove_dev(dev, class_intf);
 		/* remove the device from the class list */
 		/* remove the device from the class list */
 		list_del_init(&dev->node);
 		list_del_init(&dev->node);
-		up(&dev->class->sem);
+		mutex_unlock(&dev->class->p->class_mutex);
 	}
 	}
 	device_remove_file(dev, &uevent_attr);
 	device_remove_file(dev, &uevent_attr);
 	device_remove_attrs(dev);
 	device_remove_attrs(dev);
@@ -1074,7 +1140,25 @@ int __init devices_init(void)
 	devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
 	devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);
 	if (!devices_kset)
 	if (!devices_kset)
 		return -ENOMEM;
 		return -ENOMEM;
+	dev_kobj = kobject_create_and_add("dev", NULL);
+	if (!dev_kobj)
+		goto dev_kobj_err;
+	sysfs_dev_block_kobj = kobject_create_and_add("block", dev_kobj);
+	if (!sysfs_dev_block_kobj)
+		goto block_kobj_err;
+	sysfs_dev_char_kobj = kobject_create_and_add("char", dev_kobj);
+	if (!sysfs_dev_char_kobj)
+		goto char_kobj_err;
+
 	return 0;
 	return 0;
+
+ char_kobj_err:
+	kobject_put(sysfs_dev_block_kobj);
+ block_kobj_err:
+	kobject_put(dev_kobj);
+ dev_kobj_err:
+	kset_unregister(devices_kset);
+	return -ENOMEM;
 }
 }
 
 
 EXPORT_SYMBOL_GPL(device_for_each_child);
 EXPORT_SYMBOL_GPL(device_for_each_child);
@@ -1157,49 +1241,12 @@ error:
 }
 }
 EXPORT_SYMBOL_GPL(device_create_vargs);
 EXPORT_SYMBOL_GPL(device_create_vargs);
 
 
-/**
- * device_create_drvdata - 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
- * @drvdata: the data to be added to the device for callbacks
- * @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_drvdata(struct class *class,
-				     struct device *parent,
-				     dev_t devt,
-				     void *drvdata,
-				     const char *fmt, ...)
-{
-	va_list vargs;
-	struct device *dev;
-
-	va_start(vargs, fmt);
-	dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
-	va_end(vargs);
-	return dev;
-}
-EXPORT_SYMBOL_GPL(device_create_drvdata);
-
 /**
 /**
  * device_create - 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
  * @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
  * @parent: pointer to the parent struct device of this new device, if any
  * @devt: the dev_t for the char device to be added
  * @devt: the dev_t for the char device to be added
+ * @drvdata: the data to be added to the device for callbacks
  * @fmt: string for the device's name
  * @fmt: string for the device's name
  *
  *
  * This function can be used by char device classes.  A struct device
  * This function can be used by char device classes.  A struct device
@@ -1217,13 +1264,13 @@ EXPORT_SYMBOL_GPL(device_create_drvdata);
  * been created with a call to class_create().
  * been created with a call to class_create().
  */
  */
 struct device *device_create(struct class *class, struct device *parent,
 struct device *device_create(struct class *class, struct device *parent,
-			     dev_t devt, const char *fmt, ...)
+			     dev_t devt, void *drvdata, const char *fmt, ...)
 {
 {
 	va_list vargs;
 	va_list vargs;
 	struct device *dev;
 	struct device *dev;
 
 
 	va_start(vargs, fmt);
 	va_start(vargs, fmt);
-	dev = device_create_vargs(class, parent, devt, NULL, fmt, vargs);
+	dev = device_create_vargs(class, parent, devt, drvdata, fmt, vargs);
 	va_end(vargs);
 	va_end(vargs);
 	return dev;
 	return dev;
 }
 }
@@ -1248,7 +1295,7 @@ void device_destroy(struct class *class, dev_t devt)
 {
 {
 	struct device *dev;
 	struct device *dev;
 
 
-	dev = class_find_device(class, &devt, __match_devt);
+	dev = class_find_device(class, NULL, &devt, __match_devt);
 	if (dev) {
 	if (dev) {
 		put_device(dev);
 		put_device(dev);
 		device_unregister(dev);
 		device_unregister(dev);
@@ -1298,8 +1345,9 @@ int device_rename(struct device *dev, char *new_name)
 	if (old_class_name) {
 	if (old_class_name) {
 		new_class_name = make_class_name(dev->class->name, &dev->kobj);
 		new_class_name = make_class_name(dev->class->name, &dev->kobj);
 		if (new_class_name) {
 		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)
 			if (error)
 				goto out;
 				goto out;
 			sysfs_remove_link(&dev->parent->kobj, old_class_name);
 			sysfs_remove_link(&dev->parent->kobj, old_class_name);
@@ -1307,11 +1355,12 @@ int device_rename(struct device *dev, char *new_name)
 	}
 	}
 #else
 #else
 	if (dev->class) {
 	if (dev->class) {
-		error = sysfs_create_link(&dev->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)
 		if (error)
 			goto out;
 			goto out;
-		sysfs_remove_link(&dev->class->subsys.kobj, old_device_name);
+		sysfs_remove_link(&dev->class->p->class_subsys.kobj,
+				  old_device_name);
 	}
 	}
 #endif
 #endif
 
 
@@ -1447,4 +1496,7 @@ void device_shutdown(void)
 			dev->driver->shutdown(dev);
 			dev->driver->shutdown(dev);
 		}
 		}
 	}
 	}
+	kobject_put(sysfs_dev_char_kobj);
+	kobject_put(sysfs_dev_block_kobj);
+	kobject_put(dev_kobj);
 }
 }

+ 6 - 4
drivers/base/cpu.c

@@ -21,15 +21,16 @@ EXPORT_SYMBOL(cpu_sysdev_class);
 static DEFINE_PER_CPU(struct sys_device *, cpu_sys_devices);
 static DEFINE_PER_CPU(struct sys_device *, cpu_sys_devices);
 
 
 #ifdef CONFIG_HOTPLUG_CPU
 #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);
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
 
 
 	return sprintf(buf, "%u\n", !!cpu_online(cpu->sysdev.id));
 	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);
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
 	ssize_t ret;
 	ssize_t ret;
@@ -80,7 +81,8 @@ static inline void register_cpu_control(struct cpu *cpu)
 #ifdef CONFIG_KEXEC
 #ifdef CONFIG_KEXEC
 #include <linux/kexec.h>
 #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);
 	struct cpu *cpu = container_of(dev, struct cpu, sysdev);
 	ssize_t rc;
 	ssize_t rc;

+ 8 - 4
drivers/base/memory.c

@@ -92,7 +92,8 @@ unregister_memory(struct memory_block *memory, struct mem_section *section)
  * uses.
  * 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 =
 	struct memory_block *mem =
 		container_of(dev, struct memory_block, sysdev);
 		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.
  * 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 =
 	struct memory_block *mem =
 		container_of(dev, struct memory_block, sysdev);
 		container_of(dev, struct memory_block, sysdev);
@@ -217,7 +219,8 @@ out:
 }
 }
 
 
 static ssize_t
 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;
 	struct memory_block *mem;
 	unsigned int phys_section_nr;
 	unsigned int phys_section_nr;
@@ -248,7 +251,8 @@ out:
  * s.t. if I offline all of these sections I can then
  * s.t. if I offline all of these sections I can then
  * remove the physical device?
  * 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 =
 	struct memory_block *mem =
 		container_of(dev, struct memory_block, sysdev);
 		container_of(dev, struct memory_block, sysdev);

+ 10 - 5
drivers/base/node.c

@@ -36,11 +36,13 @@ static ssize_t node_read_cpumap(struct sys_device *dev, int type, char *buf)
 	return len;
 	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);
 	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);
 	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);
 static SYSDEV_ATTR(cpulist, S_IRUGO, node_read_cpulist, NULL);
 
 
 #define K(x) ((x) << (PAGE_SHIFT - 10))
 #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 n;
 	int nid = dev->id;
 	int nid = dev->id;
@@ -112,7 +115,8 @@ static ssize_t node_read_meminfo(struct sys_device * dev, char * buf)
 #undef K
 #undef K
 static SYSDEV_ATTR(meminfo, S_IRUGO, node_read_meminfo, NULL);
 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,
 	return sprintf(buf,
 		       "numa_hit %lu\n"
 		       "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 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 nid = dev->id;
 	int len = 0;
 	int len = 0;

+ 1 - 1
drivers/base/power/trace.c

@@ -194,7 +194,7 @@ static int show_dev_hash(unsigned int value)
 		struct device * dev = to_device(entry);
 		struct device * dev = to_device(entry);
 		unsigned int hash = hash_string(DEVSEED, dev->bus_id, DEVHASH);
 		unsigned int hash = hash_string(DEVSEED, dev->bus_id, DEVHASH);
 		if (hash == value) {
 		if (hash == value) {
-			printk("  hash matches device %s\n", dev->bus_id);
+			dev_info(dev, "hash matches\n");
 			match++;
 			match++;
 		}
 		}
 		entry = entry->prev;
 		entry = entry->prev;

+ 59 - 5
drivers/base/sys.c

@@ -36,7 +36,7 @@ sysdev_show(struct kobject * kobj, struct attribute * attr, char * buffer)
 	struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr);
 	struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr);
 
 
 	if (sysdev_attr->show)
 	if (sysdev_attr->show)
-		return sysdev_attr->show(sysdev, buffer);
+		return sysdev_attr->show(sysdev, sysdev_attr, buffer);
 	return -EIO;
 	return -EIO;
 }
 }
 
 
@@ -49,7 +49,7 @@ sysdev_store(struct kobject * kobj, struct attribute * attr,
 	struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr);
 	struct sysdev_attribute * sysdev_attr = to_sysdev_attr(attr);
 
 
 	if (sysdev_attr->store)
 	if (sysdev_attr->store)
-		return sysdev_attr->store(sysdev, buffer, count);
+		return sysdev_attr->store(sysdev, sysdev_attr, buffer, count);
 	return -EIO;
 	return -EIO;
 }
 }
 
 
@@ -130,8 +130,8 @@ static struct kset *system_kset;
 
 
 int sysdev_class_register(struct sysdev_class * cls)
 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);
 	INIT_LIST_HEAD(&cls->drivers);
 	memset(&cls->kset.kobj, 0x00, sizeof(struct kobject));
 	memset(&cls->kset.kobj, 0x00, sizeof(struct kobject));
 	cls->kset.kobj.parent = &system_kset->kobj;
 	cls->kset.kobj.parent = &system_kset->kobj;
@@ -241,7 +241,8 @@ int sysdev_register(struct sys_device * sysdev)
 	if (!cls)
 	if (!cls)
 		return -EINVAL;
 		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 */
 	/* initialize the kobject to 0, in case it had previously been used */
 	memset(&sysdev->kobj, 0x00, sizeof(struct kobject));
 	memset(&sysdev->kobj, 0x00, sizeof(struct kobject));
@@ -257,6 +258,9 @@ int sysdev_register(struct sys_device * sysdev)
 	if (!error) {
 	if (!error) {
 		struct sysdev_driver * drv;
 		struct sysdev_driver * drv;
 
 
+		pr_debug("Registering sys device '%s'\n",
+			 kobject_name(&sysdev->kobj));
+
 		mutex_lock(&sysdev_drivers_lock);
 		mutex_lock(&sysdev_drivers_lock);
 		/* Generic notification is implicit, because it's that
 		/* Generic notification is implicit, because it's that
 		 * code that should have called us.
 		 * code that should have called us.
@@ -269,6 +273,7 @@ int sysdev_register(struct sys_device * sysdev)
 		}
 		}
 		mutex_unlock(&sysdev_drivers_lock);
 		mutex_unlock(&sysdev_drivers_lock);
 	}
 	}
+
 	kobject_uevent(&sysdev->kobj, KOBJ_ADD);
 	kobject_uevent(&sysdev->kobj, KOBJ_ADD);
 	return error;
 	return error;
 }
 }
@@ -474,3 +479,52 @@ int __init system_bus_init(void)
 
 
 EXPORT_SYMBOL_GPL(sysdev_register);
 EXPORT_SYMBOL_GPL(sysdev_register);
 EXPORT_SYMBOL_GPL(sysdev_unregister);
 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);
+

+ 12 - 5
drivers/base/topology.c

@@ -34,7 +34,8 @@
 static SYSDEV_ATTR(_name, 0444, show_##_name, NULL)
 static SYSDEV_ATTR(_name, 0444, show_##_name, NULL)
 
 
 #define define_id_show_func(name)				\
 #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;				\
 	unsigned int cpu = dev->id;				\
 	return sprintf(buf, "%d\n", topology_##name(cpu));	\
 	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
 #ifdef arch_provides_topology_pointers
 #define define_siblings_show_map(name)					\
 #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;					\
 	unsigned int cpu = dev->id;					\
 	return show_cpumap(0, &(topology_##name(cpu)), buf);		\
 	return show_cpumap(0, &(topology_##name(cpu)), buf);		\
 }
 }
 
 
 #define define_siblings_show_list(name)					\
 #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;					\
 	unsigned int cpu = dev->id;					\
 	return show_cpumap(1, &(topology_##name(cpu)), buf);		\
 	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
 #else
 #define define_siblings_show_map(name)					\
 #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;					\
 	unsigned int cpu = dev->id;					\
 	cpumask_t mask = topology_##name(cpu);				\
 	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)					\
 #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;					\
 	unsigned int cpu = dev->id;					\
 	cpumask_t mask = topology_##name(cpu);				\
 	cpumask_t mask = topology_##name(cpu);				\

+ 3 - 2
drivers/block/aoe/aoechr.c

@@ -277,8 +277,9 @@ aoechr_init(void)
 		return PTR_ERR(aoe_class);
 		return PTR_ERR(aoe_class);
 	}
 	}
 	for (i = 0; i < ARRAY_SIZE(chardevs); ++i)
 	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;
 	return 0;
 }
 }

+ 3 - 2
drivers/block/paride/pg.c

@@ -686,8 +686,9 @@ static int __init pg_init(void)
 	for (unit = 0; unit < PG_UNITS; unit++) {
 	for (unit = 0; unit < PG_UNITS; unit++) {
 		struct pg *dev = &devices[unit];
 		struct pg *dev = &devices[unit];
 		if (dev->present)
 		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;
 	err = 0;
 	goto out;
 	goto out;

+ 6 - 4
drivers/block/paride/pt.c

@@ -979,10 +979,12 @@ static int __init pt_init(void)
 
 
 	for (unit = 0; unit < PT_UNITS; unit++)
 	for (unit = 0; unit < PT_UNITS; unit++)
 		if (pt[unit].present) {
 		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;
 	goto out;
 
 

+ 3 - 1
drivers/block/pktcdvd.c

@@ -303,7 +303,9 @@ static struct kobj_type kobj_pkt_type_wqueue = {
 static void pkt_sysfs_dev_new(struct pktcdvd_device *pd)
 static void pkt_sysfs_dev_new(struct pktcdvd_device *pd)
 {
 {
 	if (class_pktcdvd) {
 	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))
 		if (IS_ERR(pd->dev))
 			pd->dev = NULL;
 			pd->dev = NULL;
 	}
 	}

+ 2 - 1
drivers/char/dsp56k.c

@@ -500,7 +500,8 @@ static int __init dsp56k_init_driver(void)
 		err = PTR_ERR(dsp56k_class);
 		err = PTR_ERR(dsp56k_class);
 		goto out_chrdev;
 		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);
 	printk(banner);
 	goto out;
 	goto out;

+ 6 - 6
drivers/char/ip2/ip2main.c

@@ -718,12 +718,12 @@ ip2_loadmain(int *iop, int *irqp)
 			}
 			}
 
 
 			if ( NULL != ( pB = i2BoardPtrTable[i] ) ) {
 			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 )
 			    for ( box = 0; box < ABS_MAX_BOXES; ++box )
 			    {
 			    {

+ 1 - 1
drivers/char/ipmi/ipmi_devintf.c

@@ -871,7 +871,7 @@ static void ipmi_new_smi(int if_num, struct device *device)
 	entry->dev = dev;
 	entry->dev = dev;
 
 
 	mutex_lock(&reg_list_mutex);
 	mutex_lock(&reg_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, &reg_list);
 	list_add(&entry->link, &reg_list);
 	mutex_unlock(&reg_list_mutex);
 	mutex_unlock(&reg_list_mutex);
 }
 }

+ 3 - 2
drivers/char/istallion.c

@@ -4599,8 +4599,9 @@ static int __init istallion_module_init(void)
 
 
 	istallion_class = class_create(THIS_MODULE, "staliomem");
 	istallion_class = class_create(THIS_MODULE, "staliomem");
 	for (i = 0; i < 4; i++)
 	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;
 	return 0;
 err_deinit:
 err_deinit:

+ 2 - 1
drivers/char/lp.c

@@ -813,7 +813,8 @@ static int lp_register(int nr, struct parport *port)
 	if (reset)
 	if (reset)
 		lp_reset(nr);
 		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, 
 	printk(KERN_INFO "lp%d: using %s (%s).\n", nr, port->name, 
 	       (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");
 	       (port->irq == PARPORT_IRQ_NONE)?"polling":"interrupt-driven");

+ 3 - 3
drivers/char/mem.c

@@ -989,9 +989,9 @@ static int __init chr_dev_init(void)
 
 
 	mem_class = class_create(THIS_MODULE, "mem");
 	mem_class = class_create(THIS_MODULE, "mem");
 	for (i = 0; i < ARRAY_SIZE(devlist); i++)
 	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;
 	return 0;
 }
 }

+ 2 - 2
drivers/char/misc.c

@@ -217,8 +217,8 @@ int misc_register(struct miscdevice * misc)
 		misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
 		misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);
 	dev = MKDEV(MISC_MAJOR, misc->minor);
 	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)) {
 	if (IS_ERR(misc->this_device)) {
 		err = PTR_ERR(misc->this_device);
 		err = PTR_ERR(misc->this_device);
 		goto out;
 		goto out;

+ 1 - 1
drivers/char/pcmcia/cm4000_cs.c

@@ -1896,7 +1896,7 @@ static int cm4000_probe(struct pcmcia_device *link)
 		return ret;
 		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;
 	return 0;
 }
 }

+ 2 - 1
drivers/char/pcmcia/cm4040_cs.c

@@ -653,7 +653,8 @@ static int reader_probe(struct pcmcia_device *link)
 		return ret;
 		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;
 	return 0;
 }
 }

+ 3 - 2
drivers/char/ppdev.c

@@ -752,8 +752,9 @@ static const struct file_operations pp_fops = {
 
 
 static void pp_attach(struct parport *port)
 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)
 static void pp_detach(struct parport *port)

+ 4 - 3
drivers/char/raw.c

@@ -131,8 +131,8 @@ raw_ioctl(struct inode *inode, struct file *filp,
 static void bind_device(struct raw_config_request *rq)
 static void bind_device(struct raw_config_request *rq)
 {
 {
 	device_destroy(raw_class, MKDEV(RAW_MAJOR, rq->raw_minor));
 	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);
 		ret = PTR_ERR(raw_class);
 		goto error_region;
 		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;
 	return 0;
 
 

+ 2 - 1
drivers/char/snsc.c

@@ -444,7 +444,8 @@ scdrv_init(void)
 				continue;
 				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,
 			ia64_sn_irtr_intr_enable(scd->scd_nasid,
 						 0 /*ignored */ ,
 						 0 /*ignored */ ,

+ 2 - 2
drivers/char/stallion.c

@@ -4755,8 +4755,8 @@ static int __init stallion_module_init(void)
 	if (IS_ERR(stallion_class))
 	if (IS_ERR(stallion_class))
 		printk("STALLION: failed to create class\n");
 		printk("STALLION: failed to create class\n");
 	for (i = 0; i < 4; i++)
 	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;
 	return 0;
 err_unrtty:
 err_unrtty:

+ 7 - 5
drivers/char/tty_io.c

@@ -3412,7 +3412,7 @@ struct device *tty_register_device(struct tty_driver *driver, unsigned index,
 	else
 	else
 		tty_line_name(driver, index, name);
 		tty_line_name(driver, index, name);
 
 
-	return device_create(tty_class, device, dev, name);
+	return device_create_drvdata(tty_class, device, dev, NULL, name);
 }
 }
 
 
 /**
 /**
@@ -3690,20 +3690,22 @@ static int __init tty_init(void)
 	if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
 	if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
 		panic("Couldn't register /dev/tty driver\n");
 		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);
 	cdev_init(&console_cdev, &console_fops);
 	if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
 	if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
 		panic("Couldn't register /dev/console driver\n");
 		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
 #ifdef CONFIG_UNIX98_PTYS
 	cdev_init(&ptmx_cdev, &ptmx_fops);
 	cdev_init(&ptmx_cdev, &ptmx_fops);
 	if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
 	if (cdev_add(&ptmx_cdev, MKDEV(TTYAUX_MAJOR, 2), 1) ||
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 	    register_chrdev_region(MKDEV(TTYAUX_MAJOR, 2), 1, "/dev/ptmx") < 0)
 		panic("Couldn't register /dev/ptmx driver\n");
 		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
 #endif
 
 
 #ifdef CONFIG_VT
 #ifdef CONFIG_VT
@@ -3711,7 +3713,7 @@ static int __init tty_init(void)
 	if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
 	if (cdev_add(&vc0_cdev, MKDEV(TTY_MAJOR, 0), 1) ||
 	    register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
 	    register_chrdev_region(MKDEV(TTY_MAJOR, 0), 1, "/dev/vc/0") < 0)
 		panic("Couldn't register /dev/tty0 driver\n");
 		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();
 	vty_init();
 #endif
 #endif

+ 6 - 6
drivers/char/vc_screen.c

@@ -481,10 +481,10 @@ static struct class *vc_class;
 
 
 void vcs_make_sysfs(struct tty_struct *tty)
 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)
 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);
 		panic("unable to get major %d for vcs device", VCS_MAJOR);
 	vc_class = class_create(THIS_MODULE, "vc");
 	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;
 	return 0;
 }
 }

+ 4 - 4
drivers/char/viotape.c

@@ -886,10 +886,10 @@ static int viotape_probe(struct vio_dev *vdev, const struct vio_device_id *id)
 	state[i].cur_part = 0;
 	state[i].cur_part = 0;
 	for (j = 0; j < MAX_PARTITIONS; ++j)
 	for (j = 0; j < MAX_PARTITIONS; ++j)
 		state[i].part_stat_rwi[j] = VIOT_IDLE;
 		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 "
 	printk(VIOTAPE_KERN_INFO "tape iseries/vt%d is iSeries "
 			"resource %10.10s type %4.4s, model %3.3s\n",
 			"resource %10.10s type %4.4s, model %3.3s\n",
 			i, viotape_unitinfo[i].rsrcname,
 			i, viotape_unitinfo[i].rsrcname,

+ 8 - 6
drivers/char/vt.c

@@ -3425,9 +3425,10 @@ int register_con_driver(const struct consw *csw, int first, int last)
 	if (retval)
 	if (retval)
 		goto err;
 		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)) {
 	if (IS_ERR(con_driver->dev)) {
 		printk(KERN_WARNING "Unable to create device for %s; "
 		printk(KERN_WARNING "Unable to create device for %s; "
@@ -3535,9 +3536,10 @@ static int __init vtconsole_class_init(void)
 		struct con_driver *con = &registered_con_driver[i];
 		struct con_driver *con = &registered_con_driver[i];
 
 
 		if (con->con && !con->dev) {
 		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)) {
 			if (IS_ERR(con->dev)) {
 				printk(KERN_WARNING "Unable to create "
 				printk(KERN_WARNING "Unable to create "

+ 3 - 2
drivers/char/xilinx_hwicap/xilinx_hwicap.c

@@ -658,8 +658,9 @@ static int __devinit hwicap_setup(struct device *dev, int id,
 		dev_err(dev, "cdev_add() failed\n");
 		dev_err(dev, "cdev_add() failed\n");
 		goto failed3;
 		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 */
 	return 0;		/* success */
 
 
  failed3:
  failed3:

+ 7 - 3
drivers/cpuidle/sysfs.c

@@ -21,7 +21,8 @@ static int __init cpuidle_sysfs_setup(char *unused)
 }
 }
 __setup("cpuidle_sysfs_switch", cpuidle_sysfs_setup);
 __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;
 	ssize_t i = 0;
 	struct cpuidle_governor *tmp;
 	struct cpuidle_governor *tmp;
@@ -39,7 +40,8 @@ out:
 	return i;
 	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;
 	ssize_t ret;
 
 
@@ -53,7 +55,8 @@ static ssize_t show_current_driver(struct sys_device *dev, char *buf)
 	return ret;
 	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;
 	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,
 static ssize_t store_current_governor(struct sys_device *dev,
+	struct sysdev_attribute *attr,
 	const char *buf, size_t count)
 	const char *buf, size_t count)
 {
 {
 	char gov_name[CPUIDLE_NAME_LEN];
 	char gov_name[CPUIDLE_NAME_LEN];

+ 5 - 3
drivers/dca/dca-sysfs.c

@@ -14,8 +14,9 @@ int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot)
 {
 {
 	struct device *cd;
 	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))
 	if (IS_ERR(cd))
 		return PTR_ERR(cd);
 		return PTR_ERR(cd);
 	return 0;
 	return 0;
@@ -46,7 +47,8 @@ idr_try_again:
 		return err;
 		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)) {
 	if (IS_ERR(cd)) {
 		spin_lock(&dca_idr_lock);
 		spin_lock(&dca_idr_lock);
 		idr_remove(&dca_idr, dca->id);
 		idr_remove(&dca_idr, dca->id);

+ 1 - 1
drivers/eisa/Makefile

@@ -9,7 +9,7 @@ obj-${CONFIG_EISA_VIRTUAL_ROOT} += virtual_root.o
 
 
 
 
 # Ugly hack to get DEVICE_NAME_SIZE value...
 # 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
 $(obj)/eisa-bus.o: $(obj)/devlist.h
 
 

+ 2 - 2
drivers/eisa/eisa-bus.c

@@ -22,7 +22,7 @@
 
 
 struct eisa_device_info {
 struct eisa_device_info {
 	struct eisa_device_id id;
 	struct eisa_device_id id;
-	char name[DEVICE_NAME_SIZE];
+	char name[50];
 };
 };
 
 
 #ifdef CONFIG_EISA_NAMES
 #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)) {
 		if (!strcmp (edev->id.sig, eisa_table[i].id.sig)) {
 			strlcpy (edev->pretty_name,
 			strlcpy (edev->pretty_name,
 				 eisa_table[i].name,
 				 eisa_table[i].name,
-				 DEVICE_NAME_SIZE);
+				 sizeof(edev->pretty_name));
 			return;
 			return;
 		}
 		}
 	}
 	}

+ 3 - 2
drivers/hid/hidraw.c

@@ -322,8 +322,9 @@ int hidraw_connect(struct hid_device *hid)
 		goto out;
 		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)) {
 	if (IS_ERR(dev->dev)) {
 		spin_lock(&minors_lock);
 		spin_lock(&minors_lock);

+ 2 - 1
drivers/hwmon/hwmon.c

@@ -55,7 +55,8 @@ again:
 		return ERR_PTR(err);
 		return ERR_PTR(err);
 
 
 	id = id & MAX_ID_MASK;
 	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)) {
 	if (IS_ERR(hwdev)) {
 		spin_lock(&idr_lock);
 		spin_lock(&idr_lock);

+ 4 - 2
drivers/i2c/i2c-core.c

@@ -722,7 +722,8 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
 
 
 	INIT_LIST_HEAD(&driver->clients);
 	INIT_LIST_HEAD(&driver->clients);
 	/* Walk the adapters that are already present */
 	/* 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);
 	mutex_unlock(&core_lock);
 	return 0;
 	return 0;
@@ -782,7 +783,8 @@ void i2c_del_driver(struct i2c_driver *driver)
 {
 {
 	mutex_lock(&core_lock);
 	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);
 	driver_unregister(&driver->driver);
 	pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);
 	pr_debug("i2c-core: driver [%s] unregistered\n", driver->driver.name);

+ 3 - 3
drivers/i2c/i2c-dev.c

@@ -521,9 +521,9 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap)
 		return PTR_ERR(i2c_dev);
 		return PTR_ERR(i2c_dev);
 
 
 	/* register this i2c device with the driver core */
 	/* 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)) {
 	if (IS_ERR(i2c_dev->dev)) {
 		res = PTR_ERR(i2c_dev->dev);
 		res = PTR_ERR(i2c_dev->dev);
 		goto error;
 		goto error;

+ 6 - 4
drivers/ide/ide-tape.c

@@ -2697,10 +2697,12 @@ static int ide_tape_probe(ide_drive_t *drive)
 
 
 	idetape_setup(drive, tape, minor);
 	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;
 	g->fops = &idetape_block_ops;
 	ide_register_region(g);
 	ide_register_region(g);

+ 4 - 3
drivers/ieee1394/dv1394.c

@@ -2296,9 +2296,10 @@ static void dv1394_add_host(struct hpsb_host *host)
 
 
 	ohci = (struct ti_ohci *)host->hostdata;
 	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_RECEIVE);
 	dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT);
 	dv1394_init(ohci, DV1394_NTSC, MODE_TRANSMIT);

+ 15 - 8
drivers/ieee1394/nodemgr.c

@@ -754,7 +754,8 @@ static void nodemgr_remove_uds(struct node_entry *ne)
 	 */
 	 */
 	mutex_lock(&nodemgr_serialize_remove_uds);
 	mutex_lock(&nodemgr_serialize_remove_uds);
 	for (;;) {
 	for (;;) {
-		dev = class_find_device(&nodemgr_ud_class, ne, __match_ne);
+		dev = class_find_device(&nodemgr_ud_class, NULL, ne,
+					__match_ne);
 		if (!dev)
 		if (!dev)
 			break;
 			break;
 		ud = container_of(dev, struct unit_directory, unit_dev);
 		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 device *dev;
 	struct node_entry *ne;
 	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)
 	if (!dev)
 		return NULL;
 		return NULL;
 	ne = container_of(dev, struct node_entry, node_dev);
 	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.host = host;
 	param.nodeid = nodeid;
 	param.nodeid = nodeid;
 
 
-	dev = class_find_device(&nodemgr_ne_class, &param, __match_ne_nodeid);
+	dev = class_find_device(&nodemgr_ne_class, NULL, &param,
+				__match_ne_nodeid);
 	if (!dev)
 	if (!dev)
 		return NULL;
 		return NULL;
 	ne = container_of(dev, struct node_entry, node_dev);
 	ne = container_of(dev, struct node_entry, node_dev);
@@ -1453,7 +1456,8 @@ static void nodemgr_suspend_ne(struct node_entry *ne)
 	ne->in_limbo = 1;
 	ne->in_limbo = 1;
 	WARN_ON(device_create_file(&ne->device, &dev_attr_ne_in_limbo));
 	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 +1466,8 @@ static void nodemgr_resume_ne(struct node_entry *ne)
 	ne->in_limbo = 0;
 	ne->in_limbo = 0;
 	device_remove_file(&ne->device, &dev_attr_ne_in_limbo);
 	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]",
 	HPSB_DEBUG("Node resumed: ID:BUS[" NODE_BUS_FMT "]  GUID[%016Lx]",
 		   NODE_BUS_ARGS(ne->host, ne->nodeid), (unsigned long long)ne->guid);
 		   NODE_BUS_ARGS(ne->host, ne->nodeid), (unsigned long long)ne->guid);
 }
 }
@@ -1498,7 +1503,8 @@ static int __nodemgr_update_pdrv(struct device *dev, void *data)
 
 
 static void nodemgr_update_pdrv(struct node_entry *ne)
 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 +1597,8 @@ static void nodemgr_node_probe(struct host_info *hi, int generation)
 	 * while probes are time-consuming. (Well, those probes need some
 	 * while probes are time-consuming. (Well, those probes need some
 	 * improvement...) */
 	 * improvement...) */
 
 
-	class_for_each_device(&nodemgr_ne_class, &param, __nodemgr_node_probe);
+	class_for_each_device(&nodemgr_ne_class, NULL, &param,
+			      __nodemgr_node_probe);
 
 
 	/* If we had a bus reset while we were scanning the bus, it is
 	/* 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
 	 * possible that we did not probe all nodes.  In that case, we
@@ -1826,7 +1833,7 @@ int nodemgr_for_each_host(void *data, int (*cb)(struct hpsb_host *, void *))
 
 
 	hip.cb = cb;
 	hip.cb = cb;
 	hip.data = data;
 	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);
 				      __nodemgr_for_each_host);
 
 
 	return error;
 	return error;

+ 2 - 2
drivers/ieee1394/raw1394.c

@@ -3010,10 +3010,10 @@ static int __init init_raw1394(void)
 	hpsb_register_highlevel(&raw1394_highlevel);
 	hpsb_register_highlevel(&raw1394_highlevel);
 
 
 	if (IS_ERR
 	if (IS_ERR
-	    (device_create(
+	    (device_create_drvdata(
 	      hpsb_protocol_class, NULL,
 	      hpsb_protocol_class, NULL,
 	      MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16),
 	      MKDEV(IEEE1394_MAJOR, IEEE1394_MINOR_BLOCK_RAW1394 * 16),
-	      RAW1394_DEVICE_NAME))) {
+	      NULL, RAW1394_DEVICE_NAME))) {
 		ret = -EFAULT;
 		ret = -EFAULT;
 		goto out_unreg;
 		goto out_unreg;
 	}
 	}

+ 3 - 3
drivers/ieee1394/video1394.c

@@ -1341,9 +1341,9 @@ static void video1394_add_host (struct hpsb_host *host)
 	hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id);
 	hpsb_set_hostinfo_key(&video1394_highlevel, host, ohci->host->id);
 
 
 	minor = IEEE1394_MINOR_BLOCK_VIDEO1394 * 16 + 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);
 }
 }
 
 
 
 

+ 31 - 41
drivers/infiniband/core/cm.c

@@ -44,6 +44,7 @@
 #include <linux/spinlock.h>
 #include <linux/spinlock.h>
 #include <linux/sysfs.h>
 #include <linux/sysfs.h>
 #include <linux/workqueue.h>
 #include <linux/workqueue.h>
+#include <linux/kdev_t.h>
 
 
 #include <rdma/ib_cache.h>
 #include <rdma/ib_cache.h>
 #include <rdma/ib_cm.h>
 #include <rdma/ib_cm.h>
@@ -162,8 +163,8 @@ struct cm_port {
 
 
 struct cm_device {
 struct cm_device {
 	struct list_head list;
 	struct list_head list;
-	struct ib_device *device;
-	struct kobject dev_obj;
+	struct ib_device *ib_device;
+	struct device *device;
 	u8 ack_delay;
 	u8 ack_delay;
 	struct cm_port *port[0];
 	struct cm_port *port[0];
 };
 };
@@ -339,7 +340,7 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc,
 {
 {
 	av->port = port;
 	av->port = port;
 	av->pkey_index = wc->pkey_index;
 	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);
 			   grh, &av->ah_attr);
 }
 }
 
 
@@ -353,7 +354,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);
 	read_lock_irqsave(&cm.device_lock, flags);
 	list_for_each_entry(cm_dev, &cm.device_list, list) {
 	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)) {
 					&p, NULL)) {
 			port = cm_dev->port[p-1];
 			port = cm_dev->port[p-1];
 			break;
 			break;
@@ -364,13 +365,13 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
 	if (!port)
 	if (!port)
 		return -EINVAL;
 		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);
 				  be16_to_cpu(path->pkey), &av->pkey_index);
 	if (ret)
 	if (ret)
 		return ret;
 		return ret;
 
 
 	av->port = port;
 	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->ah_attr);
 	av->timeout = path->packet_life_time + 1;
 	av->timeout = path->packet_life_time + 1;
 	return 0;
 	return 0;
@@ -1515,7 +1516,7 @@ static int cm_req_handler(struct cm_work *work)
 
 
 	req_msg = (struct cm_req_msg *)work->mad_recv_wc->recv_buf.mad;
 	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))
 	if (IS_ERR(cm_id))
 		return PTR_ERR(cm_id);
 		return PTR_ERR(cm_id);
 
 
@@ -1550,7 +1551,7 @@ static int cm_req_handler(struct cm_work *work)
 	cm_format_paths_from_req(req_msg, &work->path[0], &work->path[1]);
 	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);
 	ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av);
 	if (ret) {
 	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);
 				  work->port->port_num, 0, &work->path[0].sgid);
 		ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_GID,
 		ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_GID,
 			       &work->path[0].sgid, sizeof work->path[0].sgid,
 			       &work->path[0].sgid, sizeof work->path[0].sgid,
@@ -2950,7 +2951,7 @@ static int cm_sidr_req_handler(struct cm_work *work)
 	struct cm_sidr_req_msg *sidr_req_msg;
 	struct cm_sidr_req_msg *sidr_req_msg;
 	struct ib_wc *wc;
 	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))
 	if (IS_ERR(cm_id))
 		return PTR_ERR(cm_id);
 		return PTR_ERR(cm_id);
 	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
 	cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3578,7 +3579,7 @@ static void cm_get_ack_delay(struct cm_device *cm_dev)
 {
 {
 	struct ib_device_attr attr;
 	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 */
 		cm_dev->ack_delay = 0; /* acks will rely on packet life time */
 	else
 	else
 		cm_dev->ack_delay = attr.local_ca_ack_delay;
 		cm_dev->ack_delay = attr.local_ca_ack_delay;
@@ -3618,18 +3619,6 @@ static struct kobj_type cm_port_obj_type = {
 	.release = cm_release_port_obj
 	.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 = {
 struct class cm_class = {
 	.name    = "infiniband_cm",
 	.name    = "infiniband_cm",
 };
 };
@@ -3640,7 +3629,7 @@ static int cm_create_port_fs(struct cm_port *port)
 	int i, ret;
 	int i, ret;
 
 
 	ret = kobject_init_and_add(&port->port_obj, &cm_port_obj_type,
 	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);
 				   "%d", port->port_num);
 	if (ret) {
 	if (ret) {
 		kfree(port);
 		kfree(port);
@@ -3676,7 +3665,7 @@ static void cm_remove_port_fs(struct cm_port *port)
 	kobject_put(&port->port_obj);
 	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_device *cm_dev;
 	struct cm_port *port;
 	struct cm_port *port;
@@ -3691,26 +3680,27 @@ static void cm_add_one(struct ib_device *device)
 	int ret;
 	int ret;
 	u8 i;
 	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;
 		return;
 
 
 	cm_dev = kzalloc(sizeof(*cm_dev) + sizeof(*port) *
 	cm_dev = kzalloc(sizeof(*cm_dev) + sizeof(*port) *
-			 device->phys_port_cnt, GFP_KERNEL);
+			 ib_device->phys_port_cnt, GFP_KERNEL);
 	if (!cm_dev)
 	if (!cm_dev)
 		return;
 		return;
 
 
-	cm_dev->device = device;
+	cm_dev->ib_device = ib_device;
 	cm_get_ack_delay(cm_dev);
 	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);
-	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);
 		kfree(cm_dev);
 		return;
 		return;
 	}
 	}
 
 
 	set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask);
 	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);
 		port = kzalloc(sizeof *port, GFP_KERNEL);
 		if (!port)
 		if (!port)
 			goto error1;
 			goto error1;
@@ -3723,7 +3713,7 @@ static void cm_add_one(struct ib_device *device)
 		if (ret)
 		if (ret)
 			goto error1;
 			goto error1;
 
 
-		port->mad_agent = ib_register_mad_agent(device, i,
+		port->mad_agent = ib_register_mad_agent(ib_device, i,
 							IB_QPT_GSI,
 							IB_QPT_GSI,
 							&reg_req,
 							&reg_req,
 							0,
 							0,
@@ -3733,11 +3723,11 @@ static void cm_add_one(struct ib_device *device)
 		if (IS_ERR(port->mad_agent))
 		if (IS_ERR(port->mad_agent))
 			goto error2;
 			goto error2;
 
 
-		ret = ib_modify_port(device, i, 0, &port_modify);
+		ret = ib_modify_port(ib_device, i, 0, &port_modify);
 		if (ret)
 		if (ret)
 			goto error3;
 			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);
 	write_lock_irqsave(&cm.device_lock, flags);
 	list_add_tail(&cm_dev->list, &cm.device_list);
 	list_add_tail(&cm_dev->list, &cm.device_list);
@@ -3753,14 +3743,14 @@ error1:
 	port_modify.clr_port_cap_mask = IB_PORT_CM_SUP;
 	port_modify.clr_port_cap_mask = IB_PORT_CM_SUP;
 	while (--i) {
 	while (--i) {
 		port = cm_dev->port[i-1];
 		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);
 		ib_unregister_mad_agent(port->mad_agent);
 		cm_remove_port_fs(port);
 		cm_remove_port_fs(port);
 	}
 	}
-	kobject_put(&cm_dev->dev_obj);
+	device_unregister(cm_dev->device);
 }
 }
 
 
-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_device *cm_dev;
 	struct cm_port *port;
 	struct cm_port *port;
@@ -3770,7 +3760,7 @@ static void cm_remove_one(struct ib_device *device)
 	unsigned long flags;
 	unsigned long flags;
 	int i;
 	int i;
 
 
-	cm_dev = ib_get_client_data(device, &cm_client);
+	cm_dev = ib_get_client_data(ib_device, &cm_client);
 	if (!cm_dev)
 	if (!cm_dev)
 		return;
 		return;
 
 
@@ -3778,14 +3768,14 @@ static void cm_remove_one(struct ib_device *device)
 	list_del(&cm_dev->list);
 	list_del(&cm_dev->list);
 	write_unlock_irqrestore(&cm.device_lock, flags);
 	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];
 		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);
 		ib_unregister_mad_agent(port->mad_agent);
 		flush_workqueue(cm.wq);
 		flush_workqueue(cm.wq);
 		cm_remove_port_fs(port);
 		cm_remove_port_fs(port);
 	}
 	}
-	kobject_put(&cm_dev->dev_obj);
+	device_unregister(cm_dev->device);
 }
 }
 
 
 static int __init ib_cm_init(void)
 static int __init ib_cm_init(void)

+ 1 - 1
drivers/infiniband/hw/ipath/ipath_file_ops.c

@@ -2455,7 +2455,7 @@ static int init_cdev(int minor, char *name, const struct file_operations *fops,
 		goto err_cdev;
 		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)) {
 	if (IS_ERR(device)) {
 		ret = PTR_ERR(device);
 		ret = PTR_ERR(device);

+ 2 - 1
drivers/isdn/capi/capi.c

@@ -1553,7 +1553,8 @@ static int __init capi_init(void)
 		return PTR_ERR(capi_class);
 		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
 #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE
 	if (capinc_tty_init() < 0) {
 	if (capinc_tty_init() < 0) {

+ 2 - 1
drivers/macintosh/adb.c

@@ -862,7 +862,8 @@ adbdev_init(void)
 	adb_dev_class = class_create(THIS_MODULE, "adb");
 	adb_dev_class = class_create(THIS_MODULE, "adb");
 	if (IS_ERR(adb_dev_class))
 	if (IS_ERR(adb_dev_class))
 		return;
 		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_device_register(&adb_pfdev);
 	platform_driver_probe(&adb_pfdrv, adb_dummy_probe);
 	platform_driver_probe(&adb_pfdrv, adb_dummy_probe);

+ 1 - 1
drivers/mca/mca-bus.c

@@ -40,7 +40,7 @@ static struct mca_bus *mca_root_busses[MAX_MCA_BUSSES];
 
 
 struct mca_device_info {
 struct mca_device_info {
 	short pos_id;		/* the 2 byte pos id for this card */
 	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)
 static int mca_bus_match (struct device *dev, struct device_driver *drv)

+ 2 - 2
drivers/media/dvb/dvb-core/dvbdev.c

@@ -233,9 +233,9 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
 
 
 	mutex_unlock(&dvbdev_register_lock);
 	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)),
 			       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)) {
 	if (IS_ERR(clsdev)) {
 		printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n",
 		printk(KERN_ERR "%s: failed to create device dvb%d.%s%d (%ld)\n",
 		       __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
 		       __func__, adap->num, dnames[type], id, PTR_ERR(clsdev));

+ 2 - 2
drivers/memstick/host/jmb38x_ms.c

@@ -51,7 +51,7 @@ struct jmb38x_ms_host {
 	void __iomem            *addr;
 	void __iomem            *addr;
 	spinlock_t              lock;
 	spinlock_t              lock;
 	int                     id;
 	int                     id;
-	char                    host_id[DEVICE_ID_SIZE];
+	char                    host_id[32];
 	int                     irq;
 	int                     irq;
 	unsigned int            block_pos;
 	unsigned int            block_pos;
 	unsigned long           timeout_jiffies;
 	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);
 	spin_lock_init(&host->lock);
 	host->id = cnt;
 	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->id);
 	host->irq = jm->pdev->irq;
 	host->irq = jm->pdev->irq;
 	host->timeout_jiffies = msecs_to_jiffies(1000);
 	host->timeout_jiffies = msecs_to_jiffies(1000);

+ 2 - 1
drivers/message/fusion/mptbase.c

@@ -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);
 	INIT_DELAYED_WORK(&ioc->fault_reset_work, mpt_fault_reset_work);
 	spin_lock_init(&ioc->fault_reset_work_lock);
 	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 =
 	ioc->reset_work_q =
 		create_singlethread_workqueue(ioc->reset_work_q_name);
 		create_singlethread_workqueue(ioc->reset_work_q_name);
 	if (!ioc->reset_work_q) {
 	if (!ioc->reset_work_q) {

+ 2 - 2
drivers/message/fusion/mptbase.h

@@ -707,12 +707,12 @@ typedef struct _MPT_ADAPTER
 	u8			 fc_link_speed[2];
 	u8			 fc_link_speed[2];
 	spinlock_t		 fc_rescan_work_lock;
 	spinlock_t		 fc_rescan_work_lock;
 	struct work_struct	 fc_rescan_work;
 	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 workqueue_struct *fc_rescan_work_q;
 	struct scsi_cmnd	**ScsiLookup;
 	struct scsi_cmnd	**ScsiLookup;
 	spinlock_t		  scsi_lookup_lock;
 	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 workqueue_struct *reset_work_q;
 	struct delayed_work	 fault_reset_work;
 	struct delayed_work	 fault_reset_work;
 	spinlock_t		 fault_reset_work_lock;
 	spinlock_t		 fault_reset_work_lock;

+ 2 - 2
drivers/message/fusion/mptfc.c

@@ -1326,8 +1326,8 @@ mptfc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
 
 	/* initialize workqueue */
 	/* 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 =
 	ioc->fc_rescan_work_q =
 		create_singlethread_workqueue(ioc->fc_rescan_work_q_name);
 		create_singlethread_workqueue(ioc->fc_rescan_work_q_name);
 	if (!ioc->fc_rescan_work_q)
 	if (!ioc->fc_rescan_work_q)

Some files were not shown because too many files changed in this diff