diff options
author | Mark Haverkamp <markh@osdl.org> | 2006-03-27 12:44:26 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.il.steeleye.com> | 2006-04-13 11:13:20 -0400 |
commit | dc4adbf41385486b0c73e7382ce73f0e8b873243 (patch) | |
tree | 8275237e742bd3f7b749172128977772c4fa097d /drivers/scsi | |
parent | 1241f3593a8857fab4259b6aa9d17f26e7de3a86 (diff) |
[SCSI] aacraid: Re-start helper thread if it dies
Received from Mark Salyzyn
Since the helper thread for the driver can be killed unceremoniously by
an application, we detect the loss of the helper and restart it.
Signed-off-by: Mark Haverkamp <markh@osdl.org>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi')
-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; |