mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "MIke Miller (OS Dev)" <mike.miller@hp.com>
To: Gerald Britton <gbritton@alum.mit.edu>
Cc: jens.axboe@oracle.com, torvalds@linux-foundation.org,
	akpm@linux-foundation.org, ISS StorageDev <iss_storagedev@hp.com>,
	linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] cciss: Fix pci_driver.shutdown while device is still active
Date: Thu, 17 May 2007 16:33:12 -0500	[thread overview]
Message-ID: <1179437592.12356.30.camel@beardog.cca.cpqcorp.net> (raw)
In-Reply-To: <20070514175301.GA19871@zante.sekrit.org>

On Mon, 2007-05-14 at 17:53 +0000, Gerald Britton wrote:
> Fix an Oops in the cciss driver caused by system shutdown while a filesystem
> on a cciss device is still active.  The cciss_remove_one function only
> properly removes the device if the device has been cleanly released by its
> users, which is not the case when the pci_driver.shutdown method is called.
> 
> This patch adds a new cciss_shutdown function to better match the pattern
> used by various SCSI drivers: deactivate device interrupts and flush caches.
> It also alters the cciss_remove_one function to match and readds the
> __devexit annotation that was removed when cciss_remove_one was serving as
> the pci_driver.shutdown method.

Sorry I've taken so long to reply. I've been testing this patch with up
to 512 logical volumes. Looks good. I may make a tweak or 2 after it's
merged, I have other changes that touch the same code.

ACKed-by: Mike Miller <mike.miller@hp.com>

> 
> Signed-off-by: Gerald Britton <gbritton@alum.mit.edu>
> ---
> diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
> index 370dfe1..5acc6c4 100644
> --- a/drivers/block/cciss.c
> +++ b/drivers/block/cciss.c
> @@ -3469,13 +3469,39 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
>  	return -1;
>  }
>  
> -static void cciss_remove_one(struct pci_dev *pdev)
> +static void cciss_shutdown(struct pci_dev *pdev)
>  {
>  	ctlr_info_t *tmp_ptr;
> -	int i, j;
> +	int i;
>  	char flush_buf[4];
>  	int return_code;
>  
> +	tmp_ptr = pci_get_drvdata(pdev);
> +	if (tmp_ptr == NULL)
> +		return;
> +	i = tmp_ptr->ctlr;
> +	if (hba[i] == NULL)
> +		return;
> +
> +	/* 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(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL,
> +			      TYPE_CMD);
> +	if (return_code == IO_OK) {
> +		printk(KERN_INFO "Completed flushing cache on controller %d\n", i);
> +	} else {
> +		printk(KERN_WARNING "Error flushing cache on controller %d\n", i);
> +	}
> +	free_irq(hba[i]->intr[2], hba[i]);
> +}
> +
> +static void __devexit cciss_remove_one(struct pci_dev *pdev)
> +{
> +	ctlr_info_t *tmp_ptr;
> +	int i, j;
> +
>  	if (pci_get_drvdata(pdev) == NULL) {
>  		printk(KERN_ERR "cciss: Unable to remove device \n");
>  		return;
> @@ -3506,18 +3532,7 @@ static void cciss_remove_one(struct pci_dev *pdev)
>  
>  	cciss_unregister_scsi(i);	/* unhook from SCSI subsystem */
>  
> -	/* 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(CCISS_CACHE_FLUSH, i, flush_buf, 4, 0, 0, 0, NULL,
> -			      TYPE_CMD);
> -	if (return_code == IO_OK) {
> -		printk(KERN_INFO "Completed flushing cache on controller %d\n", i);
> -	} else {
> -		printk(KERN_WARNING "Error flushing cache on controller %d\n", i);
> -	}
> -	free_irq(hba[i]->intr[2], hba[i]);
> +	cciss_shutdown(pdev);
>  
>  #ifdef CONFIG_PCI_MSI
>  	if (hba[i]->msix_vector)
> @@ -3550,7 +3565,7 @@ static struct pci_driver cciss_pci_driver = {
>  	.probe = cciss_init_one,
>  	.remove = __devexit_p(cciss_remove_one),
>  	.id_table = cciss_pci_device_id,	/* id_table */
> -	.shutdown = cciss_remove_one,
> +	.shutdown = cciss_shutdown,
>  };
>  
>  /*


  parent reply	other threads:[~2007-05-17 21:34 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-14 17:53 Gerald Britton
2007-05-14 19:06 ` Miller, Mike (OS Dev)
2007-05-14 19:21   ` Gerald Britton
2007-05-17 21:33 ` MIke Miller (OS Dev) [this message]
2007-05-17 22:15   ` Andrew Morton

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1179437592.12356.30.camel@beardog.cca.cpqcorp.net \
    --to=mike.miller@hp.com \
    --cc=akpm@linux-foundation.org \
    --cc=gbritton@alum.mit.edu \
    --cc=iss_storagedev@hp.com \
    --cc=jens.axboe@oracle.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®