Commit 1de1b43b authored by Christof Schmitt's avatar Christof Schmitt Committed by James Bottomley
Browse files

[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: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent e39c8877
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -844,8 +844,6 @@ zfcp_unit_enqueue(struct zfcp_port *port, fcp_lun_t fcp_lun)
	unit->sysfs_device.release = zfcp_sysfs_unit_release;
	dev_set_drvdata(&unit->sysfs_device, unit);

	init_waitqueue_head(&unit->scsi_scan_wq);

	/* mark unit unusable as long as sysfs registration is not complete */
	atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);

+0 −4
Original line number Diff line number Diff line
@@ -983,10 +983,6 @@ struct zfcp_unit {
        struct scsi_device     *device;        /* scsi device struct pointer */
	struct zfcp_erp_action erp_action;     /* pending error recovery */
        atomic_t               erp_counter;
	wait_queue_head_t      scsi_scan_wq;   /* can be used to wait until
						  all scsi_scan_target
						  requests have been
						  completed. */
};

/* FSF request */
+0 −1
Original line number Diff line number Diff line
@@ -1609,7 +1609,6 @@ static void zfcp_erp_scsi_scan(struct work_struct *work)
	scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
			 unit->scsi_lun, 0);
	atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
	wake_up(&unit->scsi_scan_wq);
	zfcp_unit_put(unit);
	kfree(p);
}
+0 −3
Original line number Diff line number Diff line
@@ -180,9 +180,6 @@ static void zfcp_scsi_slave_destroy(struct scsi_device *sdpnt)

	if (unit) {
		zfcp_erp_wait(unit->port->adapter);
		wait_event(unit->scsi_scan_wq,
			   atomic_test_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING,
					    &unit->status) == 0);
		atomic_clear_mask(ZFCP_STATUS_UNIT_REGISTERED, &unit->status);
		sdpnt->hostdata = NULL;
		unit->device = NULL;