[PATCH] qla2xxx: Add SysFS hook for FC-NVMe autoconnect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch adds a SysFS hook for systemd service to kick
off autoconnect command at the boot time.

Output of the SysFS hook will provide host-traddr/traddr which will
be used by NVMe CLI to kick off discovery at boot time.

Signed-off-by: Himanshu Madhani <himanshu.madhani@xxxxxxxxxx>
---
Hi Martin, 

This patch provides mechanism for qla2xxx driver's boot time scripts for 
autodiscovery and autoconnection of NVMe LUNs. 

Please apply this to 4.21/scsi-queue at your earliest convenience. 

Thanks,
Himanshu
---
 drivers/scsi/qla2xxx/qla_attr.c | 122 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 121 insertions(+), 1 deletion(-)

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);
+}
+
 /* ----- */
 
 static ssize_t
@@ -2145,7 +2264,7 @@ static DEVICE_ATTR(zio_threshold, 0644,
 static DEVICE_ATTR_RW(qlini_mode);
 static DEVICE_ATTR_RW(ql2xexchoffld);
 static DEVICE_ATTR_RW(ql2xiniexchg);
-
+static DEVICE_ATTR(nvme_connect_str, 0444, qla27xx_nvme_connect_str_show, NULL);
 
 struct device_attribute *qla2x00_host_attrs[] = {
 	&dev_attr_driver_version,
@@ -2183,6 +2302,7 @@ struct device_attribute *qla2x00_host_attrs[] = {
 	&dev_attr_min_link_speed,
 	&dev_attr_max_speed_sup,
 	&dev_attr_zio_threshold,
+	&dev_attr_nvme_connect_str,
 	NULL, /* reserve for qlini_mode */
 	NULL, /* reserve for ql2xiniexchg */
 	NULL, /* reserve for ql2xexchoffld */
-- 
2.12.0




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux