lkml.org 
[lkml]   [2009]   [Nov]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 14/17] hpsa: Flush cache with interrupts still enabled.
    Date
    hpsa: Flush cache with interrupts still enabled.  It's not
    necessary to disable interrupts prior to flushing the cache
    on driver unload. Also, don't dma from the stack.

    Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
    ---

    drivers/scsi/hpsa.c | 39 ++++++++++++++++++++++++++++++---------
    1 files changed, 30 insertions(+), 9 deletions(-)

    diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
    index e3b80fa..d171a55 100644
    --- a/drivers/scsi/hpsa.c
    +++ b/drivers/scsi/hpsa.c
    @@ -3581,24 +3581,45 @@ clean1:
    return -1;
    }

    +static void hpsa_flush_cache(struct ctlr_info *h)
    +{
    + char *flush_buf;
    + struct CommandList *c;
    + int rc;
    +
    + flush_buf = kzalloc(4, GFP_KERNEL);
    + if (!flush_buf)
    + return;
    +
    + c = cmd_special_alloc(h);
    + if (!c) {
    + dev_warn(&h->pdev->dev, "cmd_special_alloc returned NULL!\n");
    + goto out_of_memory;
    + }
    + rc = fill_cmd(c, HPSA_CACHE_FLUSH, h, flush_buf, 4, 0,
    + RAID_CTLR_LUNID, TYPE_CMD);
    + if (rc == 0) {
    + hpsa_scsi_do_simple_cmd_with_retry(h, c, PCI_DMA_TODEVICE);
    + if (c->err_info->CommandStatus != 0)
    + dev_warn(&h->pdev->dev,
    + "error flushing cache on controller\n");
    + }
    + cmd_special_free(h, c);
    +out_of_memory:
    + kfree(flush_buf);
    +}
    +
    static void hpsa_shutdown(struct pci_dev *pdev)
    {
    struct ctlr_info *h;
    - char flush_buf[4];
    - int return_code;

    h = pci_get_drvdata(pdev);
    /* Turn board interrupts off and send the flush cache command
    * sendcmd will turn off interrupt, and send the flush...
    * To write all data in the battery backed cache to disks
    */
    - memset(flush_buf, 0, 4);
    - return_code = sendcmd(HPSA_CACHE_FLUSH, h, flush_buf, 4, 0,
    - RAID_CTLR_LUNID, TYPE_CMD);
    - if (return_code != IO_OK) {
    - dev_warn(&pdev->dev, "error flushing cache on controller %d\n",
    - h->ctlr);
    - }
    + hpsa_flush_cache(h);
    + h->access.set_intr_mask(h, HPSA_INTR_OFF);
    free_irq(h->intr[2], h);
    #ifdef CONFIG_PCI_MSI
    if (h->msix_vector)


    \
     
     \ /
      Last update: 2009-11-11 17:53    [W:0.037 / U:0.092 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site