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.