[SCSI] transport_srp: add rport roles attribute
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>
This commit is contained in:
Родитель
3236822b1c
Коммит
aebd5e476e
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
Загрузка…
Ссылка в новой задаче