On Mon, 2018-11-12 at 13:40 -0800, Himanshu Madhani wrote:
> diff --git a/drivers/scsi/qla2xxx/qla_attr.c
> b/drivers/scsi/qla2xxx/qla_attr.c
> index 678aff5ca947..323a4aa35f16 100644
> --- a/drivers/scsi/qla2xxx/qla_attr.c
> +++ b/drivers/scsi/qla2xxx/qla_attr.c
> @@ -1665,6 +1665,125 @@ qla2x00_max_speed_sup_show(struct device *dev,
> struct device_attribute *attr,
>           ha->max_speed_sup ? "32Gps" : "16Gps");
>  }
>  
> +static ssize_t
> +qla27xx_nvme_connect_str_show(struct device *dev, struct device_attribute
> *attr,
> +    char *buf)
> +{
> +     scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
> +     struct nvme_fc_remote_port *rport;
> +     struct nvme_fc_local_port *lport;
> +     struct qla_hw_data *ha = vha->hw;
> +     struct qla_nvme_rport *qla_rport, *trport;
> +     fc_port_t *fcport;
> +     char temp[150] = {0};
> +     char *rportstate = "";
> +
> +     if (!IS_QLA27XX(ha) && !IS_QLA28XX(ha))
> +             return scnprintf(buf, PAGE_SIZE, "\n");
> +
> +     if (!vha->flags.nvme_enabled)
> +             return scnprintf(buf, PAGE_SIZE, "%s\n",
> +                 "FC-NVMe is not enabled");
> +
> +     list_for_each_entry(fcport, &vha->vp_fcports, list) {
> +             if (!fcport) {
> +                     scnprintf(buf, PAGE_SIZE, "No FC host\n");
> +                     return strlen(buf);
> +             }
> +
> +             if (!vha->nvme_local_port) {
> +                     scnprintf(buf, PAGE_SIZE,
> +                         "FC-NVMe Initiator on 0x%16llx not
> registered.\n",
> +                         wwn_to_u64(fcport->port_name));
> +                     return strlen(buf);
> +             }
> +
> +             list_for_each_entry_safe(qla_rport, trport,
> +                 &vha->nvme_rport_list, list) {
> +                     if (qla_rport->fcport == fcport) {
> +                             rport = fcport->nvme_remote_port;
> +
> +                             lport = vha->nvme_local_port;
> +
> +                             scnprintf(temp, sizeof(temp),
> +                                 "FC-NVMe LPORT: host%ld nn-
> 0x%16llx:pn-0x%16llx port_id %06x %s\n",
> +                                 vha->host_no, lport->node_name,
> +                                 lport->port_name, lport->port_id,
> "ONLINE");
> +
> +                             if (strlcat(buf, temp, PAGE_SIZE) >=
> PAGE_SIZE)
> +                                     goto done;
> +
> +                             scnprintf(temp, sizeof(temp),
> +                                 "FC-NVMe RPORT: host%ld nn-0x%llx:pn-
> 0x%llx port_id %06x ",
> +                                 vha->host_no, rport->node_name,
> +                                 rport->port_name, rport->port_id);
> +
> +                             /* Find out Rport State */
> +                             if (rport->port_state &
> FC_OBJSTATE_ONLINE)
> +                                     rportstate = "ONLINE";
> +
> +                             if (rport->port_state &
> FC_OBJSTATE_UNKNOWN)
> +                                     rportstate = "UNKNOWN";
> +
> +                             if (rport->port_state &
> ~(FC_OBJSTATE_ONLINE |
> +                                 FC_OBJSTATE_UNKNOWN))
> +                                     rportstate = "UNSUPPORTED";
> +
> +                             if (strlcat(buf, temp, PAGE_SIZE) >=
> +                                 PAGE_SIZE)
> +                                     goto done;
> +
> +                             if (rport->port_role &
> +                                 (FC_PORT_ROLE_NVME_INITIATOR |
> +                                   FC_PORT_ROLE_NVME_TARGET |
> +                                   FC_PORT_ROLE_NVME_DISCOVERY)) {
> +                                     if (rport->port_role &
> +                                         FC_PORT_ROLE_NVME_INITIATOR)
> +                                             if (strlcat(buf,
> "INITIATOR ",
> +                                                 PAGE_SIZE) >=
> PAGE_SIZE)
> +                                                     goto done;
> +
> +                                     if (rport->port_role &
> +                                         FC_PORT_ROLE_NVME_TARGET)
> +                                             if (strlcat(buf, "TARGET
> ",
> +                                                 PAGE_SIZE) >=
> PAGE_SIZE)
> +                                                     goto done;
> +
> +                                     if (rport->port_role &
> +                                         FC_PORT_ROLE_NVME_DISCOVERY)
> +                                             if (strlcat(buf,
> "DISCOVERY ",
> +                                                 PAGE_SIZE) >=
> PAGE_SIZE)
> +                                                     goto done;
> +                             } else {
> +                                     if (strlcat(buf, "UNKNOWN_ROLE ",
> +                                         PAGE_SIZE) >= PAGE_SIZE)
> +                                             goto done;
> +                             }
> +                             scnprintf(temp, sizeof(temp), "%s\n",
> rportstate);
> +
> +                             if (strlcat(buf, temp, PAGE_SIZE) >=
> PAGE_SIZE)
> +                                     goto done;
> +
> +                             scnprintf(temp, sizeof(temp),
> +                                 "NVMECLI: host-traddr=nn-0x%16llx:pn-
> 0x%16llx traddr=nn-0x%16llx:pn-0x%16llx\n",
> +                                 lport->node_name, lport->port_name,
> +                                 rport->node_name, rport->port_name);
> +
> +                             if (strlcat(buf, temp, PAGE_SIZE) >=
> PAGE_SIZE)
> +                                     goto done;
> +                     }
> +             }
> +     }
> +
> +     return strlen(buf);
> +
> +done:
> +     ql_log(ql_log_warn, vha, 0xffff,
> +         "NVME connect string buffer size 0x%lx exceeds 0x%lx\n",
> +         sizeof(*buf), PAGE_SIZE);
> +     return strlen(buf);
> +}

Hi Himanshu,

Are you familiar with the "one value per file" rule for sysfs? A quote from
Documentation/filesystems/sysfs.txt: "Attributes should be ASCII text files,
preferably with only one value per file."

Thanks,

Bart.

Reply via email to