diff options
author | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2006-01-31 00:13:06 -0500 |
---|---|---|
committer | Jody McIntyre <scjody@modernduck.com> | 2006-02-23 00:25:08 -0500 |
commit | bf637ec3ef4159da3dd156ecf6f6987d8c8c5dae (patch) | |
tree | 4d90e883515171529e74ab9446e19bc1030abe4c /drivers/ieee1394/sbp2.c | |
parent | 9e956c2dac9bec602ed1ba29181b45ba6d2b6448 (diff) |
sbp2: fix another deadlock after disconnection
If there were commands enqueued but not completed before an SBP-2 unit
was unplugged (or an attempt to reconnect failed), knodemgrd or any
process which tried to remove the device would sleep uninterruptibly
in blk_execute_rq(). Therefore make sure that all commands are
completed when sbp2 retreats.
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Signed-off-by: Jody McIntyre <scjody@modernduck.com>
(cherry picked from 61daa34c132c5d4ed8630e2c46e9bf2f0c7b3428 commit)
Diffstat (limited to 'drivers/ieee1394/sbp2.c')
-rw-r--r-- | drivers/ieee1394/sbp2.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c index c2c776fbda01..8963dd484eb9 100644 --- a/drivers/ieee1394/sbp2.c +++ b/drivers/ieee1394/sbp2.c | |||
@@ -643,9 +643,15 @@ static int sbp2_remove(struct device *dev) | |||
643 | if (!scsi_id) | 643 | if (!scsi_id) |
644 | return 0; | 644 | return 0; |
645 | 645 | ||
646 | /* Trigger shutdown functions in scsi's highlevel. */ | 646 | if (scsi_id->scsi_host) { |
647 | if (scsi_id->scsi_host) | 647 | /* Get rid of enqueued commands if there is no chance to |
648 | * send them. */ | ||
649 | if (!sbp2util_node_is_available(scsi_id)) | ||
650 | sbp2scsi_complete_all_commands(scsi_id, DID_NO_CONNECT); | ||
651 | /* scsi_remove_device() will trigger shutdown functions of SCSI | ||
652 | * highlevel drivers which would deadlock if blocked. */ | ||
648 | scsi_unblock_requests(scsi_id->scsi_host); | 653 | scsi_unblock_requests(scsi_id->scsi_host); |
654 | } | ||
649 | sdev = scsi_id->sdev; | 655 | sdev = scsi_id->sdev; |
650 | if (sdev) { | 656 | if (sdev) { |
651 | scsi_id->sdev = NULL; | 657 | scsi_id->sdev = NULL; |