scsi: zfcp: enhance handling of FC Endpoint Security errors
Enable for explicit FCP channel FC Endpoint Security error reporting and handle any FSF security errors according to specification. Take the following recovery actions when a FSF_SECURITY_ERROR is reported for the specified FSF commands: - Open Port: Retry the command if possible - Send FCP : Physically close the remote port and reopen For Open Port the command status is set to error, which triggers a retry. For Send FCP the command status is set to error and recovery is triggered to physically reopen the remote port. Link: https://lore.kernel.org/r/20200312174505.51294-10-maier@linux.ibm.com Reviewed-by: Steffen Maier <maier@linux.ibm.com> Signed-off-by: Jens Remus <jremus@linux.ibm.com> Signed-off-by: Steffen Maier <maier@linux.ibm.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Родитель
616da39e00
Коммит
e53d92856e
|
@ -1405,7 +1405,8 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action)
|
|||
req->qtcb->bottom.config.feature_selection =
|
||||
FSF_FEATURE_NOTIFICATION_LOST |
|
||||
FSF_FEATURE_UPDATE_ALERT |
|
||||
FSF_FEATURE_REQUEST_SFP_DATA;
|
||||
FSF_FEATURE_REQUEST_SFP_DATA |
|
||||
FSF_FEATURE_FC_SECURITY;
|
||||
req->erp_action = erp_action;
|
||||
req->handler = zfcp_fsf_exchange_config_data_handler;
|
||||
erp_action->fsf_req_id = req->req_id;
|
||||
|
@ -1459,7 +1460,8 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio,
|
|||
req->qtcb->bottom.config.feature_selection =
|
||||
FSF_FEATURE_NOTIFICATION_LOST |
|
||||
FSF_FEATURE_UPDATE_ALERT |
|
||||
FSF_FEATURE_REQUEST_SFP_DATA;
|
||||
FSF_FEATURE_REQUEST_SFP_DATA |
|
||||
FSF_FEATURE_FC_SECURITY;
|
||||
|
||||
if (data)
|
||||
req->data = data;
|
||||
|
@ -1668,6 +1670,9 @@ static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req)
|
|||
ZFCP_STATUS_COMMON_ERP_FAILED);
|
||||
req->status |= ZFCP_STATUS_FSFREQ_ERROR;
|
||||
break;
|
||||
case FSF_SECURITY_ERROR:
|
||||
req->status |= ZFCP_STATUS_FSFREQ_ERROR;
|
||||
break;
|
||||
case FSF_ADAPTER_STATUS_AVAILABLE:
|
||||
switch (header->fsf_status_qual.word[0]) {
|
||||
case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
|
||||
|
@ -2398,6 +2403,10 @@ static void zfcp_fsf_fcp_handler_common(struct zfcp_fsf_req *req,
|
|||
zfcp_fc_test_link(zfcp_sdev->port);
|
||||
req->status |= ZFCP_STATUS_FSFREQ_ERROR;
|
||||
break;
|
||||
case FSF_SECURITY_ERROR:
|
||||
zfcp_erp_port_forced_reopen(zfcp_sdev->port, 0, "fssfch7");
|
||||
req->status |= ZFCP_STATUS_FSFREQ_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -78,6 +78,7 @@
|
|||
#define FSF_BLOCK_GUARD_CHECK_FAILURE 0x00000081
|
||||
#define FSF_APP_TAG_CHECK_FAILURE 0x00000082
|
||||
#define FSF_REF_TAG_CHECK_FAILURE 0x00000083
|
||||
#define FSF_SECURITY_ERROR 0x00000090
|
||||
#define FSF_ADAPTER_STATUS_AVAILABLE 0x000000AD
|
||||
#define FSF_FCP_RSP_AVAILABLE 0x000000AF
|
||||
#define FSF_UNKNOWN_COMMAND 0x000000E2
|
||||
|
|
Загрузка…
Ссылка в новой задаче