aacraid: IOCTL fix
authorMahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Thu, 26 Mar 2015 14:41:29 +0000 (10:41 -0400)
committerJames Bottomley <JBottomley@Odin.com>
Thu, 9 Apr 2015 23:54:40 +0000 (16:54 -0700)
After getting the platform shutdown command "VM_CloseAll" response from the
firmware, driver was getting configuration IOCTL request from the upper layers
and it sends down to firmware. This causes firmware assert issue.

This patch fixes the firmware assert issue. During the shutdown, if driver
gets commands from the upper layer, driver sends error code to the upper
layers.

Signed-off-by: Mahesh Rajashekhara <Mahesh.Rajashekhara@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Murthy Bhat <Murthy.Bhat@pmcs.com>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/linit.c

index 9b469a4254b7ea4bf08c6ce24cad62bc27df5fd3..43d80763bb7d8e3ad9fae8ca9bc3620cb80e1a9d 100644 (file)
@@ -1222,6 +1222,7 @@ struct aac_dev
        int                     msi_enabled;    /* MSI/MSI-X enabled */
        struct msix_entry       msixentry[AAC_MAX_MSIX];
        struct aac_msix_ctx     aac_msix[AAC_MAX_MSIX]; /* context */
+       u8                      adapter_shutdown;
 };
 
 #define aac_adapter_interrupt(dev) \
index 284b1c54be7fc37b54f85dc32340a609dae8b9ba..27432b9ea2352449e3039411c30a8971399712ff 100644 (file)
@@ -231,6 +231,7 @@ int aac_send_shutdown(struct aac_dev * dev)
        /* FIB should be freed only after getting the response from the F/W */
        if (status != -ERESTARTSYS)
                aac_fib_free(fibctx);
+       dev->adapter_shutdown = 1;
        if ((dev->pdev->device == PMC_DEVICE_S7 ||
             dev->pdev->device == PMC_DEVICE_S8 ||
             dev->pdev->device == PMC_DEVICE_S9) &&
@@ -400,6 +401,7 @@ struct aac_dev *aac_init_adapter(struct aac_dev *dev)
        }
        dev->max_msix = 0;
        dev->msi_enabled = 0;
+       dev->adapter_shutdown = 0;
        if ((!aac_adapter_sync_cmd(dev, GET_COMM_PREFERRED_SETTINGS,
          0, 0, 0, 0, 0, 0,
          status+0, status+1, status+2, status+3, status+4))
@@ -511,6 +513,7 @@ static void aac_define_int_mode(struct aac_dev *dev)
 
        int i, msi_count;
 
+       msi_count = i = 0;
        /* max. vectors from GET_COMM_PREFERRED_SETTINGS */
        if (dev->max_msix == 0 ||
            dev->pdev->device == PMC_DEVICE_S6 ||
index 75c3501e51b3cc2c78fa41ffbc06470e7bb8ea44..36653a9d9adee240e7cf652e542d5e08829b953b 100644 (file)
@@ -713,7 +713,9 @@ static long aac_cfg_ioctl(struct file *file,
                unsigned int cmd, unsigned long arg)
 {
        int ret;
-       if (!capable(CAP_SYS_RAWIO))
+       struct aac_dev *aac;
+       aac = (struct aac_dev *)file->private_data;
+       if (!capable(CAP_SYS_RAWIO) || aac->adapter_shutdown)
                return -EPERM;
        mutex_lock(&aac_mutex);
        ret = aac_do_ioctl(file->private_data, cmd, (void __user *)arg);