drivers/block/cpqarray.c: better error handling and kmalloc + memset conversion to k[cz]alloc

This patch removes some redundant casts, does the kmalloc + memset to
k[cz]alloc conversion and it changes the error path to use goto (to avoid code
duplication).

 drivers/block/cpqarray.c | 49567 -> 48623 (-944 bytes)
 drivers/block/cpqarray.o | 178820 -> 178288 (-532 bytes)

Signed-off-by: Mariusz Kozlowski <m.kozlowski@tuxland.pl>
Acked-by: Mike Miller <mike.miller@hp.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
Mariusz Kozlowski 2007-08-11 22:34:30 +02:00 committed by Jens Axboe
parent 1aebe18787
commit 2e4934aa45

View File

@ -420,18 +420,17 @@ static int __init cpqarray_register_ctlr( int i, struct pci_dev *pdev)
goto Enomem2; goto Enomem2;
} }
hba[i]->cmd_pool = (cmdlist_t *)pci_alloc_consistent( hba[i]->cmd_pool = pci_alloc_consistent(
hba[i]->pci_dev, NR_CMDS * sizeof(cmdlist_t), hba[i]->pci_dev, NR_CMDS * sizeof(cmdlist_t),
&(hba[i]->cmd_pool_dhandle)); &(hba[i]->cmd_pool_dhandle));
hba[i]->cmd_pool_bits = kmalloc( hba[i]->cmd_pool_bits = kcalloc(
((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long), (NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG, sizeof(unsigned long),
GFP_KERNEL); GFP_KERNEL);
if (!hba[i]->cmd_pool_bits || !hba[i]->cmd_pool) if (!hba[i]->cmd_pool_bits || !hba[i]->cmd_pool)
goto Enomem1; goto Enomem1;
memset(hba[i]->cmd_pool, 0, NR_CMDS * sizeof(cmdlist_t)); memset(hba[i]->cmd_pool, 0, NR_CMDS * sizeof(cmdlist_t));
memset(hba[i]->cmd_pool_bits, 0, ((NR_CMDS+BITS_PER_LONG-1)/BITS_PER_LONG)*sizeof(unsigned long));
printk(KERN_INFO "cpqarray: Finding drives on %s", printk(KERN_INFO "cpqarray: Finding drives on %s",
hba[i]->devname); hba[i]->devname);
@ -1660,45 +1659,30 @@ static void getgeometry(int ctlr)
info_p->log_drv_map = 0; info_p->log_drv_map = 0;
id_ldrive = kmalloc(sizeof(id_log_drv_t), GFP_KERNEL); id_ldrive = kzalloc(sizeof(id_log_drv_t), GFP_KERNEL);
if(id_ldrive == NULL) if (!id_ldrive) {
{
printk( KERN_ERR "cpqarray: out of memory.\n"); printk( KERN_ERR "cpqarray: out of memory.\n");
return; goto err_0;
} }
id_ctlr_buf = kmalloc(sizeof(id_ctlr_t), GFP_KERNEL); id_ctlr_buf = kzalloc(sizeof(id_ctlr_t), GFP_KERNEL);
if(id_ctlr_buf == NULL) if (!id_ctlr_buf) {
{
kfree(id_ldrive);
printk( KERN_ERR "cpqarray: out of memory.\n"); printk( KERN_ERR "cpqarray: out of memory.\n");
return; goto err_1;
} }
id_lstatus_buf = kmalloc(sizeof(sense_log_drv_stat_t), GFP_KERNEL); id_lstatus_buf = kzalloc(sizeof(sense_log_drv_stat_t), GFP_KERNEL);
if(id_lstatus_buf == NULL) if (!id_lstatus_buf) {
{
kfree(id_ctlr_buf);
kfree(id_ldrive);
printk( KERN_ERR "cpqarray: out of memory.\n"); printk( KERN_ERR "cpqarray: out of memory.\n");
return; goto err_2;
} }
sense_config_buf = kmalloc(sizeof(config_t), GFP_KERNEL); sense_config_buf = kzalloc(sizeof(config_t), GFP_KERNEL);
if(sense_config_buf == NULL) if (!sense_config_buf) {
{
kfree(id_lstatus_buf);
kfree(id_ctlr_buf);
kfree(id_ldrive);
printk( KERN_ERR "cpqarray: out of memory.\n"); printk( KERN_ERR "cpqarray: out of memory.\n");
return; goto err_3;
} }
memset(id_ldrive, 0, sizeof(id_log_drv_t));
memset(id_ctlr_buf, 0, sizeof(id_ctlr_t));
memset(id_lstatus_buf, 0, sizeof(sense_log_drv_stat_t));
memset(sense_config_buf, 0, sizeof(config_t));
info_p->phys_drives = 0; info_p->phys_drives = 0;
info_p->log_drv_map = 0; info_p->log_drv_map = 0;
info_p->drv_assign_map = 0; info_p->drv_assign_map = 0;
@ -1712,13 +1696,8 @@ static void getgeometry(int ctlr)
* so the idastubopen will fail on all logical drives * so the idastubopen will fail on all logical drives
* on the controller. * on the controller.
*/ */
/* Free all the buffers and return */
printk(KERN_ERR "cpqarray: error sending ID controller\n"); printk(KERN_ERR "cpqarray: error sending ID controller\n");
kfree(sense_config_buf); goto err_4;
kfree(id_lstatus_buf);
kfree(id_ctlr_buf);
kfree(id_ldrive);
return;
} }
info_p->log_drives = id_ctlr_buf->nr_drvs; info_p->log_drives = id_ctlr_buf->nr_drvs;
@ -1764,12 +1743,7 @@ static void getgeometry(int ctlr)
" failed to report status of logical drive %d\n" " failed to report status of logical drive %d\n"
"Access to this controller has been disabled\n", "Access to this controller has been disabled\n",
ctlr, log_unit); ctlr, log_unit);
/* Free all the buffers and return */ goto err_4;
kfree(sense_config_buf);
kfree(id_lstatus_buf);
kfree(id_ctlr_buf);
kfree(id_ldrive);
return;
} }
/* /*
Make sure the logical drive is configured Make sure the logical drive is configured
@ -1798,14 +1772,8 @@ static void getgeometry(int ctlr)
sizeof(config_t), 0, 0, log_unit); sizeof(config_t), 0, 0, log_unit);
if (ret_code == IO_ERROR) { if (ret_code == IO_ERROR) {
info_p->log_drv_map = 0; info_p->log_drv_map = 0;
/* Free all the buffers and return */
printk(KERN_ERR "cpqarray: error sending sense config\n"); printk(KERN_ERR "cpqarray: error sending sense config\n");
kfree(sense_config_buf); goto err_4;
kfree(id_lstatus_buf);
kfree(id_ctlr_buf);
kfree(id_ldrive);
return;
} }
info_p->phys_drives = info_p->phys_drives =
@ -1820,12 +1788,18 @@ static void getgeometry(int ctlr)
log_index = log_index + 1; log_index = log_index + 1;
} /* end of if logical drive configured */ } /* end of if logical drive configured */
} /* end of for log_unit */ } /* end of for log_unit */
kfree(sense_config_buf);
kfree(id_ldrive);
kfree(id_lstatus_buf);
kfree(id_ctlr_buf);
return;
/* Free all the buffers and return */
err_4:
kfree(sense_config_buf);
err_3:
kfree(id_lstatus_buf);
err_2:
kfree(id_ctlr_buf);
err_1:
kfree(id_ldrive);
err_0:
return;
} }
static void __exit cpqarray_exit(void) static void __exit cpqarray_exit(void)