scsi: lpfc: Fix nvme port role handling in sysfs and debugfs handlers.
authorJames Smart <jsmart2021@gmail.com>
Fri, 2 Jun 2017 04:06:57 +0000 (21:06 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 13 Jun 2017 01:37:30 +0000 (21:37 -0400)
While debugging Devloss and recovery, debugfs and sysfs were found to
not show the NVME port roles consistently.

The port role FC_PORT_ROLE_NVME_DISCOVERY was added with the devloss
bringup and the other issues were just oversight.

Add NVME Target and DISCSRVC to debugfs nodeinfo and sysfs nvme info
handlers. The full port role was added to the NVME data only not the
generic nodelist.

Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com>
Signed-off-by: James Smart <james.smart@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/lpfc/lpfc_attr.c
drivers/scsi/lpfc/lpfc_debugfs.c

index 6d9b83cd82a228cb34842a18b38612ac484e78df..200a614bb540d9dc0e297fc2e1fbc62e65afe4b9 100644 (file)
@@ -312,25 +312,23 @@ lpfc_nvme_info_show(struct device *dev, struct device_attribute *attr,
                len += snprintf(buf + len, PAGE_SIZE - len, "DID x%06x ",
                                nrport->port_id);
 
-               switch (nrport->port_role) {
-               case FC_PORT_ROLE_NVME_INITIATOR:
+               /* An NVME rport can have multiple roles. */
+               if (nrport->port_role & FC_PORT_ROLE_NVME_INITIATOR)
                        len +=  snprintf(buf + len, PAGE_SIZE - len,
                                         "INITIATOR ");
-                       break;
-               case FC_PORT_ROLE_NVME_TARGET:
+               if (nrport->port_role & FC_PORT_ROLE_NVME_TARGET)
                        len +=  snprintf(buf + len, PAGE_SIZE - len,
                                         "TARGET ");
-                       break;
-               case FC_PORT_ROLE_NVME_DISCOVERY:
+               if (nrport->port_role & FC_PORT_ROLE_NVME_DISCOVERY)
                        len +=  snprintf(buf + len, PAGE_SIZE - len,
-                                        "DISCOVERY ");
-                       break;
-               default:
+                                        "DISCSRVC ");
+               if (nrport->port_role & ~(FC_PORT_ROLE_NVME_INITIATOR |
+                                         FC_PORT_ROLE_NVME_TARGET |
+                                         FC_PORT_ROLE_NVME_DISCOVERY))
                        len +=  snprintf(buf + len, PAGE_SIZE - len,
-                                        "UNKNOWN_ROLE x%x",
+                                        "UNKNOWN ROLE x%x",
                                         nrport->port_role);
-                       break;
-               }
+
                len +=  snprintf(buf + len, PAGE_SIZE - len, "%s  ", statep);
                /* Terminate the string. */
                len +=  snprintf(buf + len, PAGE_SIZE - len, "\n");
index e288e59c967f50006ac4a65aed4d15c5d025f0cc..fe3215241c46235873f9398e9f11fb80db9e3dda 100644 (file)
@@ -621,6 +621,13 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size)
                                ndlp->nlp_sid);
                if (ndlp->nlp_type & NLP_FCP_INITIATOR)
                        len += snprintf(buf+len, size-len, "FCP_INITIATOR ");
+               if (ndlp->nlp_type & NLP_NVME_TARGET)
+                       len += snprintf(buf + len,
+                                       size - len, "NVME_TGT sid:%d ",
+                                       NLP_NO_SID);
+               if (ndlp->nlp_type & NLP_NVME_INITIATOR)
+                       len += snprintf(buf + len,
+                                       size - len, "NVME_INITIATOR ");
                len += snprintf(buf+len, size-len, "usgmap:%x ",
                        ndlp->nlp_usg_map);
                len += snprintf(buf+len, size-len, "refcnt:%x",
@@ -698,26 +705,23 @@ lpfc_debugfs_nodelist_data(struct lpfc_vport *vport, char *buf, int size)
                                nrport->port_name);
                len += snprintf(buf + len, size - len, "WWNN x%llx ",
                                nrport->node_name);
-               switch (nrport->port_role) {
-               case FC_PORT_ROLE_NVME_INITIATOR:
+
+               /* An NVME rport can have multiple roles. */
+               if (nrport->port_role & FC_PORT_ROLE_NVME_INITIATOR)
                        len +=  snprintf(buf + len, size - len,
-                                        "NVME INITIATOR ");
-                       break;
-               case FC_PORT_ROLE_NVME_TARGET:
+                                        "INITIATOR ");
+               if (nrport->port_role & FC_PORT_ROLE_NVME_TARGET)
                        len +=  snprintf(buf + len, size - len,
-                                        "NVME TARGET ");
-                       break;
-               case FC_PORT_ROLE_NVME_DISCOVERY:
+                                        "TARGET ");
+               if (nrport->port_role & FC_PORT_ROLE_NVME_DISCOVERY)
                        len +=  snprintf(buf + len, size - len,
-                                        "NVME DISCOVERY ");
-                       break;
-               default:
+                                        "DISCSRVC ");
+               if (nrport->port_role & ~(FC_PORT_ROLE_NVME_INITIATOR |
+                                         FC_PORT_ROLE_NVME_TARGET |
+                                         FC_PORT_ROLE_NVME_DISCOVERY))
                        len +=  snprintf(buf + len, size - len,
                                         "UNKNOWN ROLE x%x",
                                         nrport->port_role);
-                       break;
-               }
-
                /* Terminate the string. */
                len +=  snprintf(buf + len, size - len, "\n");
        }