diff options
author | Raghava Aditya Renukunta <raghavaaditya.renukunta@pmcs.com> | 2016-02-03 18:06:06 -0500 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2016-02-23 21:27:02 -0500 |
commit | fbd185986ebafaeac900a1af1829fed2bf03242e (patch) | |
tree | 90bbc9aad6b1e25c25b067d71da0449f237723e5 /drivers/scsi | |
parent | 222a9fb376df0f4aec32493a3fb5d18fa56979f2 (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.c | 5 | ||||
-rw-r--r-- | drivers/scsi/aacraid/comminit.c | 6 | ||||
-rw-r--r-- | drivers/scsi/aacraid/linit.c | 5 |
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 || |