Commit 1de1b43b5f0bb536126e31f07ec833e01969ed1c

Authored by Christof Schmitt
Committed by James Bottomley
1 parent e39c8877a4

[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>

Showing 4 changed files with 0 additions and 10 deletions Side-by-side Diff

drivers/s390/scsi/zfcp_aux.c
... ... @@ -844,8 +844,6 @@
844 844 unit->sysfs_device.release = zfcp_sysfs_unit_release;
845 845 dev_set_drvdata(&unit->sysfs_device, unit);
846 846  
847   - init_waitqueue_head(&unit->scsi_scan_wq);
848   -
849 847 /* mark unit unusable as long as sysfs registration is not complete */
850 848 atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
851 849  
drivers/s390/scsi/zfcp_def.h
... ... @@ -983,10 +983,6 @@
983 983 struct scsi_device *device; /* scsi device struct pointer */
984 984 struct zfcp_erp_action erp_action; /* pending error recovery */
985 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 988 /* FSF request */
drivers/s390/scsi/zfcp_erp.c
... ... @@ -1609,7 +1609,6 @@
1609 1609 scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
1610 1610 unit->scsi_lun, 0);
1611 1611 atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
1612   - wake_up(&unit->scsi_scan_wq);
1613 1612 zfcp_unit_put(unit);
1614 1613 kfree(p);
1615 1614 }
drivers/s390/scsi/zfcp_scsi.c
... ... @@ -180,9 +180,6 @@
180 180  
181 181 if (unit) {
182 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 183 atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status);
187 184 sdpnt->hostdata = NULL;
188 185 unit->device = NULL;