This patch (as1360) improves the scsi_error_handler() routine by removing two occurrences of set_current_state(). Signed-off-by: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx> --- Index: usb-2.6/drivers/scsi/scsi_error.c =================================================================== --- usb-2.6.orig/drivers/scsi/scsi_error.c +++ usb-2.6/drivers/scsi/scsi_error.c @@ -1734,21 +1734,24 @@ int scsi_error_handler(void *data) { struct Scsi_Host *shost = data; - /* - * We use TASK_INTERRUPTIBLE so that the thread is not - * counted against the load average as a running process. - * We never actually get interrupted because kthread_run - * disables signal delivery for the created thread. - */ - set_current_state(TASK_INTERRUPTIBLE); - while (!kthread_should_stop()) { + for (;;) { + /* + * We use TASK_INTERRUPTIBLE so that the thread is not + * counted against the load average as a running process. + * We never actually get interrupted because kthread_run + * disables signal delivery for the created thread. + */ + set_current_state(TASK_INTERRUPTIBLE); + if (kthread_should_stop()) { + __set_current_state(TASK_RUNNING); + break; + } if ((shost->host_failed == 0 && shost->host_eh_scheduled == 0) || shost->host_failed != shost->host_busy) { SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler scsi_eh_%d sleeping\n", shost->host_no)); schedule(); - set_current_state(TASK_INTERRUPTIBLE); continue; } @@ -1775,9 +1778,7 @@ int scsi_error_handler(void *data) * which are still online. */ scsi_restart_operations(shost); - set_current_state(TASK_INTERRUPTIBLE); } - __set_current_state(TASK_RUNNING); SCSI_LOG_ERROR_RECOVERY(1, printk("Error handler scsi_eh_%d exiting\n", shost->host_no)); -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html