aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorChristof Schmitt <christof.schmitt@de.ibm.com>2007-11-05 06:37:47 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 19:22:40 -0500
commit1de1b43b5f0bb536126e31f07ec833e01969ed1c (patch)
tree9908cfa46ab158be6890b2edf1c3b7362243a7f8 /drivers/s390
parente39c8877a41e8f70225baeeb74fade8fe3a80d8b (diff)
[SCSI] zfcp: Fix deadlock when adding invalid LUN
When adding an invalid LUN, there is a deadlock between the add via scsi_scan_target and the slave_destroy handler: The handler waits for the scan to complete, but for an invalid unit, scsi_scan_target directly calls the slave_destroy handler. Fix the deadlock by removing the wait in the slave_destroy handler, it was not necessary anyway. Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/scsi/zfcp_aux.c2
-rw-r--r--drivers/s390/scsi/zfcp_def.h4
-rw-r--r--drivers/s390/scsi/zfcp_erp.c1
-rw-r--r--drivers/s390/scsi/zfcp_scsi.c3
4 files changed, 0 insertions, 10 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c
index 00118499018b..874b55ed00a3 100644
--- a/drivers/s390/scsi/zfcp_aux.c
+++ b/drivers/s390/scsi/zfcp_aux.c
@@ -844,8 +844,6 @@ zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
844 unit->sysfs_device.release = zfcp_sysfs_unit_release; 844 unit->sysfs_device.release = zfcp_sysfs_unit_release;
845 dev_set_drvdata(&unit->sysfs_device, unit); 845 dev_set_drvdata(&unit->sysfs_device, unit);
846 846
847 init_waitqueue_head(&unit->scsi_scan_wq);
848
849 /* mark unit unusable as long as sysfs registration is not complete */ 847 /* mark unit unusable as long as sysfs registration is not complete */
850 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status); 848 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
851 849
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h
index 3d2d2dc0d6f8..294d0792e82b 100644
--- a/drivers/s390/scsi/zfcp_def.h
+++ b/drivers/s390/scsi/zfcp_def.h
@@ -983,10 +983,6 @@ struct zfcp_unit {
983 struct scsi_device *device; /* scsi device struct pointer */ 983 struct scsi_device *device; /* scsi device struct pointer */
984 struct zfcp_erp_action erp_action; /* pending error recovery */ 984 struct zfcp_erp_action erp_action; /* pending error recovery */
985 atomic_t erp_counter; 985 atomic_t erp_counter;
986 wait_queue_head_t scsi_scan_wq; /* can be used to wait until
987 all scsi_scan_target
988 requests have been
989 completed. */
990}; 986};
991 987
992/* FSF request */ 988/* FSF request */
diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c
index 9c6ea9962cd2..67d74ed0f25c 100644
--- a/drivers/s390/scsi/zfcp_erp.c
+++ b/drivers/s390/scsi/zfcp_erp.c
@@ -1609,7 +1609,6 @@ static void zfcp_erp_scsi_scan(struct work_struct *work)
1609 scsi_scan_target(&rport->dev, 0, rport->scsi_target_id, 1609 scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
1610 unit->scsi_lun, 0); 1610 unit->scsi_lun, 0);
1611 atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status); 1611 atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
1612 wake_up(&unit->scsi_scan_wq);
1613 zfcp_unit_put(unit); 1612 zfcp_unit_put(unit);
1614 kfree(p); 1613 kfree(p);
1615} 1614}
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c
index c6b6295395b0..3298fd35000c 100644
--- a/drivers/s390/scsi/zfcp_scsi.c
+++ b/drivers/s390/scsi/zfcp_scsi.c
@@ -180,9 +180,6 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt)
180 180
181 if (unit) { 181 if (unit) {
182 zfcp_erp_wait(unit->port->adapter); 182 zfcp_erp_wait(unit->port->adapter);
183 wait_event(unit->scsi_scan_wq,
184 atomic_test_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING,
185 &unit->status) == 0);
186 atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status); 183 atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status);
187 sdpnt->hostdata = NULL; 184 sdpnt->hostdata = NULL;
188 unit->device = NULL; 185 unit->device = NULL;