return 0;
 }
 
+static __devinit int cciss_allocate_scatterlists(ctlr_info_t *h)
+{
+       int i;
+
+       /* zero it, so that on free we need not know how many were alloc'ed */
+       h->scatter_list = kzalloc(h->max_commands *
+                               sizeof(struct scatterlist *), GFP_KERNEL);
+       if (!h->scatter_list)
+               return -ENOMEM;
+
+       for (i = 0; i < h->nr_cmds; i++) {
+               h->scatter_list[i] = kmalloc(sizeof(struct scatterlist) *
+                                               h->maxsgentries, GFP_KERNEL);
+               if (h->scatter_list[i] == NULL) {
+                       dev_err(&h->pdev->dev, "could not allocate "
+                               "s/g lists\n");
+                       return -ENOMEM;
+               }
+       }
+       return 0;
+}
+
+static void cciss_free_scatterlists(ctlr_info_t *h)
+{
+       int i;
+
+       if (h->scatter_list) {
+               for (i = 0; i < h->nr_cmds; i++)
+                       kfree(h->scatter_list[i]);
+               kfree(h->scatter_list);
+       }
+}
+
 static void cciss_free_cmd_pool(ctlr_info_t *h)
 {
        kfree(h->cmd_pool_bits);
 {
        int i;
        int j = 0;
-       int k = 0;
        int rc;
        int dac, return_code;
        InquiryData_struct *inq_buff;
        if (cciss_allocate_cmd_pool(h))
                goto clean4;
 
-       /* Need space for temp scatter list */
-       h->scatter_list = kmalloc(h->max_commands *
-                                               sizeof(struct scatterlist *),
-                                               GFP_KERNEL);
-       if (!h->scatter_list)
+       if (cciss_allocate_scatterlists(h))
                goto clean4;
 
-       for (k = 0; k < h->nr_cmds; k++) {
-               h->scatter_list[k] = kmalloc(sizeof(struct scatterlist) *
-                                                       h->maxsgentries,
-                                                       GFP_KERNEL);
-               if (h->scatter_list[k] == NULL) {
-                       dev_err(&h->pdev->dev,
-                               "could not allocate s/g lists\n");
-                       goto clean4;
-               }
-       }
        h->cmd_sg_list = cciss_allocate_sg_chain_blocks(h,
                h->chainsize, h->nr_cmds);
        if (!h->cmd_sg_list && h->chainsize > 0)
 
 clean4:
        cciss_free_cmd_pool(h);
-       /* Free up sg elements */
-       for (k-- ; k >= 0; k--)
-               kfree(h->scatter_list[k]);
-       kfree(h->scatter_list);
+       cciss_free_scatterlists(h);
        cciss_free_sg_chain_blocks(h->cmd_sg_list, h->nr_cmds);
        free_irq(h->intr[PERF_MODE_INT], h);
 clean2: