Files
linux/drivers/scsi
Michal Hocko 4f402ee592 scsi: fix scsi_error_handler vs. scsi_host_dev_release race
commit 537b604c8b upstream.

b9d5c6b7ef ("[SCSI] cleanup setting task state in
scsi_error_handler()") has introduced a race between scsi_error_handler
and scsi_host_dev_release resulting in the hang when the device goes
away because scsi_error_handler might miss a wake up:

CPU0					CPU1
scsi_error_handler			scsi_host_dev_release
  					  kthread_stop()
  kthread_should_stop()
    test_bit(KTHREAD_SHOULD_STOP)
					    set_bit(KTHREAD_SHOULD_STOP)
					    wake_up_process()
					    wait_for_completion()

  set_current_state(TASK_INTERRUPTIBLE)
  schedule()

The most straightforward solution seems to be to invert the ordering of
the set_current_state and kthread_should_stop.

The issue has been noticed during reboot test on a 3.0 based kernel but
the current code seems to be affected in the same way.

[jejb: additional comment added]
Reported-and-debugged-by: Mike Mayer <Mike.Meyer@teradata.com>
Signed-off-by: Michal Hocko <mhocko@suse.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: James Bottomley <JBottomley@Odin.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2015-10-22 14:37:49 -07:00
..
2013-04-09 14:13:26 -04:00
2013-04-09 14:13:27 -04:00
2011-07-26 16:49:47 -07:00
2013-06-26 23:08:22 -07:00
2015-06-29 12:08:34 -07:00
2013-04-09 14:13:21 -04:00
2015-05-13 05:15:42 -07:00
2015-05-13 05:15:42 -07:00
2015-05-13 05:15:42 -07:00
2015-05-13 05:15:42 -07:00
2015-05-13 05:15:42 -07:00
2015-05-13 05:15:42 -07:00
2011-03-31 11:26:23 -03:00
2011-03-31 11:26:23 -03:00
2013-04-09 14:13:15 -04:00
2013-04-09 14:13:15 -04:00
2013-04-09 14:13:22 -04:00
2010-11-16 13:33:23 -08:00
2013-04-09 14:13:23 -04:00
2013-04-09 14:13:24 -04:00
2013-04-09 14:13:19 -04:00
2013-04-09 14:13:19 -04:00
2013-02-27 19:10:18 -08:00
2013-04-09 14:13:24 -04:00
2011-03-31 11:26:23 -03:00
2013-04-09 14:13:24 -04:00
2010-11-16 13:33:23 -08:00
2013-04-09 14:13:17 -04:00
2013-04-09 14:13:17 -04:00
2013-04-09 14:13:23 -04:00
2011-05-01 10:22:40 -05:00
2011-03-31 11:26:23 -03:00
2013-04-09 14:13:17 -04:00
2010-11-16 13:33:23 -08:00
2013-04-09 14:13:16 -04:00
2013-04-09 14:13:16 -04:00
2013-04-09 14:13:16 -04:00
2013-04-09 14:13:15 -04:00
2013-04-09 14:13:16 -04:00
2013-04-09 14:13:25 -04:00
2010-11-16 13:33:23 -08:00
2011-03-31 11:26:23 -03:00
2015-08-16 20:51:36 -07:00
2015-08-16 20:51:36 -07:00
2013-04-09 14:13:27 -04:00
2013-04-09 14:13:17 -04:00
2013-04-09 14:13:17 -04:00
2012-03-28 18:30:03 +01:00
2013-04-09 14:13:15 -04:00
2010-05-02 15:55:03 -04:00
2010-11-16 13:33:23 -08:00
2013-04-09 14:13:17 -04:00
2013-04-09 14:13:17 -04:00
2011-03-31 11:26:23 -03:00
2012-03-28 18:30:03 +01:00
2011-03-31 11:26:23 -03:00
2013-04-09 14:13:17 -04:00
2013-04-09 14:13:17 -04:00
2012-02-21 11:40:37 +01:00
2013-04-09 14:13:17 -04:00
2010-11-16 13:33:23 -08:00
2010-11-16 13:33:23 -08:00
2014-05-30 21:52:11 -07:00
2012-01-03 22:54:07 -05:00
2013-07-25 14:07:30 -07:00
2012-09-14 17:59:29 +01:00
2013-05-04 14:50:16 -04:00
2013-05-04 14:50:16 -04:00
2013-05-04 14:50:16 -04:00
2010-11-16 13:33:23 -08:00
2013-04-09 14:13:17 -04:00
2013-04-09 14:13:17 -04:00
2010-11-16 13:33:23 -08:00
2013-04-09 14:13:15 -04:00
2013-04-09 14:13:15 -04:00
2013-04-09 14:13:15 -04:00