lkml.org 
[lkml]   [2011]   [May]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 04/16] cciss: factor out scatterlist allocation functions
    From
    Date
    From: Stephen M. Cameron <scameron@beardog.cce.hp.com>

    Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
    ---
    drivers/block/cciss.c | 55 +++++++++++++++++++++++++++++++------------------
    1 files changed, 35 insertions(+), 20 deletions(-)

    diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
    index 152cb40..55ca1f4 100644
    --- a/drivers/block/cciss.c
    +++ b/drivers/block/cciss.c
    @@ -4673,6 +4673,39 @@ static __devinit int cciss_allocate_cmd_pool(ctlr_info_t *h)
    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);
    @@ -4696,7 +4729,6 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
    {
    int i;
    int j = 0;
    - int k = 0;
    int rc;
    int dac, return_code;
    InquiryData_struct *inq_buff;
    @@ -4781,23 +4813,9 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
    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)
    @@ -4856,10 +4874,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,

    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:


    \
     
     \ /
      Last update: 2011-05-03 21:55    [W:0.025 / U:1.200 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site