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 | |
| 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)
| -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; |
