diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-26 17:33:22 -0800 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-01-26 17:33:22 -0800 |
| commit | 9037c1ff433a050075b49abe85b78e5d5bee6414 (patch) | |
| tree | 4d33243d56723426e326ff5a6a75326d13ec7c3e /pending | |
| parent | 41d00006d0ba4ce75bf2c9b4f50aeeae918bd45c (diff) | |
| download | patches-9037c1ff433a050075b49abe85b78e5d5bee6414.tar.gz | |
move some patches that aren't ready for prime-time to pending
Diffstat (limited to 'pending')
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; |
