aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorRaghava Aditya Renukunta <raghavaaditya.renukunta@pmcs.com>2016-02-03 18:06:06 -0500
committerMartin K. Petersen <martin.petersen@oracle.com>2016-02-23 21:27:02 -0500
commitfbd185986ebafaeac900a1af1829fed2bf03242e (patch)
tree90bbc9aad6b1e25c25b067d71da0449f237723e5 /drivers/scsi
parent222a9fb376df0f4aec32493a3fb5d18fa56979f2 (diff)
aacraid: Fix AIF triggered IOP_RESET
while driver removal is in progress or PCI shutdown is invoked, driver kills AIF aacraid thread, but IOCTL requests from the management tools re-start AIF thread leading to IOP_RESET. Fixed by setting adapter_shutdown flag when PCI shutdown is invoked. Signed-off-by: Raghava Aditya Renukunta <raghavaaditya.renukunta@pmcs.com> Reviewed-by: Shane Seymour <shane.seymour@hpe.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/aacraid/commctrl.c5
-rw-r--r--drivers/scsi/aacraid/comminit.c6
-rw-r--r--drivers/scsi/aacraid/linit.c5
3 files changed, 12 insertions, 4 deletions
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
index ebf214b863a4..4b3bb52b5108 100644
--- a/drivers/scsi/aacraid/commctrl.c
+++ b/drivers/scsi/aacraid/commctrl.c
@@ -857,6 +857,11 @@ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
857 857
858 mutex_lock(&dev->ioctl_mutex); 858 mutex_lock(&dev->ioctl_mutex);
859 859
860 if (dev->adapter_shutdown) {
861 status = -EACCES;
862 goto cleanup;
863 }
864
860 /* 865 /*
861 * HBA gets first crack 866 * HBA gets first crack
862 */ 867 */
diff --git a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
index 0e954e37f0b5..2b4e75380ae6 100644
--- a/drivers/scsi/aacraid/comminit.c
+++ b/drivers/scsi/aacraid/comminit.c
@@ -212,8 +212,11 @@ int aac_send_shutdown(struct aac_dev * dev)
212 return -ENOMEM; 212 return -ENOMEM;
213 aac_fib_init(fibctx); 213 aac_fib_init(fibctx);
214 214
215 cmd = (struct aac_close *) fib_data(fibctx); 215 mutex_lock(&dev->ioctl_mutex);
216 dev->adapter_shutdown = 1;
217 mutex_unlock(&dev->ioctl_mutex);
216 218
219 cmd = (struct aac_close *) fib_data(fibctx);
217 cmd->command = cpu_to_le32(VM_CloseAll); 220 cmd->command = cpu_to_le32(VM_CloseAll);
218 cmd->cid = cpu_to_le32(0xfffffffe); 221 cmd->cid = cpu_to_le32(0xfffffffe);
219 222
@@ -229,7 +232,6 @@ int aac_send_shutdown(struct aac_dev * dev)
229 /* FIB should be freed only after getting the response from the F/W */ 232 /* FIB should be freed only after getting the response from the F/W */
230 if (status != -ERESTARTSYS) 233 if (status != -ERESTARTSYS)
231 aac_fib_free(fibctx); 234 aac_fib_free(fibctx);
232 dev->adapter_shutdown = 1;
233 if ((dev->pdev->device == PMC_DEVICE_S7 || 235 if ((dev->pdev->device == PMC_DEVICE_S7 ||
234 dev->pdev->device == PMC_DEVICE_S8 || 236 dev->pdev->device == PMC_DEVICE_S8 ||
235 dev->pdev->device == PMC_DEVICE_S9) && 237 dev->pdev->device == PMC_DEVICE_S9) &&
diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
index 3f9c7415bd7e..334f2a602fca 100644
--- a/drivers/scsi/aacraid/linit.c
+++ b/drivers/scsi/aacraid/linit.c
@@ -705,7 +705,7 @@ static long aac_cfg_ioctl(struct file *file,
705{ 705{
706 struct aac_dev *aac = (struct aac_dev *)file->private_data; 706 struct aac_dev *aac = (struct aac_dev *)file->private_data;
707 707
708 if (!capable(CAP_SYS_RAWIO) || aac->adapter_shutdown) 708 if (!capable(CAP_SYS_RAWIO))
709 return -EPERM; 709 return -EPERM;
710 710
711 return aac_do_ioctl(aac, cmd, (void __user *)arg); 711 return aac_do_ioctl(aac, cmd, (void __user *)arg);
@@ -1072,6 +1072,8 @@ static void __aac_shutdown(struct aac_dev * aac)
1072 int i; 1072 int i;
1073 int cpu; 1073 int cpu;
1074 1074
1075 aac_send_shutdown(aac);
1076
1075 if (aac->aif_thread) { 1077 if (aac->aif_thread) {
1076 int i; 1078 int i;
1077 /* Clear out events first */ 1079 /* Clear out events first */
@@ -1083,7 +1085,6 @@ static void __aac_shutdown(struct aac_dev * aac)
1083 } 1085 }
1084 kthread_stop(aac->thread); 1086 kthread_stop(aac->thread);
1085 } 1087 }
1086 aac_send_shutdown(aac);
1087 aac_adapter_disable_int(aac); 1088 aac_adapter_disable_int(aac);
1088 cpu = cpumask_first(cpu_online_mask); 1089 cpu = cpumask_first(cpu_online_mask);
1089 if (aac->pdev->device == PMC_DEVICE_S6 || 1090 if (aac->pdev->device == PMC_DEVICE_S6 ||