SOURCES: multipath-tools-branch.diff (NEW) - diff with git

glen glen at pld-linux.org
Wed Nov 14 00:13:38 CET 2007


Author: glen                         Date: Tue Nov 13 23:13:38 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- diff with git

---- Files affected:
SOURCES:
   multipath-tools-branch.diff (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/multipath-tools-branch.diff
diff -u /dev/null SOURCES/multipath-tools-branch.diff:1.1
--- /dev/null	Wed Nov 14 00:13:38 2007
+++ SOURCES/multipath-tools-branch.diff	Wed Nov 14 00:13:32 2007
@@ -0,0 +1,744 @@
+diff -ur -x .git multipath-tools-0.4.8/kpartx/devmapper.c multipath-tools/kpartx/devmapper.c
+--- multipath-tools-0.4.8/kpartx/devmapper.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/kpartx/devmapper.c	2007-11-14 01:07:15.579282644 +0200
+@@ -4,10 +4,12 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#include <stdint.h>
+ #include <libdevmapper.h>
+ #include <ctype.h>
+ #include <linux/kdev_t.h>
+ #include <errno.h>
++#include "devmapper.h"
+ 
+ #define UUID_PREFIX "part%d-"
+ #define MAX_PREFIX_LEN 8
+@@ -72,10 +74,10 @@
+ 
+ extern int
+ dm_addmap (int task, const char *name, const char *target,
+-	   const char *params, unsigned long size, const char *uuid, int part) {
++	   const char *params, uint64_t size, const char *uuid, int part) {
+ 	int r = 0;
+ 	struct dm_task *dmt;
+-	char *prefixed_uuid;
++	char *prefixed_uuid = NULL;
+ 
+ 	if (!(dmt = dm_task_create (task)))
+ 		return 0;
+diff -ur -x .git multipath-tools-0.4.8/kpartx/devmapper.h multipath-tools/kpartx/devmapper.h
+--- multipath-tools-0.4.8/kpartx/devmapper.h	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/kpartx/devmapper.h	2007-11-14 01:07:15.579282644 +0200
+@@ -1,7 +1,7 @@
+ int dm_prereq (char *, int, int, int);
+ int dm_simplecmd (int, const char *);
+-int dm_addmap (int, const char *, const char *, const char *, unsigned long,
+-	       char *, int);
++int dm_addmap (int, const char *, const char *, const char *, uint64_t,
++	       const char *, int);
+ int dm_map_present (char *);
+ char * dm_mapname(int major, int minor);
+ dev_t dm_get_first_dep(char *devname);
+diff -ur -x .git multipath-tools-0.4.8/kpartx/gpt.c multipath-tools/kpartx/gpt.c
+--- multipath-tools-0.4.8/kpartx/gpt.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/kpartx/gpt.c	2007-11-14 01:07:15.579282644 +0200
+@@ -36,6 +36,7 @@
+ #include <errno.h>
+ #include <endian.h>
+ #include <byteswap.h>
++#include <linux/fs.h>
+ #include "crc32.h"
+ 
+ #if BYTE_ORDER == LITTLE_ENDIAN
+@@ -50,10 +51,18 @@
+ #  define __cpu_to_le32(x) bswap_32(x)
+ #endif
+ 
++#ifndef BLKGETLASTSECT
+ #define BLKGETLASTSECT  _IO(0x12,108)   /* get last sector of block device */
++#endif
++#ifndef BLKGETSIZE
+ #define BLKGETSIZE _IO(0x12,96)	        /* return device size */
++#endif
++#ifndef BLKSSZGET
+ #define BLKSSZGET  _IO(0x12,104)	/* get block device sector size */
++#endif
++#ifndef BLKGETSIZE64
+ #define BLKGETSIZE64 _IOR(0x12,114,sizeof(uint64_t))	/* return device size in bytes (u64 *arg) */
++#endif
+ 
+ struct blkdev_ioctl_param {
+         unsigned int block;
+@@ -143,20 +152,14 @@
+ static uint64_t
+ _get_num_sectors(int filedes)
+ {
+-	unsigned long sectors=0;
+ 	int rc;
+-#if 0
+-        uint64_t bytes=0;
++	uint64_t bytes=0;
+ 
+- 	rc = ioctl(filedes, BLKGETSIZE64, &bytes);
++	rc = ioctl(filedes, BLKGETSIZE64, &bytes);
+ 	if (!rc)
+ 		return bytes / get_sector_size(filedes);
+-#endif
+-        rc = ioctl(filedes, BLKGETSIZE, &sectors);
+-        if (rc)
+-                return 0;
+-        
+-	return sectors;
++
++	return 0;
+ }
+ 
+ /************************************************************
+@@ -193,7 +196,7 @@
+ 		sectors = 1;
+ 	}
+ 
+-	return sectors - 1;
++	return sectors ? sectors - 1 : 0;
+ }
+ 
+ 
+@@ -220,17 +223,22 @@
+ {
+ 	int sector_size = get_sector_size(fd);
+ 	off_t offset = lba * sector_size;
++	uint64_t lastlba;
+         ssize_t bytesread;
+ 
+ 	lseek(fd, offset, SEEK_SET);
+ 	bytesread = read(fd, buffer, bytes);
+ 
++	lastlba = last_lba(fd);
++	if (!lastlba)
++		return bytesread;
++
+         /* Kludge.  This is necessary to read/write the last
+            block of an odd-sized disk, until Linux 2.5.x kernel fixes.
+            This is only used by gpt.c, and only to read
+            one sector, so we don't have to be fancy.
+         */
+-        if (!bytesread && !(last_lba(fd) & 1) && lba == last_lba(fd)) {
++        if (!bytesread && !(lastlba & 1) && lba == lastlba) {
+                 bytesread = read_lastoddsector(fd, lba, buffer, bytes);
+         }
+         return bytesread;
+@@ -505,7 +513,8 @@
+ 	if (!gpt || !ptes)
+ 		return 0;
+ 
+-	lastlba = last_lba(fd);
++	if (!(lastlba = last_lba(fd)))
++		return 0;
+ 	good_pgpt = is_gpt_valid(fd, GPT_PRIMARY_PARTITION_TABLE_LBA,
+ 				 &pgpt, &pptes);
+         if (good_pgpt) {
+diff -ur -x .git multipath-tools-0.4.8/kpartx/kpartx.c multipath-tools/kpartx/kpartx.c
+--- multipath-tools-0.4.8/kpartx/kpartx.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/kpartx/kpartx.c	2007-11-14 01:07:15.579282644 +0200
+@@ -25,6 +25,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
++#include <stdint.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+ #include <ctype.h>
+@@ -366,16 +367,16 @@
+ 
+ 				slices[j].minor = m++;
+ 
+-				printf("%s%s%d : 0 %lu %s %lu\n",
++				printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
+ 				       mapname, delim, j+1,
+-				       (unsigned long) slices[j].size, device,
+-				       (unsigned long) slices[j].start);
++				       slices[j].size, device,
++				       slices[j].start);
+ 			}
+ 			/* Loop to resolve contained slices */
+ 			d = c;
+ 			while (c) {
+ 				for (j = 0; j < n; j++) {
+-					unsigned long start;
++					uint64_t start;
+ 					int k = slices[j].container - 1;
+ 
+ 					if (slices[j].size == 0)
+@@ -387,9 +388,9 @@
+ 					slices[j].minor = m++;
+ 
+ 					start = slices[j].start - slices[k].start;
+-					printf("%s%s%d : 0 %lu /dev/dm-%d %lu\n",
++					printf("%s%s%d : 0 %" PRIu64 " /dev/dm-%d %" PRIu64 "\n",
+ 					       mapname, delim, j+1,
+-					       (unsigned long) slices[j].size,
++					       slices[j].size,
+ 					       slices[k].minor, start);
+ 					c--;
+ 				}
+@@ -448,8 +449,8 @@
+ 				}
+ 				strip_slash(partname);
+ 
+-				if (safe_sprintf(params, "%s %lu", device,
+-					     (unsigned long)slices[j].start)) {
++				if (safe_sprintf(params, "%s %" PRIu64 ,
++						 device, slices[j].start)) {
+ 					fprintf(stderr, "params too small\n");
+ 					exit(1);
+ 				}
+@@ -468,7 +469,7 @@
+ 					&slices[j].minor);
+ 
+ 				if (verbose)
+-					printf("add map %s (%d:%d): 0 %lu %s %s\n",
++					printf("add map %s (%d:%d): 0 %" PRIu64 " %s %s\n",
+ 					       partname, slices[j].major,
+ 					       slices[j].minor, slices[j].size,
+ 					       DM_TARGET, params);
+@@ -502,10 +503,10 @@
+ 					}
+ 					strip_slash(partname);
+ 
+-					if (safe_sprintf(params, "%d:%d %lu",
++					if (safe_sprintf(params, "%d:%d %" PRIu64,
+ 							 slices[k].major,
+ 							 slices[k].minor,
+-							 (unsigned long)slices[j].start)) {
++							 slices[j].start)) {
+ 						fprintf(stderr, "params too small\n");
+ 						exit(1);
+ 					}
+@@ -524,7 +525,7 @@
+ 						&slices[j].minor);
+ 
+ 					if (verbose)
+-						printf("add map %s : 0 %lu %s %s\n",
++						printf("add map %s : 0 %" PRIu64 " %s %s\n",
+ 						       partname, slices[j].size,
+ 						       DM_TARGET, params);
+ 					c--;
+diff -ur -x .git multipath-tools-0.4.8/kpartx/kpartx.h multipath-tools/kpartx/kpartx.h
+--- multipath-tools-0.4.8/kpartx/kpartx.h	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/kpartx/kpartx.h	2007-11-14 01:07:15.579282644 +0200
+@@ -1,6 +1,8 @@
+ #ifndef _KPARTX_H
+ #define _KPARTX_H
+ 
++#include <stdint.h>
++
+ /*
+  * For each partition type there is a routine that takes
+  * a block device and a range, and returns the list of
+@@ -20,8 +22,8 @@
+  * units: 512 byte sectors
+  */
+ struct slice {
+-	unsigned long start;
+-	unsigned long size;
++	uint64_t start;
++	uint64_t size;
+ 	int container;
+ 	int major;
+ 	int minor;
+diff -ur -x .git multipath-tools-0.4.8/libcheckers/checkers.c multipath-tools/libcheckers/checkers.c
+--- multipath-tools-0.4.8/libcheckers/checkers.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/libcheckers/checkers.c	2007-11-14 01:07:15.579282644 +0200
+@@ -71,7 +71,7 @@
+ 		.init       = readsector0_init,
+ 		.free       = readsector0_free
+ 	},
+-	{0, 1, "", "", NULL, NULL, NULL, NULL},
++	{0, 1, 0, "", "", NULL, NULL, NULL, NULL},
+ };
+ 
+ void checker_set_fd (struct checker * c, int fd)
+@@ -89,6 +89,16 @@
+ 	c->sync = 0;
+ }
+ 
++void checker_enable (struct checker * c)
++{
++	c->disable = 0;
++}
++
++void checker_disable (struct checker * c)
++{
++	c->disable = 1;
++}
++
+ struct checker * checker_lookup (char * name)
+ {
+ 	struct checker * c = &checkers[0];
+@@ -118,6 +128,8 @@
+ {
+ 	int r;
+ 
++	if (c->disable)
++		return PATH_UNCHECKED;
+ 	if (c->fd <= 0) {
+ 		MSG(c, "no usable fd");
+ 		return PATH_WILD;
+diff -ur -x .git multipath-tools-0.4.8/libcheckers/checkers.h multipath-tools/libcheckers/checkers.h
+--- multipath-tools-0.4.8/libcheckers/checkers.h	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/libcheckers/checkers.h	2007-11-14 01:07:15.579282644 +0200
+@@ -87,6 +87,7 @@
+ struct checker {
+ 	int fd;
+ 	int sync;
++	int disable;
+ 	char name[CHECKER_NAME_LEN];
+ 	char message[CHECKER_MSG_LEN];       /* comm with callers */
+ 	void * context;                      /* store for persistent data */
+@@ -101,10 +102,12 @@
+ 
+ int checker_init (struct checker *, void **);
+ void checker_put (struct checker *);
+-void checker_reset (struct checker * c);
+-void checker_set_sync (struct checker * c);
+-void checker_set_async (struct checker * c);
++void checker_reset (struct checker *);
++void checker_set_sync (struct checker *);
++void checker_set_async (struct checker *);
+ void checker_set_fd (struct checker *, int);
++void checker_enable (struct checker *);
++void checker_disable (struct checker *);
+ struct checker * checker_lookup (char *);
+ int checker_check (struct checker *);
+ int checker_selected (struct checker *);
+diff -ur -x .git multipath-tools-0.4.8/libmultipath/blacklist.c multipath-tools/libmultipath/blacklist.c
+--- multipath-tools-0.4.8/libmultipath/blacklist.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/libmultipath/blacklist.c	2007-11-14 01:07:15.595283318 +0200
+@@ -297,16 +297,14 @@
+ 	int r;
+ 
+ 	r = _filter_devnode(conf->blist_devnode, conf->elist_devnode,pp->dev);
+-	if (r)
+-		return r;
+-	r = _filter_wwid(conf->blist_wwid, conf->elist_devnode, pp->wwid);
+-	if (r)
++	if (r > 0)
+ 		return r;
+ 	r = _filter_device(conf->blist_device, conf->elist_device,
+ 		 	   pp->vendor_id, pp->product_id);
+-	if (r)
++	if (r > 0)
+ 		return r;
+-	return 0;
++	r = _filter_wwid(conf->blist_wwid, conf->elist_wwid, pp->wwid);
++	return r;
+ }
+ 
+ int
+diff -ur -x .git multipath-tools-0.4.8/libmultipath/hwtable.c multipath-tools/libmultipath/hwtable.c
+--- multipath-tools-0.4.8/libmultipath/hwtable.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/libmultipath/hwtable.c	2007-11-14 01:07:15.619284329 +0200
+@@ -65,7 +65,7 @@
+ 		.getuid        = DEFAULT_GETUID,
+ 		.getprio       = "/sbin/mpath_prio_hp_sw /dev/%n",
+ 		.features      = "1 queue_if_no_path",
+-		.hwhandler     = "1 hp_sw",
++		.hwhandler     = "1 hp-sw",
+ 		.selector      = DEFAULT_SELECTOR,
+ 		.pgpolicy      = GROUP_BY_PRIO,
+ 		.pgfailback    = FAILBACK_UNDEF,
+@@ -96,7 +96,7 @@
+ 		.getuid        = DEFAULT_GETUID,
+ 		.getprio       = "/sbin/mpath_prio_hp_sw /dev/%n",
+ 		.features      = "1 queue_if_no_path",
+-		.hwhandler     = "1 hp_sw",
++		.hwhandler     = "1 hp-sw",
+ 		.selector      = DEFAULT_SELECTOR,
+ 		.pgpolicy      = GROUP_BY_PRIO,
+ 		.pgfailback    = FAILBACK_UNDEF,
+@@ -122,6 +122,21 @@
+ 		.checker_name  = TUR,
+ 	},
+ 	{
++		.vendor        = "HP",
++		.product       = "MSA2000s*",
++		.getuid        = "/sbin/cciss_id %n",
++		.getprio       = NULL,
++		.features      = DEFAULT_FEATURES,
++		.hwhandler     = DEFAULT_HWHANDLER,
++		.selector      = DEFAULT_SELECTOR,
++		.pgpolicy      = MULTIBUS,
++		.pgfailback    = FAILBACK_UNDEF,
++		.rr_weight     = RR_WEIGHT_NONE,
++		.no_path_retry = 12,
++		.minio         = DEFAULT_MINIO,
++		.checker_name  = TUR,
++	},
++	{
+ 		/* EVA 3000/5000 with new firmware */
+ 		.vendor        = "(COMPAQ|HP)",
+ 		.product       = "(MSA|HSV)1.1.*",
+diff -ur -x .git multipath-tools-0.4.8/multipathd/cli_handlers.c multipath-tools/multipathd/cli_handlers.c
+--- multipath-tools-0.4.8/multipathd/cli_handlers.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/multipathd/cli_handlers.c	2007-11-14 01:07:15.635285002 +0200
+@@ -431,6 +431,7 @@
+ 	condlog(2, "%s: reinstate path %s (operator)",
+ 		pp->mpp->alias, pp->dev_t);
+ 
++	checker_enable(&pp->checker);
+ 	return dm_reinstate_path(pp->mpp->alias, pp->dev_t);
+ }
+ 
+@@ -440,6 +441,7 @@
+ 	struct vectors * vecs = (struct vectors *)data;
+ 	char * param = get_keyparam(v, PATH);
+ 	struct path * pp;
++	int r;
+ 	
+ 	pp = find_path_by_dev(vecs->pathvec, param);
+ 
+@@ -452,7 +454,13 @@
+ 	condlog(2, "%s: fail path %s (operator)",
+ 		pp->mpp->alias, pp->dev_t);
+ 
+-	return dm_fail_path(pp->mpp->alias, pp->dev_t);
++	r = dm_fail_path(pp->mpp->alias, pp->dev_t);
++	/*
++	 * Suspend path checking to avoid auto-reinstating the path
++	 */
++	if (!r)
++		checker_disable(&pp->checker);
++	return r;
+ }
+ 
+ int
+diff -ur -x .git multipath-tools-0.4.8/multipathd/main.c multipath-tools/multipathd/main.c
+--- multipath-tools-0.4.8/multipathd/main.c	2007-08-03 00:05:37.000000000 +0300
++++ multipath-tools/multipathd/main.c	2007-11-14 01:07:15.635285002 +0200
+@@ -368,7 +368,7 @@
+ 		condlog(0, "%s: failed to get path uid", devname);
+ 		return 1; /* leave path added to pathvec */
+ 	}
+-	if (filter_path(conf, pp)){
++	if (filter_path(conf, pp) > 0){
+ 		int i = find_slot(vecs->pathvec, (void *)pp);
+ 		if (i != -1)
+ 			vector_del_slot(vecs->pathvec, i);
+@@ -852,167 +852,175 @@
+ 	}
+ }
+ 
+-static void *
+-checkerloop (void *ap)
++void
++check_path (struct vectors * vecs, struct path * pp)
+ {
+-	struct vectors *vecs;
+-	struct path *pp;
+-	int count = 0;
+ 	int newstate;
+-	unsigned int i;
+ 
+-	mlockall(MCL_CURRENT | MCL_FUTURE);
+-	vecs = (struct vectors *)ap;
+-	condlog(2, "path checkers start up");
++	if (!pp->mpp)
++		return;
++
++	if (pp->tick && --pp->tick)
++		return; /* don't check this path yet */
+ 
+ 	/*
+-	 * init the path check interval
++	 * provision a next check soonest,
++	 * in case we exit abnormaly from here
+ 	 */
+-	vector_foreach_slot (vecs->pathvec, pp, i) {
+-		pp->checkint = conf->checkint;
++	pp->tick = conf->checkint;
++
++	if (!checker_selected(&pp->checker)) {
++		pathinfo(pp, conf->hwtable, DI_SYSFS);
++		select_checker(pp);
+ 	}
++	if (!checker_selected(&pp->checker)) {
++		condlog(0, "%s: checker is not set", pp->dev);
++		return;
++	}
++	/*
++	 * Set checker in async mode.
++	 * Honored only by checker implementing the said mode.
++	 */
++	checker_set_async(&pp->checker);
+ 
+-	while (1) {
+-		pthread_cleanup_push(cleanup_lock, vecs->lock);
+-		lock(vecs->lock);
+-		condlog(4, "tick");
++	newstate = checker_check(&pp->checker);
+ 
+-		vector_foreach_slot (vecs->pathvec, pp, i) {
+-			if (!pp->mpp)
+-				continue;
++	if (newstate < 0) {
++		condlog(2, "%s: unusable path", pp->dev);
++		pathinfo(pp, conf->hwtable, 0);
++		return;
++	}
++	/*
++	 * Async IO in flight. Keep the previous path state
++	 * and reschedule as soon as possible
++	 */
++	if (newstate == PATH_PENDING) {
++		pp->tick = 1;
++		return;
++	}
++	if (newstate != pp->state) {
++		int oldstate = pp->state;
++		pp->state = newstate;
++		LOG_MSG(1, checker_message(&pp->checker));
+ 
+-			if (pp->tick && --pp->tick)
+-				continue; /* don't check this path yet */
++		/*
++		 * upon state change, reset the checkint
++		 * to the shortest delay
++		 */
++		pp->checkint = conf->checkint;
+ 
++		if (newstate == PATH_DOWN || newstate == PATH_SHAKY ||
++		    update_multipath_strings(pp->mpp, vecs->pathvec)) {
+ 			/*
+-			 * provision a next check soonest,
+-			 * in case we exit abnormaly from here
++			 * proactively fail path in the DM
+ 			 */
+-			pp->tick = conf->checkint;
++			if (oldstate == PATH_UP ||
++			    oldstate == PATH_GHOST)
++				fail_path(pp, 1);
++			else
++				fail_path(pp, 0);
+ 
+-			if (!checker_selected(&pp->checker)) {
+-				pathinfo(pp, conf->hwtable, DI_SYSFS);
+-				select_checker(pp);
+-			}
+-			if (!checker_selected(&pp->checker)) {
+-				condlog(0, "%s: checker is not set", pp->dev);
+-				continue;
+-			}
+ 			/*
+-			 * Set checker in async mode.
+-			 * Honored only by checker implementing the said mode.
++			 * cancel scheduled failback
+ 			 */
+-			checker_set_async(&pp->checker);
++			pp->mpp->failback_tick = 0;
+ 
+-			newstate = checker_check(&pp->checker);
++			pp->mpp->stat_path_failures++;
++			return;
++		}
+ 
+-			if (newstate < 0) {
+-				condlog(2, "%s: unusable path", pp->dev);
+-				pathinfo(pp, conf->hwtable, 0);
+-				continue;
+-			}
+-			/*
+-			 * Async IO in flight. Keep the previous path state
+-			 * and reschedule as soon as possible
+-			 */
+-			if (newstate == PATH_PENDING) {
+-				pp->tick = 1;
+-				continue;
+-			}
+-			if (newstate != pp->state) {
+-				int oldstate = pp->state;
+-				pp->state = newstate;
+-				LOG_MSG(1, checker_message(&pp->checker));
++		/*
++		 * reinstate this path
++		 */
++		if (oldstate != PATH_UP &&
++		    oldstate != PATH_GHOST)
++			reinstate_path(pp, 1);
++		else
++			reinstate_path(pp, 0);
+ 
+-				/*
+-				 * upon state change, reset the checkint
+-				 * to the shortest delay
+-				 */
+-				pp->checkint = conf->checkint;
++		/*
++		 * schedule [defered] failback
++		 */
++		if (pp->mpp->pgfailback > 0)
++			pp->mpp->failback_tick =
++				pp->mpp->pgfailback + 1;
++		else if (pp->mpp->pgfailback == -FAILBACK_IMMEDIATE &&
++		    need_switch_pathgroup(pp->mpp, 1))
++			switch_pathgroup(pp->mpp);
+ 
+-				if (newstate == PATH_DOWN ||
+-				    newstate == PATH_SHAKY ||
+-				    update_multipath_strings(pp->mpp,
+-							     vecs->pathvec)) {
+-					/*
+-					 * proactively fail path in the DM
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list