]> git.openfabrics.org - ~emulex/infiniband.git/commitdiff
megaraid_sas: do not process IOCTLs and SCSI commands during driver removal
authorSumit.Saxena@avagotech.com <Sumit.Saxena@avagotech.com>
Mon, 17 Nov 2014 09:54:08 +0000 (15:24 +0530)
committerChristoph Hellwig <hch@lst.de>
Mon, 24 Nov 2014 13:39:01 +0000 (14:39 +0100)
Do not process any SCSI and IOCTL command further (return them with
appropriate return values to callers), while driver removal is in
progress or PCI shutdown is invoked.

Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com>
Signed-off-by: Kashyap Desai <kashyap.desai@avagotech.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/megaraid/megaraid_sas_base.c

index de67cf310462bb0d90c8464f959526f72660fca0..3ccfbec682d0ed2346ce8c540e0e3aea4900ce71 100644 (file)
@@ -1571,6 +1571,12 @@ megasas_queue_command(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
        instance = (struct megasas_instance *)
            scmd->device->host->hostdata;
 
+       if (instance->unload == 1) {
+               scmd->result = DID_NO_CONNECT << 16;
+               scmd->scsi_done(scmd);
+               return 0;
+       }
+
        if (instance->issuepend_done == 0)
                return SCSI_MLQUEUE_HOST_BUSY;
 
@@ -5011,10 +5017,6 @@ static int megasas_io_attach(struct megasas_instance *instance)
                return -ENODEV;
        }
 
-       /*
-        * Trigger SCSI to scan our drives
-        */
-       scsi_scan_host(host);
        return 0;
 }
 
@@ -5344,6 +5346,10 @@ retry_irq_register:
                goto fail_io_attach;
 
        instance->unload = 0;
+       /*
+        * Trigger SCSI to scan our drives
+        */
+       scsi_scan_host(host);
 
        /*
         * Initiate AEN (Asynchronous Event Notification)
@@ -6107,6 +6113,11 @@ megasas_mgmt_fw_ioctl(struct megasas_instance *instance,
        megasas_issue_blocked_cmd(instance, cmd, 0);
        cmd->sync_cmd = 0;
 
+       if (instance->unload == 1) {
+               dev_info(&instance->pdev->dev, "Driver unload is in progress "
+                       "don't submit data to application\n");
+               goto out;
+       }
        /*
         * copy out the kernel buffers to user buffers
         */