Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 343687
b: refs/heads/master
c: dc1bdbd
h: refs/heads/master
i:
  343685: 2054518
  343683: a96ffa8
  343679: ea9d287
v: v3
  • Loading branch information
Bart Van Assche authored and Roland Dreier committed Dec 1, 2012
1 parent 6c92de4 commit 66f1e54
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 7e1265bfe75f0ef1a9f5cfde202df68b7e35a53f
refs/heads/master: dc1bdbd9b8a077018d82230bc378f1bcfd8adba8
7 changes: 7 additions & 0 deletions trunk/Documentation/ABI/stable/sysfs-transport-srp
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
What: /sys/class/srp_remote_ports/port-<h>:<n>/delete
Date: June 1, 2012
KernelVersion: 3.7
Contact: linux-scsi@vger.kernel.org, linux-rdma@vger.kernel.org
Description: Instructs an SRP initiator to disconnect from a target and to
remove all LUNs imported from that target.

What: /sys/class/srp_remote_ports/port-<h>:<n>/port_id
Date: June 27, 2007
KernelVersion: 2.6.24
Expand Down
10 changes: 10 additions & 0 deletions trunk/drivers/infiniband/ulp/srp/ib_srp.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,13 @@ static void srp_remove_work(struct work_struct *work)
srp_remove_target(target);
}

static void srp_rport_delete(struct srp_rport *rport)
{
struct srp_target_port *target = rport->lld_data;

srp_queue_remove_work(target);
}

static int srp_connect_target(struct srp_target_port *target)
{
int retries = 3;
Expand Down Expand Up @@ -1958,6 +1965,8 @@ static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
return PTR_ERR(rport);
}

rport->lld_data = target;

spin_lock(&host->target_lock);
list_add_tail(&target->list, &host->target_list);
spin_unlock(&host->target_lock);
Expand Down Expand Up @@ -2524,6 +2533,7 @@ static void srp_remove_one(struct ib_device *device)
}

static struct srp_function_template ib_srp_transport_functions = {
.rport_delete = srp_rport_delete,
};

static int __init srp_init_module(void)
Expand Down
22 changes: 21 additions & 1 deletion trunk/drivers/scsi/scsi_transport_srp.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,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 2
#define SRP_RPORT_ATTRS 3

struct srp_internal {
struct scsi_transport_template t;
Expand Down Expand Up @@ -116,6 +116,24 @@ show_srp_rport_roles(struct device *dev, struct device_attribute *attr,

static DEVICE_ATTR(roles, S_IRUGO, show_srp_rport_roles, NULL);

static ssize_t store_srp_rport_delete(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct srp_rport *rport = transport_class_to_srp_rport(dev);
struct Scsi_Host *shost = dev_to_shost(dev);
struct srp_internal *i = to_srp_internal(shost->transportt);

if (i->f->rport_delete) {
i->f->rport_delete(rport);
return count;
} else {
return -ENOSYS;
}
}

static DEVICE_ATTR(delete, S_IWUSR, NULL, store_srp_rport_delete);

static void srp_rport_release(struct device *dev)
{
struct srp_rport *rport = dev_to_rport(dev);
Expand Down Expand Up @@ -309,6 +327,8 @@ srp_attach_transport(struct srp_function_template *ft)
count = 0;
i->rport_attrs[count++] = &dev_attr_port_id;
i->rport_attrs[count++] = &dev_attr_roles;
if (ft->rport_delete)
i->rport_attrs[count++] = &dev_attr_delete;
i->rport_attrs[count++] = NULL;
BUG_ON(count > ARRAY_SIZE(i->rport_attrs));

Expand Down
8 changes: 8 additions & 0 deletions trunk/include/scsi/scsi_transport_srp.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,21 @@ struct srp_rport_identifiers {
};

struct srp_rport {
/* for initiator and target drivers */

struct device dev;

u8 port_id[16];
u8 roles;

/* for initiator drivers */

void *lld_data; /* LLD private data */
};

struct srp_function_template {
/* for initiator drivers */
void (*rport_delete)(struct srp_rport *rport);
/* for target drivers */
int (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
int (* it_nexus_response)(struct Scsi_Host *, u64, int);
Expand Down

0 comments on commit 66f1e54

Please sign in to comment.