Linux Device Mapper development
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: Christophe Varoqui <christophe.varoqui@gmail.com>
Cc: dm-devel@redhat.com
Subject: [PATCH 11/13] Set recovery_tmo for iSCSI devices
Date: Wed, 16 Jan 2013 13:14:14 +0100	[thread overview]
Message-ID: <1358338456-1234-12-git-send-email-hare@suse.de> (raw)
In-Reply-To: <1358338456-1234-1-git-send-email-hare@suse.de>

iSCSI has a 'recovery_tmo' value, which works similar to the
'fast_io_fail' mechanism on FibreChannel.
So we should be setting it from multipath, too.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 libmultipath/discovery.c |   59 +++++++++++++++++++++++++++++++++++++++------
 1 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index b6bce22..a099996 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -254,19 +254,22 @@ sysfs_get_tgt_nodename (struct path *pp, char * node)
 	targetid = NULL;
 	while (parent) {
 		targetid = udev_device_get_sysname(parent);
-		if (!strncmp(targetid , "session", 6))
+		if (targetid && sscanf(targetid , "session%d", &rport_id) == 1)
 			break;
 		parent = udev_device_get_parent(parent);
 		targetid = NULL;
+		rport_id = -1;
 	}
-	if (parent) {
-		tgtdev = udev_device_new_from_subsystem_sysname(conf->udev, "iscsi_session", targetid);
+	if (parent && targetid) {
+		tgtdev = udev_device_new_from_subsystem_sysname(conf->udev,
+				"iscsi_session", targetid);
 		if (tgtdev) {
 			const char *value;
 
 			value = udev_device_get_sysattr_value(tgtdev, "targetname");
 			if (value) {
 				pp->sg_id.proto_id = SCSI_PROTOCOL_ISCSI;
+				pp->sg_id.transport_id = rport_id;
 				strncpy(node, value, NODE_NAME_SIZE);
 				udev_device_unref(tgtdev);
 				return 0;
@@ -302,10 +305,6 @@ sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
 	char value[11];
 	char rport_id[32];
 
-	if (pp->sg_id.proto_id != SCSI_PROTOCOL_FCP) {
-		condlog(3, "%s: Not a FCP device", pp->dev);
-		return;
-	}
 	sprintf(rport_id, "rport-%d:%d-%d",
 		pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.transport_id);
 	rport_dev = udev_device_new_from_subsystem_sysname(conf->udev,
@@ -351,6 +350,47 @@ out:
 	udev_device_unref(rport_dev);
 }
 
+static void
+sysfs_set_session_tmo(struct multipath *mpp, struct path *pp)
+{
+	struct udev_device *session_dev = NULL;
+	char session_id[64];
+	char value[11];
+
+	sprintf(session_id, "session%d", pp->sg_id.transport_id);
+	session_dev = udev_device_new_from_subsystem_sysname(conf->udev,
+				"iscsi_session", session_id);
+	if (!session_dev) {
+		condlog(1, "%s: No iscsi session for '%s'", pp->dev,
+			session_id);
+		return;
+	}
+	condlog(4, "target%d:%d:%d -> %s", pp->sg_id.host_no,
+		pp->sg_id.channel, pp->sg_id.scsi_id, session_id);
+
+	if (mpp->dev_loss) {
+		condlog(3, "%s: ignoring dev_loss_tmo on iSCSI", pp->dev);
+	}
+	if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
+		if (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF) {
+			condlog(3, "%s: can't switch off fast_io_fail_tmo "
+				"on iSCSI", pp->dev);
+		} else if (mpp->fast_io_fail == MP_FAST_IO_FAIL_ZERO) {
+			condlog(3, "%s: can't set fast_io_fail_tmo to '0'"
+				"on iSCSI", pp->dev);
+		} else {
+			snprintf(value, 11, "%u", mpp->fast_io_fail);
+			if (sysfs_attr_set_value(session_dev, "recovery_tmo",
+						 value, 11)) {
+				condlog(3, "%s: Failed to set recovery_tmo, "
+					" error %d", pp->dev, errno);
+			}
+		}
+	}
+	udev_device_unref(session_dev);
+	return;
+}
+
 int
 sysfs_set_scsi_tmo (struct multipath *mpp)
 {
@@ -382,7 +422,10 @@ sysfs_set_scsi_tmo (struct multipath *mpp)
 		return 0;
 
 	vector_foreach_slot(mpp->paths, pp, i) {
-		sysfs_set_rport_tmo(mpp, pp);
+		if (pp->sg_id.proto_id == SCSI_PROTOCOL_FCP)
+			sysfs_set_rport_tmo(mpp, pp);
+		if (pp->sg_id.proto_id == SCSI_PROTOCOL_ISCSI)
+			sysfs_set_session_tmo(mpp, pp);
 	}
 	return 0;
 }
-- 
1.7.4.2

  parent reply	other threads:[~2013-01-16 12:14 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-16 12:14 [PATCH 00/13] More patches from SLES Hannes Reinecke
2013-01-16 12:14 ` [PATCH 01/13] Fixup .gitignore Hannes Reinecke
2013-01-16 12:14 ` [PATCH 02/13] Check for !SUSPENDED in kpartx rules Hannes Reinecke
2013-01-16 12:14 ` [PATCH 03/13] kpartx.rules: Check for accessible device-mapper device Hannes Reinecke
2013-01-16 12:14 ` [PATCH 04/13] Correct persistent symlink for cciss Hannes Reinecke
2013-01-16 12:14 ` [PATCH 05/13] Add hardware entry for Intel Multi-Flex Hannes Reinecke
2013-01-16 12:14 ` [PATCH 06/13] Add Datacore SANSymphony to hwtable Hannes Reinecke
2013-01-16 20:53   ` Christophe Varoqui
2013-01-16 12:14 ` [PATCH 07/13] Add SUN STK6580 to hardware table Hannes Reinecke
2013-01-16 12:14 ` [PATCH 08/13] Remove unused structures Hannes Reinecke
2013-01-16 12:14 ` [PATCH 09/13] Use transport identifiers when detecting devices Hannes Reinecke
2013-01-16 12:14 ` [PATCH 10/13] Discover target ids for ATA Hannes Reinecke
2013-01-16 12:14 ` Hannes Reinecke [this message]
2013-01-16 12:14 ` [PATCH 12/13] Set I_T_nexus_loss_timeout on SAS devices Hannes Reinecke
2013-01-16 12:14 ` [PATCH 13/13] Rename variables in sysfs_get_tgt_nodename Hannes Reinecke
2013-01-16 21:06 ` [PATCH 00/13] More patches from SLES Christophe Varoqui

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=1358338456-1234-12-git-send-email-hare@suse.de \
    --to=hare@suse.de \
    --cc=christophe.varoqui@gmail.com \
    --cc=dm-devel@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox