[SCSI] transport_srp: add rport roles attribute
authorFUJITA Tomonori <tomof@acm.org>
Wed, 11 Jul 2007 06:08:15 +0000 (15:08 +0900)
committerJames Bottomley <jejb@mulgrave.localdomain>
Fri, 12 Oct 2007 18:37:46 +0000 (14:37 -0400)
This adds a 'roles' attribute to rport like transport_fc. The role can
be initiator or target. That is, the initiator driver creates target
remote ports and the target driver creates initiator remote ports.

Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/infiniband/ulp/srp/ib_srp.c
drivers/scsi/ibmvscsi/ibmvscsi.c
drivers/scsi/scsi_transport_srp.c
include/scsi/scsi_transport_srp.h

index d8d056e004bb0618be84e59588ab5ec00453d7f5..e616c4fc6ff0046262fecf288c71ddf438787825 100644 (file)
@@ -1545,6 +1545,7 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
 
        memcpy(ids.port_id, &target->id_ext, 8);
        memcpy(ids.port_id + 8, &target->ioc_guid, 8);
+       ids.roles = SRP_RPORT_ROLE_TARGET;
        rport = srp_rport_add(target->scsi_host, &ids);
        if (IS_ERR(rport)) {
                scsi_remove_host(target->scsi_host);
index e6f937eeb78f8c1489e7eb29d08850cbfd9b7bf4..93bd01b1e4b50a0f6238e161f14f200073ff01e2 100644 (file)
@@ -1599,6 +1599,7 @@ static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
        /* we don't have a proper target_port_id so let's use the fake one */
        memcpy(ids.port_id, hostdata->madapter_info.partition_name,
               sizeof(ids.port_id));
+       ids.roles = SRP_RPORT_ROLE_TARGET;
        rport = srp_rport_add(host, &ids);
        if (IS_ERR(rport))
                goto add_srp_port_failed;
index dcb3d2aa780c6f5d2ddd85468c92917766557b4a..608abd8aef20a2282ccdc840e032cff5ed94043d 100644 (file)
@@ -37,7 +37,7 @@ struct srp_host_attrs {
 #define to_srp_host_attrs(host)        ((struct srp_host_attrs *)(host)->shost_data)
 
 #define SRP_HOST_ATTRS 0
-#define SRP_RPORT_ATTRS 3
+#define SRP_RPORT_ATTRS 2
 
 struct srp_internal {
        struct scsi_transport_template t;
@@ -107,6 +107,31 @@ show_srp_rport_id(struct class_device *cdev, char *buf)
 
 static CLASS_DEVICE_ATTR(port_id, S_IRUGO, show_srp_rport_id, NULL);
 
+static const struct {
+       u32 value;
+       char *name;
+} srp_rport_role_names[] = {
+       {SRP_RPORT_ROLE_INITIATOR, "SRP Initiator"},
+       {SRP_RPORT_ROLE_TARGET, "SRP Target"},
+};
+
+static ssize_t
+show_srp_rport_roles(struct class_device *cdev, char *buf)
+{
+       struct srp_rport *rport = transport_class_to_srp_rport(cdev);
+       int i;
+       char *name = NULL;
+
+       for (i = 0; i < ARRAY_SIZE(srp_rport_role_names); i++)
+               if (srp_rport_role_names[i].value == rport->roles) {
+                       name = srp_rport_role_names[i].name;
+                       break;
+               }
+       return sprintf(buf, "%s\n", name ? : "unknown");
+}
+
+static CLASS_DEVICE_ATTR(roles, S_IRUGO, show_srp_rport_roles, NULL);
+
 static void srp_rport_release(struct device *dev)
 {
        struct srp_rport *rport = dev_to_rport(dev);
@@ -182,6 +207,7 @@ struct srp_rport *srp_rport_add(struct Scsi_Host *shost,
        rport->dev.release = srp_rport_release;
 
        memcpy(rport->port_id, ids->port_id, sizeof(rport->port_id));
+       rport->roles = ids->roles;
 
        id = atomic_inc_return(&to_srp_host_attrs(shost)->next_port_id);
        sprintf(rport->dev.bus_id, "port-%d:%d", shost->host_no, id);
@@ -266,6 +292,7 @@ srp_attach_transport(struct srp_function_template *ft)
 
        count = 0;
        SETUP_RPORT_ATTRIBUTE_RD(port_id);
+       SETUP_RPORT_ATTRIBUTE_RD(roles);
        i->rport_attrs[count] = NULL;
 
        i->f = ft;
index adbfca402a69748ac0da9795287a810c00dc7a1f..08b4a28a77b871b3b111dfa49d9121e32b5543f2 100644 (file)
@@ -5,14 +5,19 @@
 #include <linux/types.h>
 #include <linux/mutex.h>
 
+#define SRP_RPORT_ROLE_INITIATOR 0
+#define SRP_RPORT_ROLE_TARGET 1
+
 struct srp_rport_identifiers {
        u8 port_id[16];
+       u8 roles;
 };
 
 struct srp_rport {
        struct device dev;
 
        u8 port_id[16];
+       u8 roles;
 };
 
 struct srp_function_template {