diff options
author | Christof Schmitt <christof.schmitt@de.ibm.com> | 2007-11-05 06:37:47 -0500 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2008-01-11 19:22:40 -0500 |
commit | 1de1b43b5f0bb536126e31f07ec833e01969ed1c (patch) | |
tree | 9908cfa46ab158be6890b2edf1c3b7362243a7f8 /drivers | |
parent | e39c8877a41e8f70225baeeb74fade8fe3a80d8b (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')
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 2 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 4 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_erp.c | 1 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 3 |
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; |