aboutsummaryrefslogtreecommitdiffstats
path: root/pending
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2009-01-26 17:33:22 -0800
committerGreg Kroah-Hartman <gregkh@suse.de>2009-01-26 17:33:22 -0800
commit9037c1ff433a050075b49abe85b78e5d5bee6414 (patch)
tree4d33243d56723426e326ff5a6a75326d13ec7c3e /pending
parent41d00006d0ba4ce75bf2c9b4f50aeeae918bd45c (diff)
downloadpatches-9037c1ff433a050075b49abe85b78e5d5bee6414.tar.gz
move some patches that aren't ready for prime-time to pending
Diffstat (limited to 'pending')
-rw-r--r--pending/driver-core-add-dev_init_and_add.patch73
-rw-r--r--pending/driver-core-device_initialize-can-return-a-value.patch103
-rw-r--r--pending/driver-core-fixup-device_initialize-return-value-usages.patch792
-rw-r--r--pending/move-acpi-to-use-device_init_and_add.patch45
4 files changed, 1013 insertions, 0 deletions
diff --git a/pending/driver-core-add-dev_init_and_add.patch b/pending/driver-core-add-dev_init_and_add.patch
new file mode 100644
index 00000000000000..71524c890b6e02
--- /dev/null
+++ b/pending/driver-core-add-dev_init_and_add.patch
@@ -0,0 +1,73 @@
+From foo@baz Sun Jan 25 21:05:55 PST 2009
+Date: Sun, 25 Jan 2009 21:05:55 -0800
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Driver core: add dev_init_and_add()
+
+Lots of times code calls device_initialize() and then device_add(), so
+put the two together to make it easier for people to remember what needs
+to be set up to do this properly. It also handles all of the error
+handling in one convenient place.
+
+Cc: Kay Sievers <kay.sievers@vrfy.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/base/core.c | 30 ++++++++++++++++++++++++++++++
+ include/linux/device.h | 6 ++++++
+ 2 files changed, 36 insertions(+)
+
+--- a/drivers/base/core.c
++++ b/drivers/base/core.c
+@@ -1315,6 +1315,36 @@ void root_device_unregister(struct devic
+ }
+ EXPORT_SYMBOL_GPL(root_device_unregister);
+
++int device_init_and_add(struct device *dev, struct device *parent,
++ struct bus_type *bus,
++ void (*release)(struct device *dev),
++ const char *name, ...)
++{
++ va_list vargs;
++ int err;
++
++ if (release == NULL) {
++ printk(KERN_ERR "%s must have a valid release function\n",
++ __func__);
++ WARN_ON(1);
++ return -EINVAL;
++ }
++
++ dev->parent = parent;
++ dev->bus = bus;
++ dev->release = release;
++
++ device_initialize(dev);
++
++ va_start(vargs, name);
++ err = kobject_set_name_vargs(&dev->kobj, name, vargs);
++ va_end(vargs);
++ if (err)
++ return err;
++
++ return device_add(dev);
++}
++EXPORT_SYMBOL_GPL(device_init_and_add);
+
+ static void device_create_release(struct device *dev)
+ {
+--- a/include/linux/device.h
++++ b/include/linux/device.h
+@@ -472,6 +472,12 @@ extern int __must_check device_register(
+ extern void device_unregister(struct device *dev);
+ extern void device_initialize(struct device *dev);
+ extern int __must_check device_add(struct device *dev);
++extern int __must_check device_init_and_add(struct device *dev,
++ struct device *parent,
++ struct bus_type *bus,
++ void (*release)(struct device *dev),
++ const char *name, ...)
++ __attribute__((format(printf, 5, 6)));
+ extern void device_del(struct device *dev);
+ extern int device_for_each_child(struct device *dev, void *data,
+ int (*fn)(struct device *dev, void *data));
diff --git a/pending/driver-core-device_initialize-can-return-a-value.patch b/pending/driver-core-device_initialize-can-return-a-value.patch
new file mode 100644
index 00000000000000..1a175c9f0c613a
--- /dev/null
+++ b/pending/driver-core-device_initialize-can-return-a-value.patch
@@ -0,0 +1,103 @@
+From foo@baz Sun Jan 25 20:47:00 PST 2009
+Date: Sun, 25 Jan 2009 20:47:00 -0800
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Driver core: device_initialize can return a value
+
+Make device_initialize return a value if everything went well or not.
+This allows us in the future to change the function to allocate memory
+and properly handle error conditions.
+
+It is not marked __must_check yet, as the rest of the kernel tree has
+not been fixed to check the value yet. That will be in future patches.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ drivers/base/core.c | 13 ++++++++++---
+ drivers/base/platform.c | 13 ++++++++++---
+ include/linux/device.h | 2 +-
+ 3 files changed, 21 insertions(+), 7 deletions(-)
+
+--- a/drivers/base/core.c
++++ b/drivers/base/core.c
+@@ -538,7 +538,7 @@ static void klist_children_put(struct kl
+ * NOTE: Use put_device() to give up your reference instead of freeing
+ * @dev directly once you have called this function.
+ */
+-void device_initialize(struct device *dev)
++int device_initialize(struct device *dev)
+ {
+ dev->kobj.kset = devices_kset;
+ kobject_init(&dev->kobj, &device_ktype);
+@@ -549,6 +549,7 @@ void device_initialize(struct device *de
+ device_init_wakeup(dev, 0);
+ device_pm_init(dev);
+ set_dev_node(dev, -1);
++ return 0;
+ }
+
+ #ifdef CONFIG_SYSFS_DEPRECATED
+@@ -999,7 +1000,11 @@ done:
+ */
+ int device_register(struct device *dev)
+ {
+- device_initialize(dev);
++ int retval;
++
++ retval = device_initialize(dev);
++ if (retval)
++ return retval;
+ return device_add(dev);
+ }
+
+@@ -1334,7 +1339,9 @@ int device_init_and_add(struct device *d
+ dev->bus = bus;
+ dev->release = release;
+
+- device_initialize(dev);
++ err = device_initialize(dev);
++ if (err)
++ return err;
+
+ va_start(vargs, name);
+ err = kobject_set_name_vargs(&dev->kobj, name, vargs);
+--- a/drivers/base/platform.c
++++ b/drivers/base/platform.c
+@@ -165,8 +165,11 @@ struct platform_device *platform_device_
+ strcpy(pa->name, name);
+ pa->pdev.name = pa->name;
+ pa->pdev.id = id;
+- device_initialize(&pa->pdev.dev);
+- pa->pdev.dev.release = platform_device_release;
++ if (device_initialize(&pa->pdev.dev)) {
++ kfree(pa);
++ pa = NULL;
++ } else
++ pa->pdev.dev.release = platform_device_release;
+ }
+
+ return pa ? &pa->pdev : NULL;
+@@ -321,7 +324,11 @@ EXPORT_SYMBOL_GPL(platform_device_del);
+ */
+ int platform_device_register(struct platform_device *pdev)
+ {
+- device_initialize(&pdev->dev);
++ int retval;
++
++ retval = device_initialize(&pdev->dev);
++ if (retval)
++ return retval;
+ return platform_device_add(pdev);
+ }
+ EXPORT_SYMBOL_GPL(platform_device_register);
+--- a/include/linux/device.h
++++ b/include/linux/device.h
+@@ -470,7 +470,7 @@ void driver_init(void);
+ */
+ extern int __must_check device_register(struct device *dev);
+ extern void device_unregister(struct device *dev);
+-extern void device_initialize(struct device *dev);
++extern int device_initialize(struct device *dev);
+ extern int __must_check device_add(struct device *dev);
+ extern int __must_check device_init_and_add(struct device *dev,
+ struct device *parent,
diff --git a/pending/driver-core-fixup-device_initialize-return-value-usages.patch b/pending/driver-core-fixup-device_initialize-return-value-usages.patch
new file mode 100644
index 00000000000000..2de77b295887d7
--- /dev/null
+++ b/pending/driver-core-fixup-device_initialize-return-value-usages.patch
@@ -0,0 +1,792 @@
+Subject: driver core: fixup device_initialize() return value usages
+
+all over the place...
+
+---
+ arch/mips/kernel/vpe.c | 6 +++++-
+ block/genhd.c | 6 +++++-
+ drivers/base/attribute_container.c | 6 +++++-
+ drivers/firewire/fw-device.c | 4 +++-
+ drivers/hid/hid-core.c | 6 +++++-
+ drivers/scsi/hosts.c | 8 ++++++--
+ drivers/scsi/libfc/fc_rport.c | 6 +++++-
+ drivers/scsi/raid_class.c | 6 +++++-
+ drivers/scsi/scsi_priv.h | 2 +-
+ drivers/scsi/scsi_scan.c | 14 ++++++++++++--
+ drivers/scsi/scsi_sysfs.c | 12 +++++++++---
+ drivers/scsi/scsi_transport_fc.c | 12 ++++++++++--
+ drivers/scsi/scsi_transport_iscsi.c | 5 ++++-
+ drivers/scsi/scsi_transport_sas.c | 22 ++++++++++++++++++----
+ drivers/scsi/scsi_transport_srp.c | 6 +++++-
+ drivers/scsi/sd.c | 3 ++-
+ drivers/spi/spi.c | 13 +++++++++++--
+ drivers/usb/core/message.c | 8 +++++++-
+ drivers/usb/core/usb.c | 7 ++++++-
+ drivers/usb/gadget/atmel_usba_udc.c | 4 +++-
+ drivers/usb/gadget/fsl_qe_udc.c | 4 +++-
+ drivers/usb/gadget/imx_udc.c | 4 +++-
+ drivers/usb/gadget/lh7a40x_udc.c | 4 +++-
+ drivers/usb/gadget/m66592-udc.c | 4 +++-
+ drivers/usb/gadget/omap_udc.c | 7 ++++++-
+ drivers/usb/gadget/pxa25x_udc.c | 4 +++-
+ drivers/usb/gadget/pxa27x_udc.c | 4 +++-
+ drivers/usb/gadget/s3c2410_udc.c | 4 +++-
+ drivers/uwb/lc-dev.c | 15 ++++++++++++---
+ drivers/uwb/lc-rc.c | 14 +++++++++++---
+ drivers/uwb/uwb-internal.h | 2 +-
+ fs/partitions/check.c | 4 +++-
+ include/linux/uwb.h | 2 +-
+ net/bluetooth/hci_sysfs.c | 3 ++-
+ net/core/dev.c | 4 +++-
+ net/core/net-sysfs.c | 4 ++--
+ net/core/net-sysfs.h | 2 +-
+ net/rfkill/rfkill.c | 10 ++++++++--
+ net/wireless/core.c | 9 ++++++++-
+ 39 files changed, 206 insertions(+), 54 deletions(-)
+
+--- a/arch/mips/kernel/vpe.c
++++ b/arch/mips/kernel/vpe.c
+@@ -1451,7 +1451,11 @@ static int __init vpe_module_init(void)
+ goto out_chrdev;
+ }
+
+- device_initialize(&vpe_device);
++ err = device_initialize(&vpe_device);
++ if (err) {
++ printk(KERN_ERR "Initializing vpe_device failed\n");
++ goto out_class;
++ }
+ vpe_device.class = &vpe_class,
+ vpe_device.parent = NULL,
+ dev_set_name(&vpe_device, "vpe1");
+--- a/block/genhd.c
++++ b/block/genhd.c
+@@ -1129,7 +1129,11 @@ struct gendisk *alloc_disk_node(int mino
+ rand_initialize_disk(disk);
+ disk_to_dev(disk)->class = &block_class;
+ disk_to_dev(disk)->type = &disk_type;
+- device_initialize(disk_to_dev(disk));
++ if (device_initialize(disk_to_dev(disk))) {
++ free_part_stats(&disk->part0);
++ kfree(disk);
++ return NULL;
++ }
+ INIT_WORK(&disk->async_notify,
+ media_change_notify_thread);
+ }
+--- a/drivers/base/attribute_container.c
++++ b/drivers/base/attribute_container.c
+@@ -163,7 +163,11 @@ attribute_container_add_device(struct de
+ }
+
+ ic->cont = cont;
+- device_initialize(&ic->classdev);
++ if (device_initialize(&ic->classdev)) {
++ dev_err(dev, "failed to initialize class container\n");
++ kfree(ic);
++ continue;
++ }
+ ic->classdev.parent = get_device(dev);
+ ic->classdev.class = cont->class;
+ cont->class->dev_release = attribute_container_release;
+--- a/drivers/firewire/fw-device.c
++++ b/drivers/firewire/fw-device.c
+@@ -696,7 +696,9 @@ static void fw_device_init(struct work_s
+ return;
+ }
+
+- device_initialize(&device->device);
++ err = device_initialize(&device->device);
++ if (err)
++ goto error;
+
+ fw_device_get(device);
+ down_write(&fw_device_rwsem);
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1732,7 +1732,11 @@ struct hid_device *hid_allocate_device(v
+ if (hdev == NULL)
+ return ERR_PTR(ret);
+
+- device_initialize(&hdev->dev);
++ ret = device_initialize(&hdev->dev);
++ if (ret) {
++ kfree(hdev);
++ return ERR_PTR(ret);
++ }
+ hdev->dev.release = hid_device_release;
+ hdev->dev.bus = &hid_bus_type;
+
+--- a/drivers/scsi/hosts.c
++++ b/drivers/scsi/hosts.c
+@@ -387,14 +387,18 @@ struct Scsi_Host *scsi_host_alloc(struct
+ else
+ shost->dma_boundary = 0xffffffff;
+
+- device_initialize(&shost->shost_gendev);
++ rval = device_initialize(&shost->shost_gendev);
++ if (rval)
++ goto fail_kfree;
+ dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
+ #ifndef CONFIG_SYSFS_DEPRECATED
+ shost->shost_gendev.bus = &scsi_bus_type;
+ #endif
+ shost->shost_gendev.type = &scsi_host_type;
+
+- device_initialize(&shost->shost_dev);
++ rval = device_initialize(&shost->shost_dev);
++ if (rval)
++ goto fail_kfree;
+ shost->shost_dev.parent = &shost->shost_gendev;
+ shost->shost_dev.class = &shost_class;
+ dev_set_name(&shost->shost_dev, "host%d", shost->host_no);
+--- a/drivers/scsi/libfc/fc_rport.c
++++ b/drivers/scsi/libfc/fc_rport.c
+@@ -121,7 +121,11 @@ struct fc_rport *fc_rport_rogue_create(s
+ * Note: all this libfc rogue rport code will be removed for
+ * upstream so it fine that this is really ugly and hacky right now.
+ */
+- device_initialize(&rport->dev);
++ if (device_initialize(&rport->dev)) {
++ kfree(rport);
++ return NULL;
++ }
++
+ rport->dev.release = fc_rport_rogue_destroy;
+
+ mutex_init(&rdata->rp_mutex);
+--- a/drivers/scsi/raid_class.c
++++ b/drivers/scsi/raid_class.c
+@@ -232,7 +232,11 @@ int raid_component_add(struct raid_templ
+ return -ENOMEM;
+
+ INIT_LIST_HEAD(&rc->node);
+- device_initialize(&rc->dev);
++ err = device_initialize(&rc->dev);
++ if (err) {
++ kfree(rc);
++ return err;
++ }
+ rc->dev.release = raid_component_release;
+ rc->dev.parent = get_device(component_dev);
+ rc->num = rd->component_count++;
+--- a/drivers/scsi/scsi_priv.h
++++ b/drivers/scsi/scsi_priv.h
+@@ -114,7 +114,7 @@ extern int scsi_sysfs_add_sdev(struct sc
+ extern int scsi_sysfs_add_host(struct Scsi_Host *);
+ extern int scsi_sysfs_register(void);
+ extern void scsi_sysfs_unregister(void);
+-extern void scsi_sysfs_device_initialize(struct scsi_device *);
++extern int scsi_sysfs_device_initialize(struct scsi_device *);
+ extern int scsi_sysfs_target_initialize(struct scsi_device *);
+ extern struct scsi_transport_template blank_transport_template;
+ extern void __scsi_remove_device(struct scsi_device *);
+--- a/drivers/scsi/scsi_scan.c
++++ b/drivers/scsi/scsi_scan.c
+@@ -299,7 +299,12 @@ static struct scsi_device *scsi_alloc_sd
+ sdev->request_queue->queuedata = sdev;
+ scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
+
+- scsi_sysfs_device_initialize(sdev);
++ ret = scsi_sysfs_device_initialize(sdev);
++ if (ret) {
++ put_device(&starget->dev);
++ kfree(sdev);
++ goto out;
++ }
+
+ if (shost->hostt->slave_alloc) {
+ ret = shost->hostt->slave_alloc(sdev);
+@@ -411,7 +416,12 @@ static struct scsi_target *scsi_alloc_ta
+ return NULL;
+ }
+ dev = &starget->dev;
+- device_initialize(dev);
++ error = device_initialize(dev);
++ if (error) {
++ printk(KERN_ERR "%s: device_initialize failure\n", __func__);
++ kfree(starget);
++ return NULL;
++ }
+ starget->reap_ref = 1;
+ dev->parent = get_device(parent);
+ dev_set_name(dev, "target%d:%d:%d", shost->host_no, channel, id);
+--- a/drivers/scsi/scsi_sysfs.c
++++ b/drivers/scsi/scsi_sysfs.c
+@@ -1070,19 +1070,24 @@ static struct device_type scsi_dev_type
+ .groups = scsi_sdev_attr_groups,
+ };
+
+-void scsi_sysfs_device_initialize(struct scsi_device *sdev)
++int scsi_sysfs_device_initialize(struct scsi_device *sdev)
+ {
+ unsigned long flags;
+ struct Scsi_Host *shost = sdev->host;
+ struct scsi_target *starget = sdev->sdev_target;
++ int error;
+
+- device_initialize(&sdev->sdev_gendev);
++ error = device_initialize(&sdev->sdev_gendev);
++ if (error)
++ return error;
+ sdev->sdev_gendev.bus = &scsi_bus_type;
+ sdev->sdev_gendev.type = &scsi_dev_type;
+ dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%d",
+ sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
+
+- device_initialize(&sdev->sdev_dev);
++ error = device_initialize(&sdev->sdev_dev);
++ if (error)
++ return error;
+ sdev->sdev_dev.parent = &sdev->sdev_gendev;
+ sdev->sdev_dev.class = &sdev_class;
+ dev_set_name(&sdev->sdev_dev, "%d:%d:%d:%d",
+@@ -1093,6 +1098,7 @@ void scsi_sysfs_device_initialize(struct
+ list_add_tail(&sdev->same_target_siblings, &starget->devices);
+ list_add_tail(&sdev->siblings, &shost->__devices);
+ spin_unlock_irqrestore(shost->host_lock, flags);
++ return 0;
+ }
+
+ int scsi_is_sdev_device(const struct device *dev)
+--- a/drivers/scsi/scsi_transport_fc.c
++++ b/drivers/scsi/scsi_transport_fc.c
+@@ -2487,7 +2487,11 @@ fc_rport_create(struct Scsi_Host *shost,
+ spin_unlock_irqrestore(shost->host_lock, flags);
+
+ dev = &rport->dev;
+- device_initialize(dev); /* takes self reference */
++ error = device_initialize(dev); /* takes self reference */
++ if (error) {
++ printk(KERN_ERR "FC Remote Port device_initialize failed\n");
++ goto delete_rport;
++ }
+ dev->parent = get_device(&shost->shost_gendev); /* parent reference */
+ dev->release = fc_rport_dev_release;
+ dev_set_name(dev, "rport-%d:%d-%d",
+@@ -3178,7 +3182,11 @@ fc_vport_setup(struct Scsi_Host *shost,
+ spin_unlock_irqrestore(shost->host_lock, flags);
+
+ dev = &vport->dev;
+- device_initialize(dev); /* takes self reference */
++ error = device_initialize(dev); /* takes self reference */
++ if (error) { /* takes self reference */
++ printk(KERN_ERR "FC Virtual Port device_initialize failed\n");
++ goto delete_vport;
++ }
+ dev->parent = get_device(pdev); /* takes parent reference */
+ dev->release = fc_vport_dev_release;
+ dev_set_name(dev, "vport-%d:%d-%d",
+--- a/drivers/scsi/scsi_transport_iscsi.c
++++ b/drivers/scsi/scsi_transport_iscsi.c
+@@ -670,7 +670,10 @@ iscsi_alloc_session(struct Scsi_Host *sh
+ scsi_host_get(shost);
+ session->dev.parent = &shost->shost_gendev;
+ session->dev.release = iscsi_session_release;
+- device_initialize(&session->dev);
++ if (device_initialize(&session->dev)) {
++ kfree(session);
++ return NULL;
++ }
+ if (dd_size)
+ session->dd_data = &session[1];
+ return session;
+--- a/drivers/scsi/scsi_transport_sas.c
++++ b/drivers/scsi/scsi_transport_sas.c
+@@ -623,7 +623,10 @@ struct sas_phy *sas_phy_alloc(struct dev
+ phy->number = number;
+ phy->enabled = 1;
+
+- device_initialize(&phy->dev);
++ if (device_initialize(&phy->dev)) {
++ kfree(phy);
++ return NULL;
++ }
+ phy->dev.parent = get_device(parent);
+ phy->dev.release = sas_phy_release;
+ INIT_LIST_HEAD(&phy->port_siblings);
+@@ -811,7 +814,10 @@ struct sas_port *sas_port_alloc(struct d
+
+ port->port_identifier = port_id;
+
+- device_initialize(&port->dev);
++ if (device_initialize(&port->dev)) {
++ kfree(port);
++ return NULL;
++ }
+
+ port->dev.parent = get_device(parent);
+ port->dev.release = sas_port_release;
+@@ -1363,7 +1369,11 @@ struct sas_rphy *sas_end_device_alloc(st
+ return NULL;
+ }
+
+- device_initialize(&rdev->rphy.dev);
++ if (device_initialize(&rdev->rphy.dev)) {
++ kfree(rdev);
++ return NULL;
++ }
++
+ rdev->rphy.dev.parent = get_device(&parent->dev);
+ rdev->rphy.dev.release = sas_end_device_release;
+ if (scsi_is_sas_expander_device(parent->dev.parent)) {
+@@ -1407,7 +1417,11 @@ struct sas_rphy *sas_expander_alloc(stru
+ return NULL;
+ }
+
+- device_initialize(&rdev->rphy.dev);
++ if (device_initialize(&rdev->rphy.dev)) {
++ kfree(rdev);
++ return NULL;
++ }
++
+ rdev->rphy.dev.parent = get_device(&parent->dev);
+ rdev->rphy.dev.release = sas_expander_release;
+ mutex_lock(&sas_host->lock);
+--- a/drivers/scsi/scsi_transport_srp.c
++++ b/drivers/scsi/scsi_transport_srp.c
+@@ -203,7 +203,11 @@ struct srp_rport *srp_rport_add(struct S
+ if (!rport)
+ return ERR_PTR(-ENOMEM);
+
+- device_initialize(&rport->dev);
++ ret = device_initialize(&rport->dev);
++ if (ret) {
++ kfree(rport);
++ return ERR_PTR(ret);
++ }
+
+ rport->dev.parent = get_device(parent);
+ rport->dev.release = srp_rport_release;
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1827,7 +1827,8 @@ static void sd_probe_async(void *data, a
+ SD_MOD_TIMEOUT);
+ }
+
+- device_initialize(&sdkp->dev);
++ if (device_initialize(&sdkp->dev))
++ goto out_free_index;
+ sdkp->dev.parent = &sdp->sdev_gendev;
+ sdkp->dev.class = &sd_disk_class;
+ dev_set_name(&sdkp->dev, dev_name(&sdp->sdev_gendev));
+--- a/drivers/spi/spi.c
++++ b/drivers/spi/spi.c
+@@ -199,6 +199,7 @@ struct spi_device *spi_alloc_device(stru
+ {
+ struct spi_device *spi;
+ struct device *dev = master->dev.parent;
++ int retval;
+
+ if (!spi_master_get(master))
+ return NULL;
+@@ -214,7 +215,12 @@ struct spi_device *spi_alloc_device(stru
+ spi->dev.parent = dev;
+ spi->dev.bus = &spi_bus_type;
+ spi->dev.release = spidev_release;
+- device_initialize(&spi->dev);
++ retval = device_initialize(&spi->dev);
++ if (retval) {
++ spi_master_put(master);
++ kfree(spi);
++ spi = NULL;
++ }
+ return spi;
+ }
+ EXPORT_SYMBOL_GPL(spi_alloc_device);
+@@ -446,7 +452,10 @@ struct spi_master *spi_alloc_master(stru
+ if (!master)
+ return NULL;
+
+- device_initialize(&master->dev);
++ if (device_initialize(&master->dev)) {
++ kfree(master);
++ return NULL;
++ }
+ master->dev.class = &spi_master_class;
+ master->dev.parent = get_device(dev);
+ spi_master_set_devdata(master, &master[1]);
+--- a/drivers/usb/core/message.c
++++ b/drivers/usb/core/message.c
+@@ -1706,7 +1706,13 @@ free_interfaces:
+ intf->dev.groups = usb_interface_groups;
+ intf->dev.dma_mask = dev->dev.dma_mask;
+ INIT_WORK(&intf->reset_ws, __usb_queue_reset_device);
+- device_initialize(&intf->dev);
++ ret = device_initialize(&intf->dev);
++ if (ret) {
++ printk(KERN_ERR
++ "USB: something bad happened in device_initialize(): %d\n",
++ ret);
++ goto free_interfaces;
++ }
+ mark_quiesced(intf);
+ dev_set_name(&intf->dev, "%d-%s:%d.%d",
+ dev->bus->busnum, dev->devpath,
+--- a/drivers/usb/core/usb.c
++++ b/drivers/usb/core/usb.c
+@@ -339,6 +339,7 @@ struct usb_device *usb_alloc_dev(struct
+ struct usb_device *dev;
+ struct usb_hcd *usb_hcd = container_of(bus, struct usb_hcd, self);
+ unsigned root_hub = 0;
++ int ret;
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+@@ -349,7 +350,11 @@ struct usb_device *usb_alloc_dev(struct
+ return NULL;
+ }
+
+- device_initialize(&dev->dev);
++ ret = device_initialize(&dev->dev);
++ if (ret) {
++ kfree(dev);
++ return NULL;
++ }
+ dev->dev.bus = &usb_bus_type;
+ dev->dev.type = &usb_device_type;
+ dev->dev.groups = usb_device_groups;
+--- a/drivers/usb/gadget/atmel_usba_udc.c
++++ b/drivers/usb/gadget/atmel_usba_udc.c
+@@ -1928,7 +1928,9 @@ static int __init usba_udc_probe(struct
+ dev_info(&pdev->dev, "FIFO at 0x%08lx mapped at %p\n",
+ (unsigned long)fifo->start, udc->fifo);
+
+- device_initialize(&udc->gadget.dev);
++ ret = device_initialize(&udc->gadget.dev);
++ if (ret)
++ goto err_alloc_ep;
+ udc->gadget.dev.parent = &pdev->dev;
+ udc->gadget.dev.dma_mask = pdev->dev.dma_mask;
+
+--- a/drivers/usb/gadget/fsl_qe_udc.c
++++ b/drivers/usb/gadget/fsl_qe_udc.c
+@@ -2549,7 +2549,9 @@ static int __devinit qe_udc_probe(struct
+ /* name: Identifies the controller hardware type. */
+ udc_controller->gadget.name = driver_name;
+
+- device_initialize(&udc_controller->gadget.dev);
++ ret = device_initialize(&udc_controller->gadget.dev);
++ if (ret)
++ goto err2;
+
+ dev_set_name(&udc_controller->gadget.dev, "gadget");
+
+--- a/drivers/usb/gadget/imx_udc.c
++++ b/drivers/usb/gadget/imx_udc.c
+@@ -1472,7 +1472,9 @@ static int __init imx_udc_probe(struct p
+ imx_usb->clk = clk;
+ imx_usb->dev = &pdev->dev;
+
+- device_initialize(&imx_usb->gadget.dev);
++ ret = device_initialize(&imx_usb->gadget.dev);
++ if (ret)
++ goto fail3;
+
+ imx_usb->gadget.dev.parent = &pdev->dev;
+ imx_usb->gadget.dev.dma_mask = pdev->dev.dma_mask;
+--- a/drivers/usb/gadget/lh7a40x_udc.c
++++ b/drivers/usb/gadget/lh7a40x_udc.c
+@@ -2070,7 +2070,9 @@ static int lh7a40x_udc_probe(struct plat
+ spin_lock_init(&dev->lock);
+ dev->dev = &pdev->dev;
+
+- device_initialize(&dev->gadget.dev);
++ retval = device_initialize(&dev->gadget.dev);
++ if (retval)
++ return retval;
+ dev->gadget.dev.parent = &pdev->dev;
+
+ the_controller = dev;
+--- a/drivers/usb/gadget/m66592-udc.c
++++ b/drivers/usb/gadget/m66592-udc.c
+@@ -1590,7 +1590,9 @@ static int __init m66592_probe(struct pl
+ dev_set_drvdata(&pdev->dev, m66592);
+
+ m66592->gadget.ops = &m66592_gadget_ops;
+- device_initialize(&m66592->gadget.dev);
++ ret = device_initialize(&m66592->gadget.dev);
++ if (ret)
++ goto clean_up;
+ dev_set_name(&m66592->gadget.dev, "gadget");
+ m66592->gadget.is_dualspeed = 1;
+ m66592->gadget.dev.parent = &pdev->dev;
+--- a/drivers/usb/gadget/omap_udc.c
++++ b/drivers/usb/gadget/omap_udc.c
+@@ -2668,6 +2668,7 @@ static int __init
+ omap_udc_setup(struct platform_device *odev, struct otg_transceiver *xceiv)
+ {
+ unsigned tmp, buf;
++ int ret;
+
+ /* abolish any previous hardware state */
+ omap_writew(0, UDC_SYSCON1);
+@@ -2693,7 +2694,11 @@ omap_udc_setup(struct platform_device *o
+ udc->gadget.speed = USB_SPEED_UNKNOWN;
+ udc->gadget.name = driver_name;
+
+- device_initialize(&udc->gadget.dev);
++ ret = device_initialize(&udc->gadget.dev);
++ if (ret) {
++ kfree(udc)
++ return ret;
++ }
+ dev_set_name(&udc->gadget.dev, "gadget");
+ udc->gadget.dev.release = omap_udc_release;
+ udc->gadget.dev.parent = &odev->dev;
+--- a/drivers/usb/gadget/pxa25x_udc.c
++++ b/drivers/usb/gadget/pxa25x_udc.c
+@@ -2188,7 +2188,9 @@ static int __init pxa25x_udc_probe(struc
+ dev->timer.function = udc_watchdog;
+ dev->timer.data = (unsigned long) dev;
+
+- device_initialize(&dev->gadget.dev);
++ retval = device_initialize(&dev->gadget.dev);
++ if (retval)
++ goto err_irq1;
+ dev->gadget.dev.parent = &pdev->dev;
+ dev->gadget.dev.dma_mask = pdev->dev.dma_mask;
+
+--- a/drivers/usb/gadget/pxa27x_udc.c
++++ b/drivers/usb/gadget/pxa27x_udc.c
+@@ -2422,7 +2422,9 @@ static int __init pxa_udc_probe(struct p
+ goto err_map;
+ }
+
+- device_initialize(&udc->gadget.dev);
++ retval = device_initialize(&udc->gadget.dev);
++ if (retval)
++ goto err_irq;
+ udc->gadget.dev.parent = &pdev->dev;
+ udc->gadget.dev.dma_mask = NULL;
+ udc->vbus_sensed = 0;
+--- a/drivers/usb/gadget/s3c2410_udc.c
++++ b/drivers/usb/gadget/s3c2410_udc.c
+@@ -1845,7 +1845,9 @@ static int s3c2410_udc_probe(struct plat
+ goto err_mem;
+ }
+
+- device_initialize(&udc->gadget.dev);
++ retval = device_initialize(&udc->gadget.dev);
++ if (retval)
++ goto err_map;
+ udc->gadget.dev.parent = &pdev->dev;
+ udc->gadget.dev.dma_mask = pdev->dev.dma_mask;
+
+--- a/drivers/uwb/lc-dev.c
++++ b/drivers/uwb/lc-dev.c
+@@ -109,14 +109,19 @@ static void uwb_dev_sys_release(struct d
+ *
+ * Alloc, zero and call this function.
+ */
+-void uwb_dev_init(struct uwb_dev *uwb_dev)
++int uwb_dev_init(struct uwb_dev *uwb_dev)
+ {
++ int ret;
++
+ mutex_init(&uwb_dev->mutex);
+- device_initialize(&uwb_dev->dev);
++ ret = device_initialize(&uwb_dev->dev);
++ if (ret)
++ return ret;
+ uwb_dev->dev.release = uwb_dev_sys_release;
+ uwb_dev_addr_init(&uwb_dev->dev_addr);
+ uwb_mac_addr_init(&uwb_dev->mac_addr);
+ bitmap_fill(uwb_dev->streams, UWB_NUM_GLOBAL_STREAMS);
++ return 0;
+ }
+
+ static ssize_t uwb_dev_EUI_48_show(struct device *dev,
+@@ -434,7 +439,11 @@ void uwbd_dev_onair(struct uwb_rc *rc, s
+ macbuf);
+ return;
+ }
+- uwb_dev_init(uwb_dev); /* This sets refcnt to one, we own it */
++ /* This sets refcnt to one, we own it */
++ result = uwb_dev_init(uwb_dev);
++ if (result)
++ goto error_dev_add;
++
+ uwb_dev->mac_addr = *bce->mac_addr;
+ uwb_dev->dev_addr = bce->dev_addr;
+ dev_set_name(&uwb_dev->dev, macbuf);
+--- a/drivers/uwb/lc-rc.c
++++ b/drivers/uwb/lc-rc.c
+@@ -84,11 +84,14 @@ static void uwb_rc_sys_release(struct de
+ }
+
+
+-void uwb_rc_init(struct uwb_rc *rc)
++int uwb_rc_init(struct uwb_rc *rc)
+ {
+ struct uwb_dev *uwb_dev = &rc->uwb_dev;
++ int result;
+
+- uwb_dev_init(uwb_dev);
++ result = uwb_dev_init(uwb_dev);
++ if (result)
++ return result;
+ rc->uwb_dev.dev.class = &uwb_rc_class;
+ rc->uwb_dev.dev.release = uwb_rc_sys_release;
+ uwb_rc_neh_create(rc);
+@@ -109,10 +112,15 @@ EXPORT_SYMBOL_GPL(uwb_rc_init);
+ struct uwb_rc *uwb_rc_alloc(void)
+ {
+ struct uwb_rc *rc;
++ int result;
++
+ rc = kzalloc(sizeof(*rc), GFP_KERNEL);
+ if (rc == NULL)
+ return NULL;
+- uwb_rc_init(rc);
++ if (uwb_rc_init(rc)) {
++ kfree(rc);
++ rc = NULL;
++ }
+ return rc;
+ }
+ EXPORT_SYMBOL_GPL(uwb_rc_alloc);
+--- a/drivers/uwb/uwb-internal.h
++++ b/drivers/uwb/uwb-internal.h
+@@ -37,7 +37,7 @@
+ struct uwb_beca_e;
+
+ /* General device API */
+-extern void uwb_dev_init(struct uwb_dev *uwb_dev);
++extern int uwb_dev_init(struct uwb_dev *uwb_dev);
+ extern int __uwb_dev_offair(struct uwb_dev *, struct uwb_rc *);
+ extern int uwb_dev_add(struct uwb_dev *uwb_dev, struct device *parent_dev,
+ struct uwb_rc *parent_rc);
+--- a/fs/partitions/check.c
++++ b/fs/partitions/check.c
+@@ -389,7 +389,9 @@ struct hd_struct *add_partition(struct g
+ else
+ dev_set_name(pdev, "%s%d", dname, partno);
+
+- device_initialize(pdev);
++ err = device_initialize(pdev);
++ if (err)
++ goto out_free_stats;
+ pdev->class = &block_class;
+ pdev->type = &part_type;
+ pdev->parent = ddev;
+--- a/include/linux/uwb.h
++++ b/include/linux/uwb.h
+@@ -590,7 +590,7 @@ static inline unsigned __uwb_dev_addr_as
+ * This API is used (in addition to the general API) to implement UWB
+ * Radio Controllers.
+ */
+-void uwb_rc_init(struct uwb_rc *);
++int uwb_rc_init(struct uwb_rc *);
+ int uwb_rc_add(struct uwb_rc *, struct device *dev, void *rc_priv);
+ void uwb_rc_rm(struct uwb_rc *);
+ void uwb_rc_neh_grok(struct uwb_rc *, void *, size_t);
+--- a/net/bluetooth/hci_sysfs.c
++++ b/net/bluetooth/hci_sysfs.c
+@@ -101,6 +101,7 @@ static void add_conn(struct work_struct
+ void hci_conn_add_sysfs(struct hci_conn *conn)
+ {
+ struct hci_dev *hdev = conn->hdev;
++ int retval;
+
+ BT_DBG("conn %p", conn);
+
+@@ -112,7 +113,7 @@ void hci_conn_add_sysfs(struct hci_conn
+
+ dev_set_drvdata(&conn->dev, conn);
+
+- device_initialize(&conn->dev);
++ retval = device_initialize(&conn->dev);
+
+ INIT_WORK(&conn->work, add_conn);
+
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -4409,7 +4409,9 @@ int register_netdevice(struct net_device
+ if (dev->features & NETIF_F_SG)
+ dev->features |= NETIF_F_GSO;
+
+- netdev_initialize_kobject(dev);
++ ret = netdev_initialize_kobject(dev);
++ if (ret)
++ goto err_uninit;
+ ret = netdev_register_kobject(dev);
+ if (ret)
+ goto err_uninit;
+--- a/net/core/net-sysfs.c
++++ b/net/core/net-sysfs.c
+@@ -526,10 +526,10 @@ void netdev_class_remove_file(struct cla
+ EXPORT_SYMBOL(netdev_class_create_file);
+ EXPORT_SYMBOL(netdev_class_remove_file);
+
+-void netdev_initialize_kobject(struct net_device *net)
++int netdev_initialize_kobject(struct net_device *net)
+ {
+ struct device *device = &(net->dev);
+- device_initialize(device);
++ return device_initialize(device);
+ }
+
+ int netdev_kobject_init(void)
+--- a/net/core/net-sysfs.h
++++ b/net/core/net-sysfs.h
+@@ -4,5 +4,5 @@
+ int netdev_kobject_init(void);
+ int netdev_register_kobject(struct net_device *);
+ void netdev_unregister_kobject(struct net_device *);
+-void netdev_initialize_kobject(struct net_device *);
++int netdev_initialize_kobject(struct net_device *);
+ #endif
+--- a/net/rfkill/rfkill.c
++++ b/net/rfkill/rfkill.c
+@@ -671,6 +671,7 @@ struct rfkill * __must_check rfkill_allo
+ {
+ struct rfkill *rfkill;
+ struct device *dev;
++ int retval;
+
+ if (WARN((type >= RFKILL_TYPE_MAX),
+ KERN_WARNING
+@@ -689,10 +690,15 @@ struct rfkill * __must_check rfkill_allo
+ dev = &rfkill->dev;
+ dev->class = &rfkill_class;
+ dev->parent = parent;
+- device_initialize(dev);
++ retval = device_initialize(dev);
++ if (retval) {
++ kfree(rfkill);
++ rfkill = NULL;
++ goto exit;
++ }
+
+ __module_get(THIS_MODULE);
+-
++exit:
+ return rfkill;
+ }
+ EXPORT_SYMBOL(rfkill_allocate);
+--- a/net/wireless/core.c
++++ b/net/wireless/core.c
+@@ -208,6 +208,7 @@ struct wiphy *wiphy_new(struct cfg80211_
+
+ struct cfg80211_registered_device *drv;
+ int alloc_size;
++ int retval;
+
+ WARN_ON(!ops->add_key && ops->del_key);
+ WARN_ON(ops->add_key && !ops->del_key);
+@@ -241,7 +242,13 @@ struct wiphy *wiphy_new(struct cfg80211_
+ mutex_init(&drv->devlist_mtx);
+ INIT_LIST_HEAD(&drv->netdev_list);
+
+- device_initialize(&drv->wiphy.dev);
++ retval = device_initialize(&drv->wiphy.dev);
++ if (retval) {
++ wiphy_counter--;
++ kfree(drv);
++ return NULL;
++ }
++
+ drv->wiphy.dev.class = &ieee80211_class;
+ drv->wiphy.dev.platform_data = drv;
+
diff --git a/pending/move-acpi-to-use-device_init_and_add.patch b/pending/move-acpi-to-use-device_init_and_add.patch
new file mode 100644
index 00000000000000..c1c5ef886f11fe
--- /dev/null
+++ b/pending/move-acpi-to-use-device_init_and_add.patch
@@ -0,0 +1,45 @@
+Subject: move acpi to use device_init_and_add
+
+---
+ drivers/acpi/scan.c | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -423,6 +423,7 @@ static int acpi_device_register(struct a
+ int result;
+ struct acpi_device_bus_id *acpi_device_bus_id, *new_bus_id;
+ int found = 0;
++ struct device *dev_parent = NULL;
+ /*
+ * Linkage
+ * -------
+@@ -458,23 +459,21 @@ static int acpi_device_register(struct a
+ acpi_device_bus_id->instance_no = 0;
+ list_add_tail(&acpi_device_bus_id->node, &acpi_bus_id_list);
+ }
+- dev_set_name(&device->dev, "%s:%02x", acpi_device_bus_id->bus_id, acpi_device_bus_id->instance_no);
+
+ if (device->parent) {
+ list_add_tail(&device->node, &device->parent->children);
+ list_add_tail(&device->g_list, &device->parent->g_list);
++ dev_parent = &parent->dev;
+ } else
+ list_add_tail(&device->g_list, &acpi_device_list);
+ if (device->wakeup.flags.valid)
+ list_add_tail(&device->wakeup_list, &acpi_wakeup_device_list);
+ spin_unlock(&acpi_device_lock);
+
+- if (device->parent)
+- device->dev.parent = &parent->dev;
+- device->dev.bus = &acpi_bus_type;
+- device_initialize(&device->dev);
+- device->dev.release = &acpi_device_release;
+- result = device_add(&device->dev);
++ result = device_init_and_add(&device->dev, dev_parent, &acpi_bus_type,
++ &acpi_device_release, "%s:%02x",
++ acpi_device_bus_id->bus_id,
++ acpi_device_bus_id->instance_no);
+ if(result) {
+ dev_err(&device->dev, "Error adding device\n");
+ goto end;