From wfp5p@virginia.edu Mon Jul 27 14:10:23 2009 From: Bill Pemberton Date: Mon, 27 Jul 2009 16:47:36 -0400 Subject: Staging: hv: check return value of device_register() To: greg@kroah.com Cc: hjanssen@microsoft.com Message-ID: <1248727665-23969-15-git-send-email-wfp5p@virginia.edu> Signed-off-by: Bill Pemberton Cc: Hank Janssen Signed-off-by: Greg Kroah-Hartman --- drivers/staging/hv/blkvsc_drv.c | 2 +- drivers/staging/hv/include/vmbus.h | 3 +-- drivers/staging/hv/netvsc_drv.c | 2 +- drivers/staging/hv/storvsc_drv.c | 2 +- drivers/staging/hv/vmbus_drv.c | 20 +++++++++++++++++--- 5 files changed, 21 insertions(+), 8 deletions(-) --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -192,7 +192,7 @@ int blkvsc_drv_init(PFN_DRIVERINITIALIZE drv_ctx->shutdown = blkvsc_shutdown; /* The driver belongs to vmbus */ - vmbus_child_driver_register(drv_ctx); + ret = vmbus_child_driver_register(drv_ctx); DPRINT_EXIT(BLKVSC_DRV); --- a/drivers/staging/hv/include/vmbus.h +++ b/drivers/staging/hv/include/vmbus.h @@ -82,8 +82,7 @@ static inline struct driver_context *dri /* Vmbus interface */ -void -vmbus_child_driver_register( +int vmbus_child_driver_register( struct driver_context* driver_ctx ); --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -114,7 +114,7 @@ int netvsc_drv_init(PFN_DRIVERINITIALIZE drv_ctx->remove = netvsc_remove; /* The driver belongs to vmbus */ - vmbus_child_driver_register(drv_ctx); + ret = vmbus_child_driver_register(drv_ctx); DPRINT_EXIT(NETVSC_DRV); --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -162,7 +162,7 @@ int storvsc_drv_init(PFN_DRIVERINITIALIZ drv_ctx->remove = storvsc_remove; /* The driver belongs to vmbus */ - vmbus_child_driver_register(drv_ctx); + ret = vmbus_child_driver_register(drv_ctx); DPRINT_EXIT(STORVSC_DRV); --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -435,7 +435,18 @@ int vmbus_bus_init(PFN_DRIVERINITIALIZE dev_ctx->device.release = vmbus_bus_release; /* Setup the bus as root device */ - device_register(&dev_ctx->device); + ret = device_register(&dev_ctx->device); + if (ret) + { + DPRINT_ERR(VMBUS_DRV, "ERROR - Unable to register vmbus root device"); + + free_irq(vmbus_irq, NULL); + bus_unregister(&vmbus_drv_ctx->bus); + + ret = -1; + goto cleanup; + } + vmbus_drv_obj->GetChannelOffers(); @@ -491,9 +502,10 @@ Name: vmbus_child_driver_register() Desc: Register a vmbus's child driver --*/ -void vmbus_child_driver_register(struct driver_context* driver_ctx) +int vmbus_child_driver_register(struct driver_context* driver_ctx) { VMBUS_DRIVER_OBJECT *vmbus_drv_obj=&g_vmbus_drv.drv_obj; + int ret; DPRINT_ENTER(VMBUS_DRV); @@ -502,11 +514,13 @@ void vmbus_child_driver_register(struct /* The child driver on this vmbus */ driver_ctx->driver.bus = &g_vmbus_drv.bus; - driver_register(&driver_ctx->driver); + ret = driver_register(&driver_ctx->driver); vmbus_drv_obj->GetChannelOffers(); DPRINT_EXIT(VMBUS_DRV); + + return ret; } EXPORT_SYMBOL(vmbus_child_driver_register);