All of lore.kernel.org
 help / color / mirror / Atom feed
From: bmarzins@sourceware.org
To: dm-cvs@sourceware.org, dm-devel@redhat.com
Subject: multipath-tools/libcheckers Makefile checkers. ...
Date: 24 Nov 2009 20:03:17 -0000	[thread overview]
Message-ID: <20091124200317.15011.qmail@sourceware.org> (raw)

CVSROOT:	/cvs/dm
Module name:	multipath-tools
Branch: 	RHEL5_FC6
Changes by:	bmarzins@sourceware.org	2009-11-24 20:03:16

Modified files:
	libcheckers    : Makefile checkers.c checkers.h tur.c 
Added files:
	libcheckers    : hp_tur.h 

Log message:
	Fix for 437585.
	Added hp_tur checker, that checks if the LUNs wwid has changed.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/libcheckers/hp_tur.h.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=NONE&r2=1.1.2.1
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/libcheckers/Makefile.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.5.2.2&r2=1.5.2.3
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/libcheckers/checkers.c.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.1.2.3&r2=1.1.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/libcheckers/checkers.h.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.5.2.3&r2=1.5.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/multipath-tools/libcheckers/tur.c.diff?cvsroot=dm&only_with_tag=RHEL5_FC6&r1=1.4.2.3&r2=1.4.2.4

--- multipath-tools/libcheckers/Makefile	2007/06/18 17:37:18	1.5.2.2
+++ multipath-tools/libcheckers/Makefile	2009/11/24 20:03:16	1.5.2.3
@@ -6,7 +6,7 @@
 
 include ../Makefile.inc
 
-OBJS = checkers.o readsector0.o tur.o directio.o emc_clariion.o hp_sw.o rdac.o cciss_tur.o
+OBJS = checkers.o readsector0.o tur.o directio.o emc_clariion.o hp_sw.o rdac.o cciss_tur.o hp_tur.o
 
 all: $(BUILD)
 
@@ -16,6 +16,9 @@
 glibc: $(OBJS)
 	ar rs libcheckers-glibc.a *.o
 
+hp_tur.o: tur.c
+	$(CC) $(CFLAGS) -DCHECK_WWID -c -o $@ $<
+
 install:
 
 uninstall:
--- multipath-tools/libcheckers/checkers.c	2007/12/17 22:27:37	1.1.2.3
+++ multipath-tools/libcheckers/checkers.c	2009/11/24 20:03:16	1.1.2.4
@@ -5,6 +5,7 @@
 
 #include "directio.h"
 #include "tur.h"
+#include "hp_tur.h"
 #include "hp_sw.h"
 #include "emc_clariion.h"
 #include "rdac.h"
@@ -35,6 +36,16 @@
 	{
 		.fd         = 0,
 		.sync       = 1,
+		.name       = HP_TUR,
+		.message    = "",
+		.context    = NULL,
+		.check      = hp_tur,
+		.init       = hp_tur_init,
+		.free       = hp_tur_free
+	},
+	{
+		.fd         = 0,
+		.sync       = 1,
 		.name       = HP_SW,
 		.message    = "",
 		.context    = NULL,
@@ -82,7 +93,16 @@
 		.init       = cciss_tur_init,
 		.free       = cciss_tur_free
 	},
-	{0, 1, "", "", NULL, NULL, NULL, NULL},
+	{
+		.fd         = 0,
+		.sync       = 1,
+		.name       = "",
+		.message    = "",
+		.context    = NULL,
+		.check      = NULL,
+		.init       = NULL,
+		.free       = NULL
+	},
 };
 
 void checker_set_fd (struct checker * c, int fd)
--- multipath-tools/libcheckers/checkers.h	2007/12/17 22:27:37	1.5.2.3
+++ multipath-tools/libcheckers/checkers.h	2009/11/24 20:03:16	1.5.2.4
@@ -14,6 +14,7 @@
 
 #define DIRECTIO     "directio"
 #define TUR          "tur"
+#define HP_TUR	     "hp_tur"
 #define HP_SW        "hp_sw"
 #define RDAC         "rdac"
 #define EMC_CLARIION "emc_clariion"
@@ -43,12 +44,14 @@
 #define CHECKER_NAME_LEN 16
 #define CHECKER_MSG_LEN 256
 #define CHECKER_DEV_LEN 256
+#define WWID_SIZE 128
 
 struct checker {
 	int fd;
 	int sync;
 	char name[CHECKER_NAME_LEN];
 	char message[CHECKER_MSG_LEN];       /* comm with callers */
+	char wwid[WWID_SIZE];                /* LUN wwid */
 	void * context;                      /* store for persistent data */
 	int (*check)(struct checker *);
 	int (*init)(struct checker *);       /* to allocate the context */
--- multipath-tools/libcheckers/tur.c	2009/06/08 21:38:01	1.4.2.3
+++ multipath-tools/libcheckers/tur.c	2009/11/24 20:03:16	1.4.2.4
@@ -15,41 +15,155 @@
 
 #include "checkers.h"
 
+#include "../libmultipath/debug.h"
 #include "../libmultipath/sg_include.h"
 
 #define TUR_CMD_LEN 6
 #define HEAVY_CHECK_COUNT       10
 
+#ifdef CHECK_WWID
+/* from linux/include/scsi/scsi.h */
+#define DID_BUS_BUSY    0x02
+#define DID_ERROR       0x07
+#define DID_TRANSPORT_DISRUPTED 0x0e
+
+#define MSG_TUR_UP     "HP tur checker reports path is up"
+#define MSG_TUR_DOWN   "HP tur checker reports path is down"
+#define MSG_TUR_GHOST  "HP tur checker reports path is in standby state"
+#define EVPD            0x01
+#define PAGE_83         0x83
+#define INQUIRY_CMD     0x12
+#define INQUIRY_CMDLEN  6
+#define SCSI_INQ_BUFF_LEN 96
+#else
 #define MSG_TUR_UP	"tur checker reports path is up"
 #define MSG_TUR_GHOST	"tur checker reports path in standby state"
 #define MSG_TUR_DOWN	"tur checker reports path is down"
+#endif
+
+#ifdef CHECK_WWID
+static int
+do_inq(struct checker * c, char * wwid)
+{
+	int ret = -1;
+	unsigned char inq_cmd[INQUIRY_CMDLEN] =
+	{INQUIRY_CMD, EVPD, PAGE_83, 0, SCSI_INQ_BUFF_LEN, 0 };
+	unsigned char sense_buffer[32];
+	unsigned char resp_buffer[SCSI_INQ_BUFF_LEN];
+	char *pbuff;
+
+	int m,k;
+	int retry_tur = 5;
+	struct sg_io_hdr io_hdr;
+
+retry:
+	memset(resp_buffer, 0, sizeof(resp_buffer));
+	memset(&io_hdr, 0, sizeof(struct sg_io_hdr));
+
+	io_hdr.interface_id = 'S';
+	io_hdr.cmd_len = sizeof(inq_cmd);
+	io_hdr.mx_sb_len = sizeof(sense_buffer);
+	io_hdr.dxfer_direction = -3; // Data transfer from the device.
+	io_hdr.dxfer_len = sizeof(resp_buffer);
+	io_hdr.dxferp = (unsigned char *)resp_buffer;
+	io_hdr.cmdp = inq_cmd;
+	io_hdr.sbp = sense_buffer;
+	io_hdr.timeout = 60; // IOCTL timeout value.
+
+	if (ioctl(c->fd, SG_IO, &io_hdr) < 0) {
+		condlog(0, "SG_IO ioctl failed: %s", strerror(errno));
+		return ret;
+	}
+	if (io_hdr.info & SG_INFO_OK_MASK){
+		int key = 0, asc, ascq;
+
+		if (io_hdr.host_status == DID_BUS_BUSY ||
+				io_hdr.host_status == DID_ERROR ||
+				io_hdr.host_status == DID_TRANSPORT_DISRUPTED) {
+			if (--retry_tur)
+				goto retry;
+		}
+		if (io_hdr.sb_len_wr > 3) {
+			if (io_hdr.sbp[0] == 0x72 || io_hdr.sbp[0] == 0x73) {
+				key = io_hdr.sbp[1] & 0x0f;
+				asc = io_hdr.sbp[2];
+				ascq = io_hdr.sbp[3];
+			} else if (io_hdr.sb_len_wr > 13 &&
+					((io_hdr.sbp[0] & 0x7f) == 0x70 ||
+					 (io_hdr.sbp[0] & 0x7f) == 0x71)) {
+				key = io_hdr.sbp[2] & 0x0f;
+				asc = io_hdr.sbp[12];
+				ascq = io_hdr.sbp[13];
+			}
+		}
+		if (key == 0x6) {
+			/* Unit Attention, retry */
+			if (--retry_tur)
+				goto retry;
+		}
+		return ret;
+	}
+
+	pbuff = (char *) resp_buffer;
+
+	wwid[0] = '3';
+	for (m = 8, k = 1; m < 11; ++m, k+=2)
+		sprintf(&wwid[k], "%02x", (unsigned int)pbuff[m] & 0xff);
+	for (m = 11; m < 24; ++m, k+=2)
+		sprintf(&wwid[k], "%02x", (unsigned int)pbuff[m] & 0xff);
+
+	return (ret = 0);
+}
+#endif
+
 
 /* from linux/include/scsi/scsi.h */
 #define DID_BUS_BUSY    0x02
 #define DID_ERROR       0x07
 #define DID_TRANSPORT_DISRUPTED 0x0e
 
+#ifdef CHECK_WWID
+struct hp_tur_checker_context {
+#else
 struct tur_checker_context {
+#endif
 	void * dummy;
 };
 
+#ifdef CHECK_WWID
+int hp_tur_init (struct checker * c)
+{
+	memset(c->wwid, 0, WWID_SIZE);
+#else
 int tur_init (struct checker * c)
 {
+#endif
 	return 0;
 }
 
+#ifdef CHECK_WWID
+void hp_tur_free (struct checker * c)
+#else
 void tur_free (struct checker * c)
+#endif
 {
 	return;
 }
 
 extern int
+#ifdef CHECK_WWID
+hp_tur (struct checker * c)
+#else
 tur (struct checker * c)
+#endif
 {
 	struct sg_io_hdr io_hdr;
 	unsigned char turCmdBlk[TUR_CMD_LEN] = { 0x00, 0, 0, 0, 0, 0 };
 	unsigned char sense_buffer[32];
 	int retry_tur = 5;
+#ifdef CHECK_WWID
+	char wwid[WWID_SIZE];
+#endif
 
 retry:
 	memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
@@ -106,6 +220,24 @@
 		MSG(c, MSG_TUR_DOWN);
 		return PATH_DOWN;
 	}
+#ifdef CHECK_WWID
+	if (!do_inq(c, wwid)) {
+
+		if(!strcmp(c->wwid, "\0")) {
+			strcpy(c->wwid, wwid);
+			goto up;
+		}
+
+		if (strcmp(c->wwid , wwid)) {
+			condlog(0,
+				"hp_tur: Lun collided. new_wwid %s old_wwid %s",
+				wwid, c->wwid);
+			MSG(c, MSG_TUR_DOWN);
+			return PATH_DOWN;
+		}
+	}
+up:
+#endif
 	MSG(c, MSG_TUR_UP);
 	return PATH_UP;
 }

                 reply	other threads:[~2009-11-24 20:03 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20091124200317.15011.qmail@sourceware.org \
    --to=bmarzins@sourceware.org \
    --cc=dm-cvs@sourceware.org \
    --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 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.