|
@@ -2179,8 +2179,17 @@ int scsi_error_handler(void *data)
|
|
|
* We never actually get interrupted because kthread_run
|
|
|
* disables signal delivery for the created thread.
|
|
|
*/
|
|
|
- while (!kthread_should_stop()) {
|
|
|
+ while (true) {
|
|
|
+ /*
|
|
|
+ * The sequence in kthread_stop() sets the stop flag first
|
|
|
+ * then wakes the process. To avoid missed wakeups, the task
|
|
|
+ * should always be in a non running state before the stop
|
|
|
+ * flag is checked
|
|
|
+ */
|
|
|
set_current_state(TASK_INTERRUPTIBLE);
|
|
|
+ if (kthread_should_stop())
|
|
|
+ break;
|
|
|
+
|
|
|
if ((shost->host_failed == 0 && shost->host_eh_scheduled == 0) ||
|
|
|
shost->host_failed != atomic_read(&shost->host_busy)) {
|
|
|
SCSI_LOG_ERROR_RECOVERY(1,
|