summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcheckers/Makefile2
-rw-r--r--libcheckers/checkers.c130
-rw-r--r--libcheckers/checkers.h67
-rw-r--r--libcheckers/directio.c141
-rw-r--r--libcheckers/directio.h8
-rw-r--r--libcheckers/emc_clariion.c110
-rw-r--r--libcheckers/emc_clariion.h8
-rw-r--r--libcheckers/hp_sw.c80
-rw-r--r--libcheckers/hp_sw.h8
-rw-r--r--libcheckers/path_state.h6
-rw-r--r--libcheckers/readsector0.c54
-rw-r--r--libcheckers/readsector0.h8
-rw-r--r--libcheckers/selector.c79
-rw-r--r--libcheckers/tur.c77
-rw-r--r--libcheckers/tur.h8
-rw-r--r--libmultipath/Makefile2
-rw-r--r--libmultipath/blacklist.c2
-rw-r--r--libmultipath/callout.c2
-rw-r--r--libmultipath/config.c10
-rw-r--r--libmultipath/config.h5
-rw-r--r--libmultipath/configure.c3
-rw-r--r--libmultipath/devmapper.c2
-rw-r--r--libmultipath/dict.c25
-rw-r--r--libmultipath/discovery.c21
-rw-r--r--libmultipath/dmparser.c2
-rw-r--r--libmultipath/hwtable.c53
-rw-r--r--libmultipath/pgpolicies.c4
-rw-r--r--libmultipath/print.c5
-rw-r--r--libmultipath/propsel.c29
-rw-r--r--libmultipath/propsel.h2
-rw-r--r--libmultipath/structs.c6
-rw-r--r--libmultipath/structs.h3
-rw-r--r--libmultipath/structs_vec.c8
-rw-r--r--libmultipath/switchgroup.c3
-rw-r--r--multipath/main.c2
-rw-r--r--multipathd/cli_handlers.c1
-rw-r--r--multipathd/main.c26
-rw-r--r--multipathd/uxlsnr.c2
38 files changed, 470 insertions, 534 deletions
diff --git a/libcheckers/Makefile b/libcheckers/Makefile
index b3e7231..ec8c10d 100644
--- a/libcheckers/Makefile
+++ b/libcheckers/Makefile
@@ -6,7 +6,7 @@ BUILD = glibc
include ../Makefile.inc
-OBJS = readsector0.o tur.o selector.o directio.o emc_clariion.o hp_sw.o
+OBJS = checkers.o readsector0.o tur.o directio.o emc_clariion.o hp_sw.o
all: $(BUILD)
diff --git a/libcheckers/checkers.c b/libcheckers/checkers.c
new file mode 100644
index 0000000..a4a6091
--- /dev/null
+++ b/libcheckers/checkers.c
@@ -0,0 +1,130 @@
+#include <stdio.h>
+#include <string.h>
+
+#include "checkers.h"
+
+#include "directio.h"
+#include "tur.h"
+#include "hp_sw.h"
+#include "emc_clariion.h"
+#include "readsector0.h"
+
+static struct checker checkers[] = {
+ {
+ .fd = 0,
+ .name = DIRECTIO,
+ .message = "",
+ .context = NULL,
+ .check = directio,
+ .init = directio_init,
+ .free = directio_free
+ },
+ {
+ .fd = 0,
+ .name = TUR,
+ .message = "",
+ .context = NULL,
+ .check = tur,
+ .init = tur_init,
+ .free = tur_free
+ },
+ {
+ .fd = 0,
+ .name = HP_SW,
+ .message = "",
+ .context = NULL,
+ .check = hp_sw,
+ .init = hp_sw_init,
+ .free = hp_sw_free
+ },
+ {
+ .fd = 0,
+ .name = EMC_CLARIION,
+ .message = "",
+ .context = NULL,
+ .check = emc_clariion,
+ .init = emc_clariion_init,
+ .free = emc_clariion_free
+ },
+ {
+ .fd = 0,
+ .name = READSECTOR0,
+ .message = "",
+ .context = NULL,
+ .check = readsector0,
+ .init = readsector0_init,
+ .free = readsector0_free
+ },
+ {0, "", "", NULL, NULL, NULL, NULL},
+};
+
+void checker_set_fd (struct checker * c, int fd)
+{
+ c->fd = fd;
+}
+
+struct checker * checker_lookup (char * name)
+{
+ struct checker * c = &checkers[0];
+
+ while (c->check) {
+ if (!strncmp(name, c->name, CHECKER_NAME_LEN))
+ return c;
+ c += sizeof(struct checker);
+ }
+ return NULL;
+}
+
+int checker_init (struct checker * c)
+{
+ return c->init(c);
+}
+
+void checker_put (struct checker * c)
+{
+ c->free(c);
+ memset(c, 0x0, sizeof(struct checker));
+}
+
+int checker_check (struct checker * c)
+{
+ int r;
+
+ if (c->fd <= 0) {
+ MSG(c, "no usable fd");
+ return PATH_WILD;
+ }
+ r = c->check(c);
+
+ return r;
+}
+
+int checker_selected (struct checker * c)
+{
+ return (c->check) ? 1 : 0;
+}
+
+char * checker_name (struct checker * c)
+{
+ return c->name;
+}
+
+char * checker_message (struct checker * c)
+{
+ return c->message;
+}
+
+struct checker * checker_default (void)
+{
+ return checker_lookup(DEFAULT_CHECKER);
+}
+
+void checker_get (struct checker * dst, struct checker * src)
+{
+ dst->fd = src->fd;
+ strncpy(dst->name, src->name, CHECKER_NAME_LEN);
+ strncpy(dst->message, src->message, CHECKER_MSG_LEN);
+ dst->check = src->check;
+ dst->init = src->init;
+ dst->free = src->free;
+}
diff --git a/libcheckers/checkers.h b/libcheckers/checkers.h
index 305296e..ac795ed 100644
--- a/libcheckers/checkers.h
+++ b/libcheckers/checkers.h
@@ -1,32 +1,53 @@
#ifndef _CHECKERS_H
#define _CHECKERS_H
-#define CHECKER_NAME_SIZE 16
-#define DEVNODE_SIZE 256
-#define MAX_CHECKER_MSG_SIZE 256
-
-enum checkers {
- CHECKER_UNDEF,
- TUR,
- READSECTOR0,
- DIRECTIO,
- EMC_CLARIION,
- HP_SW
-};
+/*
+ * path states
+ */
+#define PATH_WILD -1
+#define PATH_UNCHECKED 0
+#define PATH_DOWN 1
+#define PATH_UP 2
+#define PATH_SHAKY 3
+#define PATH_GHOST 4
+
+#define DIRECTIO "directio"
+#define TUR "tur"
+#define HP_SW "hp_sw"
+#define EMC_CLARIION "emc_clariion"
+#define READSECTOR0 "readsector0"
-#define DEFAULT_CHECKER_ID READSECTOR0
+#define DEFAULT_CHECKER READSECTOR0
-#define MSG(a) if (msg != NULL) \
- snprintf(msg, MAX_CHECKER_MSG_SIZE, "%s", a);
+/*
+ * strings lengths
+ */
+#define CHECKER_NAME_LEN 16
+#define CHECKER_MSG_LEN 256
+#define CHECKER_DEV_LEN 256
+
+struct checker {
+ int fd;
+ char name[CHECKER_NAME_LEN];
+ char message[CHECKER_MSG_LEN]; /* comm with callers */
+ void * context; /* store for persistent data */
+ int (*check)(struct checker *);
+ int (*init)(struct checker *); /* to allocate the context */
+ void (*free)(struct checker *); /* to free the context */
+};
-int get_checker_id (char *);
-void *get_checker_addr (int);
-int get_checker_name (char *, int, int);
+#define MSG(c, a) snprintf((c)->message, CHECKER_MSG_LEN, a);
-int emc_clariion (int fd, char * msg, void ** ctxt);
-int directio (int fd, char * msg, void ** ctxt);
-int readsector0 (int fd, char * msg, void ** ctxt);
-int tur (int fd, char * msg, void ** ctxt);
-int hp_sw (int fd, char * msg, void ** ctxt);
+int checker_init (struct checker *);
+void checker_put (struct checker *);
+void checker_reset (struct checker * c);
+void checker_set_fd (struct checker *, int);
+struct checker * checker_lookup (char *);
+int checker_check (struct checker *);
+int checker_selected (struct checker *);
+char * checker_name (struct checker *);
+char * checker_message (struct checker *);
+struct checker * checker_default (void);
+void checker_get (struct checker *, struct checker *);
#endif /* _CHECKERS_H */
diff --git a/libcheckers/directio.c b/libcheckers/directio.c
index 2c75012..b53c1c3 100644
--- a/libcheckers/directio.c
+++ b/libcheckers/directio.c
@@ -13,17 +13,63 @@
#include <linux/fs.h>
#include <errno.h>
-#include "path_state.h"
#include "checkers.h"
#define MSG_DIRECTIO_UNKNOWN "directio checker is not available"
#define MSG_DIRECTIO_UP "directio checker reports path is up"
#define MSG_DIRECTIO_DOWN "directio checker reports path is down"
-struct readsector0_checker_context {
- void * dummy;
+struct directio_context {
+ int blksize;
+ unsigned char *buf;
+ unsigned char *ptr;
};
+int directio_init (struct checker * c)
+{
+ unsigned long pgsize = getpagesize();
+ struct directio_context * ct;
+
+ ct = malloc(sizeof(struct directio_context));
+ if (!ct)
+ return 1;
+ c->context = (void *)ct;
+
+ if (ioctl(c->fd, BLKBSZGET, &ct->blksize) < 0) {
+ MSG(c, "cannot get blocksize, set default");
+ ct->blksize = 512;
+ }
+ if (ct->blksize > 4096) {
+ /*
+ * Sanity check for DASD; BSZGET is broken
+ */
+ ct->blksize = 4096;
+ }
+ if (!ct->blksize)
+ goto out;
+ ct->buf = (unsigned char *)malloc(ct->blksize + pgsize);
+ if (!ct->buf)
+ goto out;
+ ct->ptr = (unsigned char *)(((unsigned long)ct->buf + pgsize - 1) &
+ (~(pgsize - 1)));
+
+ return 0;
+out:
+ free(ct);
+ return 1;
+}
+
+void directio_free (struct checker * c)
+{
+ struct directio_context * ct = (struct directio_context *)c->context;
+
+ if (!ct)
+ return;
+ if (ct->buf)
+ free(ct->buf);
+ free(ct);
+}
+
static int
direct_read (int fd, unsigned char * buff, int size)
{
@@ -68,101 +114,26 @@ direct_read (int fd, unsigned char * buff, int size)
return retval;
}
-extern int
-directio (int fd, char *msg, void **context)
+int directio (struct checker * c)
{
- unsigned char *buf, *ptr;
- struct readsector0_checker_context * ctxt = NULL;
- unsigned long pgsize, numsect;
- int ret, blksize;
+ int ret;
+ struct directio_context * ct = (struct directio_context *)c->context;
- pgsize = getpagesize();
-
- /*
- * caller passed in a context : use its address
- */
- if (context)
- ctxt = (struct readsector0_checker_context *) (*context);
-
- /*
- * passed in context is uninitialized or volatile context :
- * initialize it
- */
- if (!ctxt) {
- ctxt = malloc(sizeof(struct readsector0_checker_context));
- memset(ctxt, 0, sizeof(struct readsector0_checker_context));
-
- if (!ctxt) {
- MSG("cannot allocate context");
- return -1;
- }
- if (context)
- *context = ctxt;
- }
- if (fd <= 0) {
- MSG("no usable fd");
- ret = -1;
- goto out;
- }
-
- if (ioctl(fd, BLKGETSIZE, &numsect) < 0) {
- MSG("cannot get number of sectors, set default");
- numsect = 0;
- }
-
- if (ioctl(fd, BLKBSZGET, &blksize) < 0) {
- MSG("cannot get blocksize, set default");
- blksize = 512;
- }
-
- if (blksize > 4096) {
- /*
- * Sanity check for DASD; BSZGET is broken
- */
- blksize = 4096;
- }
-
- if (!blksize) {
- /*
- * Blocksize is 0, assume we can't write
- * to this device.
- */
- MSG(MSG_DIRECTIO_DOWN);
- ret = PATH_DOWN;
- goto out;
- }
-
- buf = (unsigned char *)malloc(blksize + pgsize);
- if (!buf){
- goto out;
- }
- ptr = (unsigned char *)(((unsigned long)buf + pgsize - 1) &
- (~(pgsize - 1)));
- ret = direct_read(fd, ptr, blksize);
+ ret = direct_read(c->fd, ct->ptr, ct->blksize);
switch (ret)
{
case PATH_UNCHECKED:
- MSG(MSG_DIRECTIO_UNKNOWN);
+ MSG(c, MSG_DIRECTIO_UNKNOWN);
break;
case PATH_DOWN:
- MSG(MSG_DIRECTIO_DOWN);
+ MSG(c, MSG_DIRECTIO_DOWN);
break;
case PATH_UP:
- MSG(MSG_DIRECTIO_UP);
+ MSG(c, MSG_DIRECTIO_UP);
break;
default:
break;
}
- free(buf);
-
-out:
- /*
- * caller told us he doesn't want to keep the context :
- * free it
- */
- if (!context)
- free(ctxt);
-
return ret;
}
diff --git a/libcheckers/directio.h b/libcheckers/directio.h
new file mode 100644
index 0000000..1865b1f
--- /dev/null
+++ b/libcheckers/directio.h
@@ -0,0 +1,8 @@
+#ifndef _DIRECTIO_H
+#define _DIRECTIO_H
+
+int directio (struct checker *);
+int directio_init (struct checker *);
+void directio_free (struct checker *);
+
+#endif /* _DIRECTIO_H */
diff --git a/libcheckers/emc_clariion.c b/libcheckers/emc_clariion.c
index 71ecf7a..30ad56e 100644
--- a/libcheckers/emc_clariion.c
+++ b/libcheckers/emc_clariion.c
@@ -11,7 +11,6 @@
#include <sys/ioctl.h>
#include <errno.h>
-#include "path_state.h"
#include "checkers.h"
#include "../libmultipath/sg_include.h"
@@ -21,54 +20,33 @@
#define HEAVY_CHECK_COUNT 10
struct emc_clariion_checker_context {
- int run_count;
char wwn[16];
unsigned wwn_set;
};
-int emc_clariion(int fd, char *msg, void **context)
+int emc_clariion_init (struct checker * c)
+{
+ c->context = malloc(sizeof(struct emc_clariion_checker_context));
+ if (!c->context)
+ return 1;
+ return 0;
+}
+
+void emc_clariion_free (struct checker * c)
+{
+ free(c->context);
+}
+
+int emc_clariion(struct checker * c)
{
unsigned char sense_buffer[256] = { 0, };
unsigned char sb[128] = { 0, };
unsigned char inqCmdBlk[INQUIRY_CMDLEN] = {INQUIRY_CMD, 1, 0xC0, 0,
sizeof(sb), 0};
struct sg_io_hdr io_hdr;
- struct emc_clariion_checker_context * ctxt = NULL;
- int ret;
+ struct emc_clariion_checker_context * ct =
+ (struct emc_clariion_checker_context *)c->context;
- /*
- * caller passed in a context : use its address
- */
- if (context)
- ctxt = (struct emc_clariion_checker_context *) (*context);
-
- /*
- * passed in context is uninitialized or volatile context :
- * initialize it
- */
- if (!ctxt) {
- ctxt = malloc(sizeof(struct emc_clariion_checker_context));
- memset(ctxt, 0, sizeof(struct emc_clariion_checker_context));
-
- if (!ctxt) {
- MSG("cannot allocate context");
- return -1;
- }
- if (context)
- *context = ctxt;
- }
- ctxt->run_count++;
-
- if ((ctxt->run_count % HEAVY_CHECK_COUNT) == 0) {
- ctxt->run_count = 0;
- /* do stuff */
- }
-
- if (fd <= 0) {
- MSG("no usable fd");
- ret = -1;
- goto out;
- }
memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = sizeof (inqCmdBlk);
@@ -80,21 +58,18 @@ int emc_clariion(int fd, char *msg, void **context)
io_hdr.sbp = sb;
io_hdr.timeout = 60000;
io_hdr.pack_id = 0;
- if (ioctl(fd, SG_IO, &io_hdr) < 0) {
- MSG("emc_clariion_checker: sending query command failed");
- ret = PATH_DOWN;
- goto out;
+ if (ioctl(c->fd, SG_IO, &io_hdr) < 0) {
+ MSG(c, "emc_clariion_checker: sending query command failed");
+ return PATH_DOWN;
}
if (io_hdr.info & SG_INFO_OK_MASK) {
- MSG("emc_clariion_checker: query command indicates error");
- ret = PATH_DOWN;
- goto out;
+ MSG(c, "emc_clariion_checker: query command indicates error");
+ return PATH_DOWN;
}
if (/* Verify the code page - right page & revision */
sense_buffer[1] != 0xc0 || sense_buffer[9] != 0x00) {
- MSG("emc_clariion_checker: Path unit report page in unknown format");
- ret = PATH_DOWN;
- goto out;
+ MSG(c, "emc_clariion_checker: Path unit report page in unknown format");
+ return PATH_DOWN;
}
if ( /* Effective initiator type */
@@ -103,16 +78,14 @@ int emc_clariion(int fd, char *msg, void **context)
|| (sense_buffer[28] & 0x07) != 0x04
/* Arraycommpath should be set to 1 */
|| (sense_buffer[30] & 0x04) != 0x04) {
- MSG("emc_clariion_checker: Path not correctly configured for failover");
- ret = PATH_DOWN;
- goto out;
+ MSG(c, "emc_clariion_checker: Path not correctly configured for failover");
+ return PATH_DOWN;
}
if ( /* LUN operations should indicate normal operations */
sense_buffer[48] != 0x00) {
- MSG("emc_clariion_checker: Path not available for normal operations");
- ret = PATH_SHAKY;
- goto out;
+ MSG(c, "emc_clariion_checker: Path not available for normal operations");
+ return PATH_SHAKY;
}
#if 0
@@ -120,8 +93,7 @@ int emc_clariion(int fd, char *msg, void **context)
* _would_ bind the path */
if ( /* LUN should at least be bound somewhere */
sense_buffer[4] != 0x00) {
- ret = PATH_UP;
- goto out;
+ return PATH_UP;
}
#endif
@@ -130,27 +102,17 @@ int emc_clariion(int fd, char *msg, void **context)
* change in between, to protect against the path suddenly
* pointing somewhere else.
*/
- if (context && ctxt->wwn_set) {
- if (memcmp(ctxt->wwn, &sense_buffer[10], 16) != 0) {
- MSG("emc_clariion_checker: Logical Unit WWN has changed!");
- ret = PATH_DOWN;
- goto out;
+ if (ct->wwn_set) {
+ if (memcmp(ct->wwn, &sense_buffer[10], 16) != 0) {
+ MSG(c, "emc_clariion_checker: Logical Unit WWN has changed!");
+ return PATH_DOWN;
}
} else {
- memcpy(ctxt->wwn, &sense_buffer[10], 16);
- ctxt->wwn_set = 1;
+ memcpy(ct->wwn, &sense_buffer[10], 16);
+ ct->wwn_set = 1;
}
- MSG("emc_clariion_checker: Path healthy");
- ret = PATH_UP;
-out:
- /*
- * caller told us he doesn't want to keep the context :
- * free it
- */
- if (!context)
- free(ctxt);
-
- return(ret);
+ MSG(c, "emc_clariion_checker: Path healthy");
+ return PATH_UP;
}
diff --git a/libcheckers/emc_clariion.h b/libcheckers/emc_clariion.h
new file mode 100644
index 0000000..a1018a6
--- /dev/null
+++ b/libcheckers/emc_clariion.h
@@ -0,0 +1,8 @@
+#ifndef _EMC_CLARIION_H
+#define _EMC_CLARIION_H
+
+int emc_clariion (struct checker *);
+int emc_clariion_init (struct checker *);
+void emc_clariion_free (struct checker *);
+
+#endif /* _EMC_CLARIION_H */
diff --git a/libcheckers/hp_sw.c b/libcheckers/hp_sw.c
index 6e4aac7..509e9c4 100644
--- a/libcheckers/hp_sw.c
+++ b/libcheckers/hp_sw.c
@@ -11,7 +11,6 @@
#include <sys/ioctl.h>
#include <errno.h>
-#include "path_state.h"
#include "checkers.h"
#include "../libmultipath/sg_include.h"
@@ -33,9 +32,19 @@
#define MSG_HP_SW_GHOST "hp_sw checker reports path is ghost"
struct sw_checker_context {
- int run_count;
+ void * dummy;
};
+int hp_sw_init (struct checker * c)
+{
+ return 0;
+}
+
+void hp_sw_free (struct checker * c)
+{
+ return;
+}
+
static int
do_inq(int sg_fd, int cmddt, int evpd, unsigned int pg_op,
void *resp, int mx_resp_len, int noisy)
@@ -115,66 +124,19 @@ do_tur (int fd)
}
extern int
-hp_sw (int fd, char *msg, void **context)
+hp_sw (struct checker * c)
{
char buff[MX_ALLOC_LEN];
- struct sw_checker_context * ctxt = NULL;
- int ret;
-
- /*
- * caller passed in a context : use its address
- */
- if (context)
- ctxt = (struct sw_checker_context *) (*context);
-
- /*
- * passed in context is uninitialized or volatile context :
- * initialize it
- */
- if (!ctxt) {
- ctxt = malloc(sizeof(struct sw_checker_context));
- memset(ctxt, 0, sizeof(struct sw_checker_context));
-
- if (!ctxt) {
- MSG("cannot allocate context");
- return -1;
- }
- if (context)
- *context = ctxt;
- }
- ctxt->run_count++;
- if ((ctxt->run_count % HEAVY_CHECK_COUNT) == 0) {
- ctxt->run_count = 0;
- /* do stuff */
- }
- if (fd <= 0) {
- MSG("no usable fd");
- ret = -1;
- goto out;
- }
-
- if (0 != do_inq(fd, 0, 1, 0x80, buff, MX_ALLOC_LEN, 0)) {
- MSG(MSG_HP_SW_DOWN);
- ret = PATH_DOWN;
- goto out;
+ if (0 != do_inq(c->fd, 0, 1, 0x80, buff, MX_ALLOC_LEN, 0)) {
+ MSG(c, MSG_HP_SW_DOWN);
+ return PATH_DOWN;
}
- if (do_tur(fd)) {
- MSG(MSG_HP_SW_GHOST);
- ret = PATH_GHOST;
- } else {
- MSG(MSG_HP_SW_UP);
- ret = PATH_UP;
- }
-
-out:
- /*
- * caller told us he doesn't want to keep the context :
- * free it
- */
- if (!context)
- free(ctxt);
-
- return(ret);
+ if (do_tur(c->fd)) {
+ MSG(c, MSG_HP_SW_GHOST);
+ return PATH_GHOST;
+ }
+ MSG(c, MSG_HP_SW_UP);
+ return PATH_UP;
}
diff --git a/libcheckers/hp_sw.h b/libcheckers/hp_sw.h
new file mode 100644
index 0000000..3be0d8e
--- /dev/null
+++ b/libcheckers/hp_sw.h
@@ -0,0 +1,8 @@
+#ifndef _HP_SW_H
+#define _HP_SW_H
+
+int hp_sw (struct checker *);
+int hp_sw_init (struct checker *);
+void hp_sw_free (struct checker *);
+
+#endif /* _HP_SW_H */
diff --git a/libcheckers/path_state.h b/libcheckers/path_state.h
deleted file mode 100644
index de31ecc..0000000
--- a/libcheckers/path_state.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#define PATH_WILD -1
-#define PATH_UNCHECKED 0
-#define PATH_DOWN 1
-#define PATH_UP 2
-#define PATH_SHAKY 3
-#define PATH_GHOST 4
diff --git a/libcheckers/readsector0.c b/libcheckers/readsector0.c
index a671dcd..e368fb4 100644
--- a/libcheckers/readsector0.c
+++ b/libcheckers/readsector0.c
@@ -11,7 +11,6 @@
#include <sys/ioctl.h>
#include <errno.h>
-#include "path_state.h"
#include "checkers.h"
#include "../libmultipath/sg_include.h"
@@ -26,6 +25,16 @@ struct readsector0_checker_context {
void * dummy;
};
+int readsector0_init (struct checker * c)
+{
+ return 0;
+}
+
+void readsector0_free (struct checker * c)
+{
+ return;
+}
+
static int
sg_read (int sg_fd, unsigned char * buff)
{
@@ -86,58 +95,23 @@ sg_read (int sg_fd, unsigned char * buff)
}
extern int
-readsector0 (int fd, char *msg, void **context)
+readsector0 (struct checker * c)
{
unsigned char buf[512];
- struct readsector0_checker_context * ctxt = NULL;
int ret;
- /*
- * caller passed in a context : use its address
- */
- if (context)
- ctxt = (struct readsector0_checker_context *) (*context);
-
- /*
- * passed in context is uninitialized or volatile context :
- * initialize it
- */
- if (!ctxt) {
- ctxt = malloc(sizeof(struct readsector0_checker_context));
- memset(ctxt, 0, sizeof(struct readsector0_checker_context));
-
- if (!ctxt) {
- MSG("cannot allocate context");
- return -1;
- }
- if (context)
- *context = ctxt;
- }
- if (fd <= 0) {
- MSG("no usable fd");
- ret = -1;
- goto out;
- }
- ret = sg_read(fd, &buf[0]);
+ ret = sg_read(c->fd, &buf[0]);
switch (ret)
{
case PATH_DOWN:
- MSG(MSG_READSECTOR0_DOWN);
+ MSG(c, MSG_READSECTOR0_DOWN);
break;
case PATH_UP:
- MSG(MSG_READSECTOR0_UP);
+ MSG(c, MSG_READSECTOR0_UP);
break;
default:
break;
}
-out:
- /*
- * caller told us he doesn't want to keep the context :
- * free it
- */
- if (!context)
- free(ctxt);
-
return ret;
}
diff --git a/libcheckers/readsector0.h b/libcheckers/readsector0.h
new file mode 100644
index 0000000..0f5d654
--- /dev/null
+++ b/libcheckers/readsector0.h
@@ -0,0 +1,8 @@
+#ifndef _READSECTOR0_H
+#define _READSECTOR0_H
+
+int readsector0 (struct checker *);
+int readsector0_init (struct checker *);
+void readsector0_free (struct checker *);
+
+#endif /* _READSECTOR0_H */
diff --git a/libcheckers/selector.c b/libcheckers/selector.c
deleted file mode 100644
index d310a31..0000000
--- a/libcheckers/selector.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2004, 2005 Christophe Varoqui
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "checkers.h"
-
-extern int
-get_checker_id (char * str)
-{
- if (0 == strncmp(str, "tur", 3))
- return TUR;
- if (0 == strncmp(str, "readsector0", 11))
- return READSECTOR0;
- if (0 == strncmp(str, "directio", 8))
- return DIRECTIO;
- if (0 == strncmp(str, "emc_clariion", 12))
- return EMC_CLARIION;
- if (0 == strncmp(str, "hp_sw", 5))
- return HP_SW;
- return -1;
-}
-
-extern void *
-get_checker_addr (int id)
-{
- int (*checker) (int, char *, void **);
-
- switch (id) {
- case TUR:
- checker = &tur;
- break;
- case READSECTOR0:
- checker = &readsector0;
- break;
- case DIRECTIO:
- checker = &directio;
- break;
- case EMC_CLARIION:
- checker = &emc_clariion;
- break;
- case HP_SW:
- checker = &hp_sw;
- break;
- default:
- checker = NULL;
- break;
- }
- return checker;
-}
-
-extern int
-get_checker_name (char * str, int len, int id)
-{
- char * s;
-
- switch (id) {
- case TUR:
- s = "tur";
- break;
- case READSECTOR0:
- s = "readsector0";
- break;
- case DIRECTIO:
- s = "directio";
- break;
- case EMC_CLARIION:
- s = "emc_clariion";
- break;
- case HP_SW:
- s = "hp_sw";
- break;
- default:
- s = "undefined";
- break;
- }
- return snprintf(str, len, "%s", s);
-}
diff --git a/libcheckers/tur.c b/libcheckers/tur.c
index 56964ab..d40a273 100644
--- a/libcheckers/tur.c
+++ b/libcheckers/tur.c
@@ -13,7 +13,6 @@
#include <sys/ioctl.h>
#include <errno.h>
-#include "path_state.h"
#include "checkers.h"
#include "../libmultipath/sg_include.h"
@@ -25,52 +24,26 @@
#define MSG_TUR_DOWN "tur checker reports path is down"
struct tur_checker_context {
- int run_count;
+ void * dummy;
};
+int tur_init (struct checker * c)
+{
+ return 0;
+}
+
+void tur_free (struct checker * c)
+{
+ return;
+}
extern int
-tur (int fd, char *msg, void **context)
+tur (struct checker * c)
{
+ struct sg_io_hdr io_hdr;
unsigned char turCmdBlk[TUR_CMD_LEN] = { 0x00, 0, 0, 0, 0, 0 };
- struct sg_io_hdr io_hdr;
unsigned char sense_buffer[32];
- struct tur_checker_context * ctxt = NULL;
- int ret;
- /*
- * caller passed in a context : use its address
- */
- if (context)
- ctxt = (struct tur_checker_context *) (*context);
-
- /*
- * passed in context is uninitialized or volatile context :
- * initialize it
- */
- if (!ctxt) {
- ctxt = malloc(sizeof(struct tur_checker_context));
- memset(ctxt, 0, sizeof(struct tur_checker_context));
-
- if (!ctxt) {
- MSG("cannot allocate context");
- return -1;
- }
- if (context)
- *context = ctxt;
- }
- ctxt->run_count++;
-
- if ((ctxt->run_count % HEAVY_CHECK_COUNT) == 0) {
- ctxt->run_count = 0;
- /* do stuff */
- }
- if (fd <= 0) {
- MSG("no usable fd");
- ret = -1;
- goto out;
- }
-
memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = sizeof (turCmdBlk);
@@ -80,26 +53,14 @@ tur (int fd, char *msg, void **context)
io_hdr.sbp = sense_buffer;
io_hdr.timeout = 20000;
io_hdr.pack_id = 0;
- if (ioctl(fd, SG_IO, &io_hdr) < 0) {
- MSG(MSG_TUR_DOWN);
- ret = PATH_DOWN;
- goto out;
+ if (ioctl(c->fd, SG_IO, &io_hdr) < 0) {
+ MSG(c, MSG_TUR_DOWN);
+ return PATH_DOWN;
}
if (io_hdr.info & SG_INFO_OK_MASK) {
- MSG(MSG_TUR_DOWN);
- ret = PATH_DOWN;
- goto out;
+ MSG(c, MSG_TUR_DOWN);
+ return PATH_DOWN;
}
- MSG(MSG_TUR_UP);
- ret = PATH_UP;
-
-out:
- /*
- * caller told us he doesn't want to keep the context :
- * free it
- */
- if (!context)
- free(ctxt);
-
- return(ret);
+ MSG(c, MSG_TUR_UP);
+ return PATH_UP;
}
diff --git a/libcheckers/tur.h b/libcheckers/tur.h
new file mode 100644
index 0000000..a2e8c88
--- /dev/null
+++ b/libcheckers/tur.h
@@ -0,0 +1,8 @@
+#ifndef _TUR_H
+#define _TUR_H
+
+int tur (struct checker *);
+int tur_init (struct checker *);
+void tur_free (struct checker *);
+
+#endif /* _TUR_H */
diff --git a/libmultipath/Makefile b/libmultipath/Makefile
index ae49d97..8a14b04 100644
--- a/libmultipath/Makefile
+++ b/libmultipath/Makefile
@@ -6,6 +6,8 @@ BUILD = glibc
include ../Makefile.inc
+CFLAGS = -I$(checkersdir)
+
OBJS = memory.o parser.o vector.o devmapper.o callout.o \
hwtable.o blacklist.o util.o dmparser.o config.o \
structs.o discovery.o propsel.o dict.o \
diff --git a/libmultipath/blacklist.c b/libmultipath/blacklist.c
index 1bb7277..92ab876 100644
--- a/libmultipath/blacklist.c
+++ b/libmultipath/blacklist.c
@@ -3,6 +3,8 @@
*/
#include <stdio.h>
+#include <checkers.h>
+
#include "memory.h"
#include "vector.h"
#include "util.h"
diff --git a/libmultipath/callout.c b/libmultipath/callout.c
index f4484b0..46b89e6 100644
--- a/libmultipath/callout.c
+++ b/libmultipath/callout.c
@@ -13,6 +13,8 @@
#include <sys/wait.h>
#include <errno.h>
+#include <checkers.h>
+
#include "vector.h"
#include "structs.h"
#include "debug.h"
diff --git a/libmultipath/config.c b/libmultipath/config.c
index efbb7f3..e4a8131 100644
--- a/libmultipath/config.c
+++ b/libmultipath/config.c
@@ -6,6 +6,8 @@
#include <stdio.h>
#include <string.h>
+#include <checkers.h>
+
#include "memory.h"
#include "util.h"
#include "debug.h"
@@ -18,8 +20,6 @@
#include "blacklist.h"
#include "defaults.h"
-#include "../libcheckers/checkers.h"
-
struct hwentry *
find_hwe (vector hwtable, char * vendor, char * product)
{
@@ -249,7 +249,7 @@ store_hwe (vector hwtable, struct hwentry * dhwe)
hwe->rr_weight = dhwe->rr_weight;
hwe->no_path_retry = dhwe->no_path_retry;
hwe->minio = dhwe->minio;
- hwe->checker_index = dhwe->checker_index;
+ hwe->checker = dhwe->checker;
if (!vector_alloc_slot(hwtable))
@@ -393,8 +393,8 @@ load_config (char * file)
!conf->hwhandler)
goto out;
- if (!conf->checker_index)
- conf->checker_index = READSECTOR0;
+ if (!conf->checker)
+ conf->checker = checker_lookup(DEFAULT_CHECKER);
return 0;
out:
diff --git a/libmultipath/config.h b/libmultipath/config.h
index 59a4f67..94a0f61 100644
--- a/libmultipath/config.h
+++ b/libmultipath/config.h
@@ -16,13 +16,14 @@ struct hwentry {
char * features;
char * hwhandler;
char * selector;
+ char * checker_name;
int pgpolicy;
int pgfailback;
int rr_weight;
int no_path_retry;
int minio;
- int checker_index;
+ struct checker * checker;
};
struct mpentry {
@@ -45,7 +46,7 @@ struct config {
int pgpolicy_flag;
int with_sysfs;
int pgpolicy;
- int checker_index;
+ struct checker * checker;
int dev_type;
int minio;
int checkint;
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index 342ef79..1ba4356 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -14,7 +14,8 @@
#include <errno.h>
#include <libdevmapper.h>
-#include "../libcheckers/path_state.h"
+#include <checkers.h>
+
#include "vector.h"
#include "memory.h"
#include "devmapper.h"
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c
index 13ad5d2..4328036 100644
--- a/libmultipath/devmapper.c
+++ b/libmultipath/devmapper.c
@@ -12,6 +12,8 @@
#include <linux/kdev_t.h>
#include <unistd.h>
+#include <checkers.h>
+
#include "vector.h"
#include "structs.h"
#include "debug.h"
diff --git a/libmultipath/dict.c b/libmultipath/dict.c
index af34e73..6dbae2c 100644
--- a/libmultipath/dict.c
+++ b/libmultipath/dict.c
@@ -4,6 +4,8 @@
* Copyright (c) 2005 Benjamin Marzinski, Redhat
* Copyright (c) 2005 Kiyoshi Ueda, NEC
*/
+#include <checkers.h>
+
#include "vector.h"
#include "hwtable.h"
#include "structs.h"
@@ -15,8 +17,6 @@
#include "blacklist.h"
#include "defaults.h"
-#include "../libcheckers/checkers.h"
-
/*
* default block handlers
*/
@@ -119,7 +119,7 @@ def_path_checker_handler(vector strvec)
if (!buff)
return 1;
- conf->checker_index = get_checker_id(buff);
+ conf->checker = checker_lookup(buff);
FREE(buff);
return 0;
@@ -420,7 +420,7 @@ hw_path_checker_handler(vector strvec)
if (!buff)
return 1;
- hwe->checker_index = get_checker_id(buff);
+ hwe->checker = checker_lookup(buff);
FREE(buff);
return 0;
@@ -1073,16 +1073,14 @@ snprint_hw_rr_min_io (char * buff, int len, void * data)
static int
snprint_hw_path_checker (char * buff, int len, void * data)
{
- char str[CHECKER_NAME_SIZE];
struct hwentry * hwe = (struct hwentry *)data;
- if (!hwe->checker_index)
+ if (!checker_selected(hwe->checker))
return 0;
- if (hwe->checker_index == conf->checker_index)
+ if (hwe->checker == conf->checker)
return 0;
- get_checker_name(str, CHECKER_NAME_SIZE, hwe->checker_index);
- return snprintf(buff, len, "%s", str);
+ return snprintf(buff, len, "%s", checker_name(hwe->checker));
}
static int
@@ -1168,15 +1166,12 @@ snprint_def_features (char * buff, int len, void * data)
static int
snprint_def_path_checker (char * buff, int len, void * data)
{
- char str[CHECKER_NAME_SIZE];
-
- if (!conf->checker_index)
+ if (!conf->checker)
return 0;
- if (conf->checker_index == DEFAULT_CHECKER_ID)
+ if (conf->checker == checker_default())
return 0;
- get_checker_name(str, CHECKER_NAME_SIZE, conf->checker_index);
- return snprintf(buff, len, "%s", str);
+ return snprintf(buff, len, "%s", checker_name(conf->checker));
}
static int
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 8e85028..56c8336 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -9,10 +9,11 @@
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <errno.h>
-
#include <sysfs/dlist.h>
#include <sysfs/libsysfs.h>
+#include <checkers.h>
+
#include "vector.h"
#include "memory.h"
#include "util.h"
@@ -25,8 +26,6 @@
#include "sg_include.h"
#include "discovery.h"
-#include "../libcheckers/path_state.h"
-
struct path *
store_pathinfo (vector pathvec, vector hwtable, char * devname, int flag)
{
@@ -608,11 +607,17 @@ scsi_ioctl_pathinfo (struct path * pp, int mask)
static int
get_state (struct path * pp)
{
- if (!pp->checkfn)
- select_checkfn(pp);
- if (!pp->checkfn)
- return 1;
- pp->state = pp->checkfn(pp->fd, NULL, NULL);
+ struct checker * c = &pp->checker;
+
+ if (!checker_selected(c)) {
+ select_checker(pp);
+ if (!checker_selected(c))
+ return 1;
+ checker_set_fd(c, pp->fd);
+ if (checker_init(c))
+ return 1;
+ }
+ pp->state = checker_check(c);
condlog(3, "%s: state = %i", pp->dev, pp->state);
return 0;
}
diff --git a/libmultipath/dmparser.c b/libmultipath/dmparser.c
index 278a24e..2b170c6 100644
--- a/libmultipath/dmparser.c
+++ b/libmultipath/dmparser.c
@@ -7,6 +7,8 @@
#include <stdlib.h>
#include <string.h>
+#include <checkers.h>
+
#include "vector.h"
#include "memory.h"
#include "structs.h"
diff --git a/libmultipath/hwtable.c b/libmultipath/hwtable.c
index c6564de..abafc3e 100644
--- a/libmultipath/hwtable.c
+++ b/libmultipath/hwtable.c
@@ -1,13 +1,13 @@
#include <stdio.h>
+#include <checkers.h>
+
#include "vector.h"
#include "defaults.h"
#include "structs.h"
#include "config.h"
#include "pgpolicies.h"
-#include "../libcheckers/checkers.h"
-
/*
* Tuning suggestions on these parameters should go to
* dm-devel@redhat.com
@@ -36,7 +36,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = DEFAULT_CHECKER_ID,
+ .checker_name = DEFAULT_CHECKER,
},
{
.vendor = "DEC",
@@ -51,7 +51,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = HP_SW,
+ .checker_name = HP_SW,
},
{
.vendor = "{COMPAQ,HP}",
@@ -66,7 +66,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = HP_SW,
+ .checker_name = HP_SW,
},
{
.vendor = "HP",
@@ -81,7 +81,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
{
.vendor = "HP",
@@ -96,7 +96,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
/*
* DDN controler family
@@ -117,7 +117,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
/*
* EMC / Clariion controler family
@@ -138,7 +138,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
{
.vendor = "DGC",
@@ -153,7 +153,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = EMC_CLARIION,
+ .checker_name = EMC_CLARIION,
},
/*
* Fujitsu controler family
@@ -174,7 +174,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
/*
* Hitachi controler family
@@ -195,7 +195,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
/*
* IBM controler family
@@ -216,7 +216,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
{
/* IBM DS4100 / FAStT100 */
@@ -232,7 +232,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
{
/* IBM DS4200 / FAStT200 */
@@ -248,7 +248,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
{
/* IBM ESS F20 aka Shark */
@@ -264,7 +264,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
{
/* IBM DS6000 / SAN Volume Controller */
@@ -280,7 +280,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
{
/* IBM DS8000 */
@@ -296,7 +296,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
{
/* IBM S/390 ECKD DASD */
@@ -312,7 +312,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = DIRECTIO,
+ .checker_name = DIRECTIO,
},
/*
* NETAPP controler family
@@ -333,7 +333,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
/*
* Pillar Data controler family
@@ -354,7 +354,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
/*
* SGI arrays
@@ -375,7 +375,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
{
.vendor = "SGI",
@@ -390,7 +390,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
/*
* STK arrays
@@ -411,7 +411,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = TUR,
+ .checker_name = TUR,
},
/*
* SUN arrays
@@ -432,7 +432,7 @@ static struct hwentry default_hw[] = {
.rr_weight = RR_WEIGHT_NONE,
.no_path_retry = NO_PATH_RETRY_UNDEF,
.minio = DEFAULT_MINIO,
- .checker_index = READSECTOR0,
+ .checker_name = READSECTOR0,
},
/*
* EOL
@@ -450,7 +450,7 @@ static struct hwentry default_hw[] = {
.rr_weight = 0,
.no_path_retry = 0,
.minio = 0,
- .checker_index = 0,
+ .checker_name = NULL,
},
};
@@ -461,6 +461,7 @@ setup_default_hwtable (vector hw)
struct hwentry * hwe = default_hw;
while (hwe->vendor) {
+ hwe->checker = checker_lookup(hwe->checker_name);
r += store_hwe(hw, hwe);
hwe++;
}
diff --git a/libmultipath/pgpolicies.c b/libmultipath/pgpolicies.c
index 85bb900..0ac7448 100644
--- a/libmultipath/pgpolicies.c
+++ b/libmultipath/pgpolicies.c
@@ -5,14 +5,14 @@
#include <stdlib.h>
#include <string.h>
+#include <checkers.h>
+
#include "util.h"
#include "memory.h"
#include "vector.h"
#include "structs.h"
#include "pgpolicies.h"
-#include "../libcheckers/path_state.h"
-
extern int
get_pgpolicy_id (char * str)
{
diff --git a/libmultipath/print.c b/libmultipath/print.c
index 359641f..6cc63e2 100644
--- a/libmultipath/print.c
+++ b/libmultipath/print.c
@@ -6,6 +6,8 @@
#include <libdevmapper.h>
#include <stdarg.h>
+#include <checkers.h>
+
#include "vector.h"
#include "structs.h"
#include "structs_vec.h"
@@ -17,9 +19,6 @@
#include "defaults.h"
#include "parser.h"
-#include "../libcheckers/path_state.h"
-#include "../libcheckers/checkers.h"
-
#define MAX(x,y) (x > y) ? x : y
#define TAIL (line + len - 1 - c)
#define NOPAD s = c
diff --git a/libmultipath/propsel.c b/libmultipath/propsel.c
index ca6ca8b..79cee8b 100644
--- a/libmultipath/propsel.c
+++ b/libmultipath/propsel.c
@@ -5,6 +5,8 @@
*/
#include <stdio.h>
+#include <checkers.h>
+
#include "memory.h"
#include "vector.h"
#include "structs.h"
@@ -14,8 +16,6 @@
#include "alias.h"
#include "defaults.h"
-#include "../libcheckers/checkers.h"
-
pgpolicyfn *pgpolicies[] = {
NULL,
one_path_per_group,
@@ -202,30 +202,25 @@ select_hwhandler (struct multipath * mp)
}
extern int
-select_checkfn(struct path *pp)
+select_checker(struct path *pp)
{
- char checker_name[CHECKER_NAME_SIZE];
+ struct checker * c = &pp->checker;
- if (pp->hwe && pp->hwe->checker_index > 0) {
- get_checker_name(checker_name, CHECKER_NAME_SIZE,
- pp->hwe->checker_index);
+ if (pp->hwe && pp->hwe->checker) {
+ checker_get(c, pp->hwe->checker);
condlog(3, "%s: path checker = %s (controler setting)",
- pp->dev, checker_name);
- pp->checkfn = get_checker_addr(pp->hwe->checker_index);
+ pp->dev, checker_name(c));
return 0;
}
- if (conf->checker_index > 0) {
- pp->checkfn = get_checker_addr(conf->checker_index);
- get_checker_name(checker_name, CHECKER_NAME_SIZE,
- conf->checker_index);
+ if (conf->checker) {
+ checker_get(c, conf->checker);
condlog(3, "%s: path checker = %s (config file default)",
- pp->dev, checker_name);
+ pp->dev, checker_name(c));
return 0;
}
- pp->checkfn = get_checker_addr(DEFAULT_CHECKER_ID);
- get_checker_name(checker_name, CHECKER_NAME_SIZE, DEFAULT_CHECKER_ID);
+ checker_get(c, checker_default());
condlog(3, "%s: path checker = %s (internal default)",
- pp->dev, checker_name);
+ pp->dev, checker_name(c));
return 0;
}
diff --git a/libmultipath/propsel.h b/libmultipath/propsel.h
index d4b3367..f66a598 100644
--- a/libmultipath/propsel.h
+++ b/libmultipath/propsel.h
@@ -5,7 +5,7 @@ int select_selector (struct multipath * mp);
int select_alias (struct multipath * mp);
int select_features (struct multipath * mp);
int select_hwhandler (struct multipath * mp);
-int select_checkfn(struct path *pp);
+int select_checker(struct path *pp);
int select_getuid (struct path * pp);
int select_getprio (struct path * pp);
int select_no_path_retry(struct multipath *mp);
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index d0a6425..c6692f3 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -6,6 +6,8 @@
#include <unistd.h>
#include <libdevmapper.h>
+#include <checkers.h>
+
#include "memory.h"
#include "vector.h"
#include "util.h"
@@ -38,8 +40,8 @@ free_path (struct path * pp)
if (!pp)
return;
- if (pp->checker_context)
- free(pp->checker_context);
+ if (checker_selected(&pp->checker))
+ checker_put(&pp->checker);
if (pp->fd >= 0)
close(pp->fd);
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
index e4c5623..b46b700 100644
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -101,8 +101,7 @@ struct path {
char * getuid;
char * getprio;
int getprio_selected;
- int (*checkfn) (int, char *, void **);
- void * checker_context;
+ struct checker checker;
struct multipath * mpp;
int fd;
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index 2256aae..99cfbf4 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -2,6 +2,8 @@
#include <string.h>
#include <unistd.h>
+#include <checkers.h>
+
#include "vector.h"
#include "defaults.h"
#include "debug.h"
@@ -12,7 +14,6 @@
#include "config.h"
#include "propsel.h"
#include "discovery.h"
-#include "../libcheckers/path_state.h"
/*
@@ -75,16 +76,13 @@ extern void
orphan_path (struct path * pp)
{
pp->mpp = NULL;
- pp->checkfn = NULL;
pp->dmstate = PSTATE_UNDEF;
- pp->checker_context = NULL;
pp->getuid = NULL;
pp->getprio = NULL;
pp->getprio_selected = 0;
-
+ checker_put(&pp->checker);
if (pp->fd >= 0)
close(pp->fd);
-
pp->fd = -1;
}
diff --git a/libmultipath/switchgroup.c b/libmultipath/switchgroup.c
index 7181944..757543f 100644
--- a/libmultipath/switchgroup.c
+++ b/libmultipath/switchgroup.c
@@ -2,10 +2,11 @@
* Copyright (c) 2005 Christophe Varoqui
* Copyright (c) 2005 Edward Goggin, EMC
*/
+#include <checkers.h>
+
#include "vector.h"
#include "structs.h"
#include "switchgroup.h"
-#include "../libcheckers/path_state.h"
extern int
select_path_group (struct multipath * mpp)
diff --git a/multipath/main.c b/multipath/main.c
index c21abb8..98f7207 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -27,11 +27,11 @@
#include <ctype.h>
#include <sysfs/libsysfs.h>
+#include <checkers.h>
#include <vector.h>
#include <memory.h>
#include <libdevmapper.h>
#include <devmapper.h>
-#include <path_state.h>
#include <util.h>
#include <defaults.h>
#include <structs.h>
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 3b8b6a7..f8b2767 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2005 Christophe Varoqui
*/
+#include <checkers.h>
#include <memory.h>
#include <vector.h>
#include <structs.h>
diff --git a/multipathd/main.c b/multipathd/main.c
index 3f8f967..edfea5d 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -23,7 +23,6 @@
* libcheckers
*/
#include <checkers.h>
-#include <path_state.h>
/*
* libmultipath
@@ -47,7 +46,6 @@
#include <propsel.h>
#include <uevent.h>
#include <switchgroup.h>
-#include <path_state.h>
#include <print.h>
#include <configure.h>
@@ -62,10 +60,7 @@
#define CMDSIZE 160
#define LOG_MSG(a,b) \
- if (strlen(b)) { \
- condlog(a, "%s: %s", pp->dev_t, b); \
- memset(b, 0, MAX_CHECKER_MSG_SIZE); \
- }
+ if (strlen(b)) condlog(a, "%s: %s", pp->dev_t, b);
#ifdef LCKDBG
#define lock(a) \
@@ -1135,13 +1130,9 @@ checkerloop (void *ap)
struct path *pp;
int i, count = 0;
int newstate;
- char checker_msg[MAX_CHECKER_MSG_SIZE];
mlockall(MCL_CURRENT | MCL_FUTURE);
-
- memset(checker_msg, 0, MAX_CHECKER_MSG_SIZE);
vecs = (struct vectors *)ap;
-
condlog(2, "path checkers start up");
/*
@@ -1169,17 +1160,16 @@ checkerloop (void *ap)
*/
pp->tick = conf->checkint;
- if (!pp->checkfn) {
+ if (!checker_selected(&pp->checker)) {
pathinfo(pp, conf->hwtable, DI_SYSFS);
- select_checkfn(pp);
+ select_checker(pp);
}
- if (!pp->checkfn) {
- condlog(0, "%s: checkfn is void", pp->dev);
+ if (!checker_selected(&pp->checker)) {
+ condlog(0, "%s: checker is not set", pp->dev);
continue;
}
- newstate = pp->checkfn(pp->fd, checker_msg,
- &pp->checker_context);
+ newstate = checker_check(&pp->checker);
if (newstate < 0) {
condlog(2, "%s: unusable path", pp->dev);
@@ -1189,7 +1179,7 @@ checkerloop (void *ap)
if (newstate != pp->state) {
pp->state = newstate;
- LOG_MSG(1, checker_msg);
+ LOG_MSG(1, checker_message(&pp->checker));
/*
* upon state change, reset the checkint
@@ -1238,7 +1228,7 @@ checkerloop (void *ap)
enable_group(pp);
}
else if (newstate == PATH_UP || newstate == PATH_GHOST) {
- LOG_MSG(4, checker_msg);
+ LOG_MSG(4, checker_message(&pp->checker));
/*
* double the next check delay.
* max at conf->max_checkint
diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c
index 0bd3dc1..496daa8 100644
--- a/multipathd/uxlsnr.c
+++ b/multipathd/uxlsnr.c
@@ -20,6 +20,8 @@
#include <sys/un.h>
#include <sys/poll.h>
+#include <checkers.h>
+
#include <memory.h>
#include <debug.h>
#include <vector.h>