As Rolf Eike Beer noted we might not actually get to the
kthread_should_stop() because we are waiting in the semaphore forever.
I didn't get a rmmod hang because of this, but my instrumentation showed
the thread defitiyly didn't exit.

So make sure to wake the EH thread before the kthread_stop, and to plug
the reaming race check kthead_should_stop() a second time just before
calling down_interruptible().


Index: scsi-misc-2.6/drivers/scsi/hosts.c
===================================================================
--- scsi-misc-2.6.orig/drivers/scsi/hosts.c     2005-09-07 14:21:44.000000000 
+0200
+++ scsi-misc-2.6/drivers/scsi/hosts.c  2005-09-07 14:22:33.000000000 +0200
@@ -226,8 +226,10 @@
        struct Scsi_Host *shost = dev_to_shost(dev);
        struct device *parent = dev->parent;
 
-       if (shost->ehandler)
+       if (shost->ehandler) {
+               up(shost->eh_wait);
                kthread_stop(shost->ehandler);
+       }
        if (shost->work_q)
                destroy_workqueue(shost->work_q);
 
Index: scsi-misc-2.6/drivers/scsi/scsi_error.c
===================================================================
--- scsi-misc-2.6.orig/drivers/scsi/scsi_error.c        2005-09-07 
14:21:44.000000000 +0200
+++ scsi-misc-2.6/drivers/scsi/scsi_error.c     2005-09-07 14:22:58.000000000 
+0200
@@ -1591,7 +1591,7 @@
        SCSI_LOG_ERROR_RECOVERY(3, printk("Wake up parent of"
                                          " scsi_eh_%d\n",shost->host_no));
 
-       while (1) {
+       while (!kthread_should_stop()) {
                /*
                 * If we get a signal, it means we are supposed to go
                 * away and die.  This typically happens if the user is
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to