From: Bart Van Assche <bvanassche@acm.org>
To: linux-rdma@vger.kernel.org, linux-scsi@vger.kernel.org
Cc: dillowda@ornl.gov, roland@purestorage.com,
fujita.tomonori@lab.ntt.co.jp, brking@linux.vnet.ibm.com
Subject: [PATCH 13/15] ib_srp: Allow SRP disconnect through sysfs
Date: Sun, 25 Mar 2012 15:01:40 +0000 [thread overview]
Message-ID: <12137079.5Hhh1ukOmv@asus> (raw)
In-Reply-To: <5207288.nSt5MkVMpO@asus>
Make it possible to disconnect the IB RC connection used by the
SRP protocol to communicate with a target.
Let the SRP transport layer create a sysfs "delete" attribute for
initiator drivers that support this functionality.
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Cc: David Dillow <dillowda@ornl.gov>
Cc: Roland Dreier <roland@purestorage.com>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Brian King <brking@linux.vnet.ibm.com>
---
Documentation/ABI/stable/sysfs-transport-srp | 7 +++++++
drivers/infiniband/ulp/srp/ib_srp.c | 24 +++++++++++++++++++++---
drivers/scsi/scsi_transport_srp.c | 22 +++++++++++++++++++++-
include/scsi/scsi_transport_srp.h | 8 ++++++++
4 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/Documentation/ABI/stable/sysfs-transport-srp b/Documentation/ABI/stable/sysfs-transport-srp
index 7b0d4a5..9fbc703 100644
--- a/Documentation/ABI/stable/sysfs-transport-srp
+++ b/Documentation/ABI/stable/sysfs-transport-srp
@@ -1,3 +1,10 @@
+What: /sys/class/srp_remote_ports/port-<h>:<n>/delete
+Date: January 1, 2012
+KernelVersion: 3.4
+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
diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c
index 564ff08..9f940a5 100644
--- a/drivers/infiniband/ulp/srp/ib_srp.c
+++ b/drivers/infiniband/ulp/srp/ib_srp.c
@@ -612,6 +612,21 @@ static void srp_remove_work(struct work_struct *work)
srp_remove_target(target);
}
+/*
+ * Note: it is up to the caller to ensure that invoking srp_rport_delete()
+ * does not trigger a race against target port removal in srp_remove_target().
+ * As an example, invoking srp_rport_delete() from the SCSI EH is not safe.
+ */
+static void srp_rport_delete(struct srp_rport *rport)
+{
+ struct srp_target_port *target = rport->lld_data;
+
+ BUG_ON(!target);
+
+ if (srp_change_state_to_removed(target))
+ queue_work(system_long_wq, &target->remove_work);
+}
+
static int srp_connect_target(struct srp_target_port *target)
{
int retries = 3;
@@ -1982,6 +1997,10 @@ static struct scsi_host_template srp_template = {
.shost_attrs = srp_host_attrs
};
+static struct srp_function_template ib_srp_transport_functions = {
+ .rport_delete = srp_rport_delete,
+};
+
static int srp_add_target(struct srp_host *host, struct srp_target_port *target)
{
struct srp_rport_identifiers ids;
@@ -2002,6 +2021,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);
@@ -2576,9 +2597,6 @@ static void srp_remove_one(struct ib_device *device)
kfree(srp_dev);
}
-static struct srp_function_template ib_srp_transport_functions = {
-};
-
static int __init srp_init_module(void)
{
int ret;
diff --git a/drivers/scsi/scsi_transport_srp.c b/drivers/scsi/scsi_transport_srp.c
index 0d85f79..f379c7f 100644
--- a/drivers/scsi/scsi_transport_srp.c
+++ b/drivers/scsi/scsi_transport_srp.c
@@ -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;
@@ -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);
@@ -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));
diff --git a/include/scsi/scsi_transport_srp.h b/include/scsi/scsi_transport_srp.h
index 9c60ca1..f47549f 100644
--- a/include/scsi/scsi_transport_srp.h
+++ b/include/scsi/scsi_transport_srp.h
@@ -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);
--
1.7.7
next prev parent reply other threads:[~2012-03-25 15:01 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-03-25 14:45 [PATCH 00/15, v3] Make ib_srp better suited for H.A. purposes Bart Van Assche
2012-03-25 14:47 ` [PATCH 01/15] ib_srp: Enlarge block layer timeout Bart Van Assche
2012-03-29 16:59 ` Dave Dillow
[not found] ` <20120329165931.GA19700-1Heg1YXhbW8@public.gmane.org>
2012-04-22 16:01 ` Bart Van Assche
[not found] ` <4F942B74.4040106-HInyCGIudOg@public.gmane.org>
2012-04-30 15:11 ` David Dillow
[not found] ` <1335798691.441.2.camel-zHLflQxYYDO4Hhoo1DtQwJ9G+ZOsUmrO@public.gmane.org>
2012-05-19 10:50 ` Bart Van Assche
[not found] ` <4FB77AEE.7030100-HInyCGIudOg@public.gmane.org>
2012-05-30 4:56 ` David Dillow
2012-03-25 14:48 ` [PATCH 02/15] ib_srp: Introduce srp_handle_qp_err() Bart Van Assche
2012-03-25 14:50 ` [PATCH 03/15] ib_srp: Micro-optimize srp_queuecommand() Bart Van Assche
2012-03-25 14:52 ` [PATCH 04/15] ib_srp: Suppress superfluous error messages Bart Van Assche
2012-03-25 14:53 ` [PATCH 05/15] ib_srp: Avoid that SCSI error handling triggers a crash Bart Van Assche
2012-03-25 14:54 ` [PATCH 06/15] ib_srp: Introduce the helper function srp_remove_target() Bart Van Assche
2012-03-25 14:55 ` [PATCH 07/15] ib_srp: Eliminate state SRP_TARGET_DEAD Bart Van Assche
2012-03-25 14:56 ` [PATCH 08/15] ib_srp: Make srp_disconnect_target() wait for IB completions Bart Van Assche
2012-03-25 14:57 ` [PATCH 09/15] srp_transport: Fix atttribute registration Bart Van Assche
2012-03-25 14:58 ` [PATCH 10/15] srp_transport: Simplify attribute initialization code Bart Van Assche
2012-03-25 14:59 ` [PATCH 11/15] srp_transport: Document sysfs attributes Bart Van Assche
2012-03-25 15:00 ` [PATCH 12/15] ib_srp: " Bart Van Assche
2012-03-25 15:01 ` Bart Van Assche [this message]
2012-07-16 22:20 ` [PATCH 13/15] ib_srp: Allow SRP disconnect through sysfs Mike Christie
[not found] ` <500493B4.4010303-hcNo3dDEHLuVc3sceRu5cw@public.gmane.org>
2012-07-17 12:55 ` bart-LmZ/31Jx5xYUl6sPKNhdgg
2012-03-25 15:02 ` [PATCH 14/15] ib_srp: Introduce a temporary variable in srp_remove_target() Bart Van Assche
2012-03-25 15:03 ` [PATCH 15/15] ib_srp: Maintain a single connection per I_T nexus Bart Van Assche
2012-03-25 15:18 ` [PATCH 00/15, v3] Make ib_srp better suited for H.A. purposes Bart Van Assche
2012-03-27 16:37 ` Dave Dillow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=12137079.5Hhh1ukOmv@asus \
--to=bvanassche@acm.org \
--cc=brking@linux.vnet.ibm.com \
--cc=dillowda@ornl.gov \
--cc=fujita.tomonori@lab.ntt.co.jp \
--cc=linux-rdma@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=roland@purestorage.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.