diff options
author | Brian King <brking@linux.vnet.ibm.com> | 2008-08-15 11:59:21 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-08-16 11:47:46 -0400 |
commit | 3eddc569770a76f2ca65621cdde3c0a2552b5b0c (patch) | |
tree | acea9c8f9985dcac6630dc622d6682da55a2837a /drivers/scsi/ibmvscsi/ibmvfc.c | |
parent | 004dd5e88673516a408f0e8e43edbe6a4424be2f (diff) |
[SCSI] ibmvfc: Fix another hang on module removal
This fixes a hang on module removal. The module removal code was setting
the hosts's state to IBMVFC_HOST_OFFLINE before tearing down the kernel
thread, but, due to a bug in ibmvfc_wait_while_resetting, was not waiting
for the kernel thread's offlining work to be done prior to destroying
the kernel thread, which left the scsi host in a blocked state which we
never got out of.
Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/ibmvscsi/ibmvfc.c')
-rw-r--r-- | drivers/scsi/ibmvscsi/ibmvfc.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c index ae560bc04f9d..ee11568d581f 100644 --- a/drivers/scsi/ibmvscsi/ibmvfc.c +++ b/drivers/scsi/ibmvscsi/ibmvfc.c | |||
@@ -1059,9 +1059,10 @@ static void ibmvfc_get_starget_port_id(struct scsi_target *starget) | |||
1059 | static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) | 1059 | static int ibmvfc_wait_while_resetting(struct ibmvfc_host *vhost) |
1060 | { | 1060 | { |
1061 | long timeout = wait_event_timeout(vhost->init_wait_q, | 1061 | long timeout = wait_event_timeout(vhost->init_wait_q, |
1062 | (vhost->state == IBMVFC_ACTIVE || | 1062 | ((vhost->state == IBMVFC_ACTIVE || |
1063 | vhost->state == IBMVFC_HOST_OFFLINE || | 1063 | vhost->state == IBMVFC_HOST_OFFLINE || |
1064 | vhost->state == IBMVFC_LINK_DEAD), | 1064 | vhost->state == IBMVFC_LINK_DEAD) && |
1065 | vhost->action == IBMVFC_HOST_ACTION_NONE), | ||
1065 | (init_timeout * HZ)); | 1066 | (init_timeout * HZ)); |
1066 | 1067 | ||
1067 | return timeout ? 0 : -EIO; | 1068 | return timeout ? 0 : -EIO; |