mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-07 23:28:55 +00:00
[SCSI] zfcp: fix deadlock between wq triggered port scan and ERP
Waiting for the ERP to be finished in a task running in the global kernel work-queue is a bad idea, especially if the ERP needs to run another job in this work-queue before it can finish. -> deadlock. This patch removes the necessity to wait for a finished ERP from the scan task and moves the job scheduling to the end of the ERP. Signed-off-by: Swen Schillig <swen@vnet.ibm.com> Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
0ac55aa90f
commit
fca55b6fb5
2 changed files with 2 additions and 2 deletions
|
@ -720,7 +720,6 @@ static int zfcp_erp_adapter_strategy_generic(struct zfcp_erp_action *act,
|
||||||
goto failed_openfcp;
|
goto failed_openfcp;
|
||||||
|
|
||||||
atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &act->adapter->status);
|
atomic_set_mask(ZFCP_STATUS_COMMON_OPEN, &act->adapter->status);
|
||||||
schedule_work(&act->adapter->scan_work);
|
|
||||||
|
|
||||||
return ZFCP_ERP_SUCCEEDED;
|
return ZFCP_ERP_SUCCEEDED;
|
||||||
|
|
||||||
|
@ -1284,6 +1283,8 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
||||||
case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
|
case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
|
||||||
if (result != ZFCP_ERP_SUCCEEDED)
|
if (result != ZFCP_ERP_SUCCEEDED)
|
||||||
zfcp_erp_rports_del(adapter);
|
zfcp_erp_rports_del(adapter);
|
||||||
|
else
|
||||||
|
schedule_work(&adapter->scan_work);
|
||||||
zfcp_adapter_put(adapter);
|
zfcp_adapter_put(adapter);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -610,7 +610,6 @@ int zfcp_scan_ports(struct zfcp_adapter *adapter)
|
||||||
int ret, i;
|
int ret, i;
|
||||||
struct zfcp_gpn_ft *gpn_ft;
|
struct zfcp_gpn_ft *gpn_ft;
|
||||||
|
|
||||||
zfcp_erp_wait(adapter); /* wait until adapter is finished with ERP */
|
|
||||||
if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT)
|
if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue