Blob Blame History Raw
---
 kpartx/devmapper.c       |   14 +++++++++++---
 kpartx/devmapper.h       |    2 +-
 kpartx/kpartx.c          |   15 +++++++++++----
 libmultipath/config.h    |    1 +
 libmultipath/devmapper.c |   12 ++++++++++--
 multipath/main.c         |    5 ++++-
 6 files changed, 38 insertions(+), 11 deletions(-)

Index: multipath-tools/kpartx/devmapper.c
===================================================================
--- multipath-tools.orig/kpartx/devmapper.c
+++ multipath-tools/kpartx/devmapper.c
@@ -52,7 +52,8 @@ dm_prereq (char * str, int x, int y, int
 }
 
 extern int
-dm_simplecmd (int task, const char *name, int no_flush, uint32_t *cookie) {
+dm_simplecmd (int task, const char *name, int no_flush, uint32_t *cookie,
+	      int force_udev_rules) {
 	int r = 0;
 	int udev_wait_flag = (task == DM_DEVICE_RESUME ||
 			      task == DM_DEVICE_REMOVE);
@@ -70,8 +71,15 @@ dm_simplecmd (int task, const char *name
 	if (no_flush)
 		dm_task_no_flush(dmt);
 
-	if (udev_wait_flag && !dm_task_set_cookie(dmt, cookie, 0))
-		goto out;
+	if (udev_wait_flag) {
+		if (!dm_task_set_cookie(dmt, cookie, (force_udev_rules)? 0 :
+					DM_UDEV_DISABLE_DISK_RULES_FLAG))
+			goto out;
+	}
+	else if (task == DM_DEVICE_RESUME && dm_cookie_supported() &&
+		 !force_udev_rules)
+		dm_task_set_event_nr(dmt, DM_UDEV_DISABLE_DISK_RULES_FLAG <<
+					  DM_UDEV_FLAGS_SHIFT);
 	r = dm_task_run(dmt);
 
 	out:
Index: multipath-tools/kpartx/devmapper.h
===================================================================
--- multipath-tools.orig/kpartx/devmapper.h
+++ multipath-tools/kpartx/devmapper.h
@@ -3,7 +3,7 @@
 #define MKDEV(ma,mi)    ((mi & 0xff) | (ma << 8) | ((mi & ~0xff) << 12))
 
 int dm_prereq (char *, int, int, int);
-int dm_simplecmd (int, const char *, int, uint32_t *);
+int dm_simplecmd (int, const char *, int, uint32_t *, int);
 int dm_addmap (int, const char *, const char *, const char *, uint64_t,
 	       const char *, int, mode_t, uid_t, gid_t, uint32_t *);
 int dm_map_present (char *);
Index: multipath-tools/kpartx/kpartx.c
===================================================================
--- multipath-tools.orig/kpartx/kpartx.c
+++ multipath-tools/kpartx/kpartx.c
@@ -82,7 +82,7 @@ initpts(void)
 	addpts("sun", read_sun_pt);
 }
 
-static char short_opts[] = "ladgvp:t:s";
+static char short_opts[] = "ladgvp:t:su";
 
 /* Used in gpt.c */
 int force_gpt=0;
@@ -184,7 +184,8 @@ get_hotplug_device(void)
 }
 
 int
-main(int argc, char **argv){
+main(int argc, char **argv)
+{
 	int fd, i, j, k, n, op, off, arg;
 	struct slice all;
 	struct pt *ptp;
@@ -202,6 +203,7 @@ main(int argc, char **argv){
 	int sync = 0;
 	struct stat buf;
 	uint32_t cookie = 0;
+	int force_udev_rules = 0;
 
 	initpts();
 	init_crc32();
@@ -257,6 +259,9 @@ main(int argc, char **argv){
 		case 's':
 			sync = 1;
 			break;
+		case 'u':
+			force_udev_rules = 1;
+			break;
 		default:
 			usage();
 			exit(1);
@@ -404,7 +409,8 @@ main(int argc, char **argv){
 					continue;
 
 				if (!dm_simplecmd(DM_DEVICE_REMOVE, partname,
-						  0, &cookie)) {
+						  0, &cookie,
+						  force_udev_rules)) {
 					r++;
 					continue;
 				}
@@ -454,7 +460,8 @@ main(int argc, char **argv){
 				}
 				if (op == DM_DEVICE_RELOAD &&
 				    !dm_simplecmd(DM_DEVICE_RESUME, partname,
-						  1, &cookie)) {
+						  1, &cookie,
+						  force_udev_rules)) {
 					fprintf(stderr, "resume failed on %s\n",
 						partname);
 					r++;
Index: multipath-tools/libmultipath/config.h
===================================================================
--- multipath-tools.orig/libmultipath/config.h
+++ multipath-tools/libmultipath/config.h
@@ -90,6 +90,7 @@ struct config {
 	int find_multipaths;
 	int allow_queueing;
 	int log_checker_err;
+	int force_udev_rules;
 	uid_t uid;
 	gid_t gid;
 	mode_t mode;
Index: multipath-tools/libmultipath/devmapper.c
===================================================================
--- multipath-tools.orig/libmultipath/devmapper.c
+++ multipath-tools/libmultipath/devmapper.c
@@ -168,8 +168,16 @@ dm_simplecmd (int task, const char *name
 		dm_task_no_flush(dmt);		/* for DM_DEVICE_SUSPEND/RESUME */
 #endif
 
-	if (udev_wait_flag && !dm_task_set_cookie(dmt, &conf->cookie, 0))
-		goto out;
+	if (udev_wait_flag) {
+		if (!dm_task_set_cookie(dmt, &conf->cookie,
+					(conf->force_udev_rules)? 0 :
+					DM_UDEV_DISABLE_DISK_RULES_FLAG))
+			goto out;
+	}
+	else if (task == DM_DEVICE_RESUME && dm_cookie_supported() &&
+		 !conf->force_udev_rules)
+		dm_task_set_event_nr(dmt, DM_UDEV_DISABLE_DISK_RULES_FLAG <<
+					  DM_UDEV_FLAGS_SHIFT);
 	r = dm_task_run (dmt);
 
 	out:
Index: multipath-tools/multipath/main.c
===================================================================
--- multipath-tools.orig/multipath/main.c
+++ multipath-tools/multipath/main.c
@@ -383,7 +383,7 @@ main (int argc, char *argv[])
 		condlog(0, "multipath tools need sysfs mounted");
 		exit(1);
 	}
-	while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brq")) != EOF ) {
+	while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brqu")) != EOF ) {
 		switch(arg) {
 		case 1: printf("optarg : %s\n",optarg);
 			break;
@@ -439,6 +439,9 @@ main (int argc, char *argv[])
 		case 'r':
 			conf->force_reload = 1;
 			break;
+		case 'u':
+			conf->force_udev_rules = 1;
+			break;
 		case 'h':
 			usage(argv[0]);
 		case ':':