diff options
Diffstat (limited to 'drivers/scsi/aacraid/commctrl.c')
-rw-r--r-- | drivers/scsi/aacraid/commctrl.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c index 47fefca72695..9f75144e5247 100644 --- a/drivers/scsi/aacraid/commctrl.c +++ b/drivers/scsi/aacraid/commctrl.c | |||
@@ -38,6 +38,8 @@ | |||
38 | #include <linux/completion.h> | 38 | #include <linux/completion.h> |
39 | #include <linux/dma-mapping.h> | 39 | #include <linux/dma-mapping.h> |
40 | #include <linux/blkdev.h> | 40 | #include <linux/blkdev.h> |
41 | #include <linux/delay.h> | ||
42 | #include <linux/kthread.h> | ||
41 | #include <asm/semaphore.h> | 43 | #include <asm/semaphore.h> |
42 | #include <asm/uaccess.h> | 44 | #include <asm/uaccess.h> |
43 | 45 | ||
@@ -293,6 +295,16 @@ return_fib: | |||
293 | status = 0; | 295 | status = 0; |
294 | } else { | 296 | } else { |
295 | spin_unlock_irqrestore(&dev->fib_lock, flags); | 297 | spin_unlock_irqrestore(&dev->fib_lock, flags); |
298 | /* If someone killed the AIF aacraid thread, restart it */ | ||
299 | status = !dev->aif_thread; | ||
300 | if (status && dev->queues && dev->fsa_dev) { | ||
301 | /* Be paranoid, be very paranoid! */ | ||
302 | kthread_stop(dev->thread); | ||
303 | ssleep(1); | ||
304 | dev->aif_thread = 0; | ||
305 | dev->thread = kthread_run(aac_command_thread, dev, dev->name); | ||
306 | ssleep(1); | ||
307 | } | ||
296 | if (f.wait) { | 308 | if (f.wait) { |
297 | if(down_interruptible(&fibctx->wait_sem) < 0) { | 309 | if(down_interruptible(&fibctx->wait_sem) < 0) { |
298 | status = -EINTR; | 310 | status = -EINTR; |