cciss: Add missing allocation in scsi_cmd_stack_setup and corresponding deallocation
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Fri, 11 Mar 2011 19:07:38 +0000 (20:07 +0100)
committerJens Axboe <jaxboe@fusionio.com>
Fri, 11 Mar 2011 19:07:38 +0000 (20:07 +0100)
This bit got lost somewhere along the way.  Without this, panic.

Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Cc: stable@kernel.org
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
drivers/block/cciss_scsi.c

index 727d0225b7d049e9f529655c081c513267d248bc..3bfbde8b4013ac872e09f7193dd824ff78049ec5 100644 (file)
@@ -226,6 +226,13 @@ scsi_cmd_stack_setup(ctlr_info_t *h, struct cciss_scsi_adapter_data_t *sa)
                return -ENOMEM;
        }
 
+       stk->elem = kmalloc(sizeof(stk->elem[0]) * stk->nelems, GFP_KERNEL);
+       if (!stk->elem) {
+               pci_free_consistent(h->pdev, size, stk->pool,
+               stk->cmd_pool_handle);
+               return -1;
+       }
+
        for (i=0; i<CMD_STACK_SIZE; i++) {
                stk->elem[i] = &stk->pool[i];
                stk->elem[i]->busaddr = (__u32) (stk->cmd_pool_handle + 
@@ -255,6 +262,8 @@ scsi_cmd_stack_free(ctlr_info_t *h)
        pci_free_consistent(h->pdev, size, stk->pool, stk->cmd_pool_handle);
        stk->pool = NULL;
        cciss_free_sg_chain_blocks(sa->cmd_sg_list, CMD_STACK_SIZE);
+       kfree(stk->elem);
+       stk->elem = NULL;
 }
 
 #if 0