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;