aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394/sbp2.h
diff options
context:
space:
mode:
authorStefan Richter <stefanr@s5r6.in-berlin.de>2006-08-14 12:59:00 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2006-09-17 13:34:44 -0400
commit2cccbb555c77e641de9008660e08bdf17fc4206a (patch)
tree62cd3291088cce86f8a4ef9e25b1072b5c16ae2e /drivers/ieee1394/sbp2.h
parent902abed1587805fe8513e10aef6643f58a6de0a6 (diff)
ieee1394: sbp2: prevent rare deadlock in shutdown
Scsi_remove_device() may go into uninterruptible sleep if blocked. Therefore sbp2_remove() unblocks the Scsi_Host before the device is requested to be removed. But there could be another 1394 bus reset after that which would block the host again. The 1394 subsystem won't call sbp2_update() concurrently to sbp2_remove(), which is why there is no chance for sbp2_remove() to be unblocked by sbp2_update(). The fix is to tell sbp2's bus reset handler when a device is to be shut down so that it skips scsi_block_requests() on that host. As before, any new commands after a reset without reconnect will be failed quickly by sbp2scsi_queuecommand(). In the long term, means to go without scsi_block_requests() should be found. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/ieee1394/sbp2.h')
-rw-r--r--drivers/ieee1394/sbp2.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
index 34c52bf4fa34..abbe48e646c3 100644
--- a/drivers/ieee1394/sbp2.h
+++ b/drivers/ieee1394/sbp2.h
@@ -347,10 +347,17 @@ struct scsi_id_instance_data {
347 /* Device specific workarounds/brokeness */ 347 /* Device specific workarounds/brokeness */
348 unsigned workarounds; 348 unsigned workarounds;
349 349
350 atomic_t unfinished_reset; 350 atomic_t state;
351 struct work_struct protocol_work; 351 struct work_struct protocol_work;
352}; 352};
353 353
354/* For use in scsi_id_instance_data.state */
355enum sbp2lu_state_types {
356 SBP2LU_STATE_RUNNING, /* all normal */
357 SBP2LU_STATE_IN_RESET, /* between bus reset and reconnect */
358 SBP2LU_STATE_IN_SHUTDOWN /* when sbp2_remove was called */
359};
360
354/* Sbp2 host data structure (one per IEEE1394 host) */ 361/* Sbp2 host data structure (one per IEEE1394 host) */
355struct sbp2scsi_host_info { 362struct sbp2scsi_host_info {
356 struct hpsb_host *host; /* IEEE1394 host */ 363 struct hpsb_host *host; /* IEEE1394 host */