scsi: zfcp: enhance handling of FC Endpoint Security errors
authorJens Remus <jremus@linux.ibm.com>
Thu, 12 Mar 2020 17:45:04 +0000 (18:45 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 17 Mar 2020 17:12:41 +0000 (13:12 -0400)
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>
drivers/s390/scsi/zfcp_fsf.c
drivers/s390/scsi/zfcp_fsf.h

index 1d3eac1..e8d0bf0 100644 (file)
@@ -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;
        }
 }
 
index 66de170..c6a56f9 100644 (file)
@@ -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