EXPORT_SYMBOL(scsi_alloc_sgtable);
 
-void scsi_free_sgtable(struct scatterlist *sgl, int index)
+void scsi_free_sgtable(struct scsi_cmnd *cmd)
 {
+       struct scatterlist *sgl = cmd->request_buffer;
        struct scsi_host_sg_pool *sgp;
 
-       BUG_ON(index >= SG_MEMPOOL_NR);
+       BUG_ON(cmd->sglist_len >= SG_MEMPOOL_NR);
 
-       sgp = scsi_sg_pools + index;
+       sgp = scsi_sg_pools + cmd->sglist_len;
        mempool_free(sgl, sgp->pool);
 }
 
 static void scsi_release_buffers(struct scsi_cmnd *cmd)
 {
        if (cmd->use_sg)
-               scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len);
+               scsi_free_sgtable(cmd);
 
        /*
         * Zero these out.  They now point to freed memory, and it is
 
        scsi_tgt_uspace_send_status(cmd, tcmd->itn_id, tcmd->tag);
 
        if (cmd->request_buffer)
-               scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len);
+               scsi_free_sgtable(cmd);
 
        queue_work(scsi_tgtd, &tcmd->work);
 }
        }
 
        eprintk("cmd %p cnt %d\n", cmd, cmd->use_sg);
-       scsi_free_sgtable(cmd->request_buffer, cmd->sglist_len);
+       scsi_free_sgtable(cmd);
        return -EINVAL;
 }
 
 
 extern void scsi_kunmap_atomic_sg(void *virt);
 
 extern struct scatterlist *scsi_alloc_sgtable(struct scsi_cmnd *, gfp_t);
-extern void scsi_free_sgtable(struct scatterlist *, int);
+extern void scsi_free_sgtable(struct scsi_cmnd *);
 
 extern int scsi_dma_map(struct scsi_cmnd *cmd);
 extern void scsi_dma_unmap(struct scsi_cmnd *cmd);