[ofa-general] [PATCH] SRP: add orig_dgid to sysfs
ishai
ishai at dev.mellanox.co.il
Mon Mar 26 09:48:07 PDT 2007
Adding orig_dgid file to /sys/class/scsi_host. This file will present the
value of dgid that was "written" to /sys/class/infiniband_srp/.../add_target
This is useful when there is a dgid redirection by the CM.
Signed-off-by: Ishai Rabinovitz <ishai at mellanox.co.il>
Index: gen2_devel_kernel/drivers/infiniband/ulp/srp/ib_srp.c
===================================================================
--- gen2_devel_kernel.orig/drivers/infiniband/ulp/srp/ib_srp.c 2007-03-26 10:47:34.000000000 +0200
+++ gen2_devel_kernel/drivers/infiniband/ulp/srp/ib_srp.c 2007-03-26 17:35:54.000000000 +0200
@@ -1102,6 +1102,7 @@
target->path.dlid = cpi->redirect_lid;
target->path.pkey = cpi->redirect_pkey;
cm_id->remote_cm_qpn = be32_to_cpu(cpi->redirect_qp) & 0x00ffffff;
+ memcpy(target->orig_dgid, target->path.dgid.raw, 16);
memcpy(target->path.dgid.raw, cpi->redirect_gid, 16);
target->status = target->path.dlid ?
@@ -1116,6 +1117,8 @@
* reject reason code 25 when they mean 24
* (port redirect).
*/
+ memcpy(target->orig_dgid,
+ target->path.dgid.raw, 16);
memcpy(target->path.dgid.raw,
event->param.rej_rcvd.ari, 16);
@@ -1449,6 +1452,24 @@
return sprintf(buf, "0x%04x\n", be16_to_cpu(target->path.pkey));
}
+static ssize_t show_orig_dgid(struct class_device *cdev, char *buf)
+{
+ struct srp_target_port *target = host_to_target(class_to_shost(cdev));
+
+ if (target->state == SRP_TARGET_DEAD ||
+ target->state == SRP_TARGET_REMOVED)
+ return -ENODEV;
+
+ return sprintf(buf, "%04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x\n",
+ be16_to_cpu(((__be16 *) target->orig_dgid)[0]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[1]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[2]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[3]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[4]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[5]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[6]),
+ be16_to_cpu(((__be16 *) target->orig_dgid)[7]));
+}
static ssize_t show_dgid(struct class_device *cdev, char *buf)
{
struct srp_target_port *target = host_to_target(class_to_shost(cdev));
@@ -1498,6 +1519,7 @@
static CLASS_DEVICE_ATTR(service_id, S_IRUGO, show_service_id, NULL);
static CLASS_DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL);
static CLASS_DEVICE_ATTR(dgid, S_IRUGO, show_dgid, NULL);
+static CLASS_DEVICE_ATTR(orig_dgid, S_IRUGO, show_orig_dgid, NULL);
static CLASS_DEVICE_ATTR(zero_req_lim, S_IRUGO, show_zero_req_lim, NULL);
static CLASS_DEVICE_ATTR(local_ib_port, S_IRUGO, show_local_ib_port, NULL);
static CLASS_DEVICE_ATTR(local_ib_device, S_IRUGO, show_local_ib_device, NULL);
@@ -1508,6 +1530,7 @@
&class_device_attr_service_id,
&class_device_attr_pkey,
&class_device_attr_dgid,
+ &class_device_attr_orig_dgid,
&class_device_attr_zero_req_lim,
&class_device_attr_local_ib_port,
&class_device_attr_local_ib_device,
@@ -1796,6 +1819,7 @@
(int) be16_to_cpu(*(__be16 *) &target->path.dgid.raw[12]),
(int) be16_to_cpu(*(__be16 *) &target->path.dgid.raw[14]));
+ memcpy(target->orig_dgid, target->path.dgid.raw, 16);
ret = srp_create_target_ib(target);
if (ret)
goto err;
Index: gen2_devel_kernel/drivers/infiniband/ulp/srp/ib_srp.h
===================================================================
--- gen2_devel_kernel.orig/drivers/infiniband/ulp/srp/ib_srp.h 2007-03-25 16:07:20.000000000 +0200
+++ gen2_devel_kernel/drivers/infiniband/ulp/srp/ib_srp.h 2007-03-26 17:33:52.000000000 +0200
@@ -129,6 +129,7 @@
unsigned int scsi_id;
struct ib_sa_path_rec path;
+ u8 orig_dgid[16];
struct ib_sa_query *path_query;
int path_query_id;
More information about the general
mailing list