Browse Source

device-mapper-multipath source patches added

Signed-off-by: basebuilder_pel7x64builder0 <basebuilder@powerel.org>
master
basebuilder_pel7x64builder0 6 years ago
parent
commit
eba52c6932
  1. 1
      SOURCES/0001-RH-dont_start_with_no_config.patch
  2. 20
      SOURCES/0002-RH-multipath.rules.patch
  3. 63
      SOURCES/0003-RH-Make-build-system-RH-Fedora-friendly.patch
  4. 18
      SOURCES/0004-RH-multipathd-blacklist-all-by-default.patch
  5. 72
      SOURCES/0005-RH-add-mpathconf.patch
  6. 100
      SOURCES/0006-RH-add-find-multipaths.patch
  7. 126
      SOURCES/0007-RH-add-hp_tur-checker.patch
  8. 36
      SOURCES/0008-RH-revert-partition-changes.patch
  9. 151
      SOURCES/0009-RH-RHEL5-style-partitions.patch
  10. 12
      SOURCES/0010-RH-dont-remove-map-on-enomem.patch
  11. 22
      SOURCES/0012-RH-kpartx-msg.patch
  12. 72
      SOURCES/0013-RHBZ-883981-cleanup-rpmdiff-issues.patch
  13. 20
      SOURCES/0014-RH-handle-other-sector-sizes.patch
  14. 10
      SOURCES/0015-RH-fix-output-buffer.patch
  15. 12
      SOURCES/0016-RH-dont-print-ghost-messages.patch
  16. 12
      SOURCES/0018-RH-fix-factorize.patch
  17. 40
      SOURCES/0019-RH-fix-sockets.patch
  18. 23
      SOURCES/0020-RHBZ-907360-static-pthread-init.patch
  19. 5
      SOURCES/0021-RHBZ-919119-respect-kernel-cmdline.patch
  20. 11
      SOURCES/0022-RH-multipathd-check-wwids.patch
  21. 112
      SOURCES/0023-RH-multipath-wipe-wwid.patch
  22. 66
      SOURCES/0024-RH-multipath-wipe-wwids.patch
  23. 23
      SOURCES/0025-UPBZ-916668_add_maj_min.patch
  24. 14
      SOURCES/0026-fix-checker-time.patch
  25. 6
      SOURCES/0027-RH-get-wwid.patch
  26. 32
      SOURCES/0028-RHBZ-929078-refresh-udev-dev.patch
  27. 10
      SOURCES/0029-RH-no-prio-put-msg.patch
  28. 122
      SOURCES/0030-RHBZ-916528-override-queue-no-daemon.patch
  29. 12
      SOURCES/0031-RHBZ-957188-kpartx-use-dm-name.patch
  30. 12
      SOURCES/0032-RHBZ-956464-mpathconf-defaults.patch
  31. 32
      SOURCES/0033-RHBZ-829963-e-series-conf.patch
  32. 30
      SOURCES/0034-RHBZ-851416-mpathconf-display.patch
  33. 13
      SOURCES/0035-RHBZ-891921-list-mpp.patch
  34. 15
      SOURCES/0037-RHBZ-768873-fix-rename.patch
  35. 12
      SOURCES/0038-RHBZ-799860-netapp-config.patch
  36. 6
      SOURCES/0039-RH-detect-prio-fix.patch
  37. 92
      SOURCES/0040-RH-bindings-fix.patch
  38. 48
      SOURCES/0041-RH-check-for-erofs.patch
  39. 299
      SOURCES/0042-UP-fix-signal-handling.patch
  40. 54
      SOURCES/0043-RH-signal-waiter.patch
  41. 14
      SOURCES/0044-RHBZ-976688-fix-wipe-wwids.patch
  42. 2
      SOURCES/0045-RHBZ-977297-man-page-fix.patch
  43. 22
      SOURCES/0046-RHBZ-883981-move-udev-rules.patch
  44. 36
      SOURCES/0047-RHBZ-kpartx-read-only-loop-devs.patch
  45. 8
      SOURCES/0048-RH-print-defaults.patch
  46. 10
      SOURCES/0049-RH-remove-ID_FS_TYPE.patch
  47. 12
      SOURCES/0050-RH-listing-speedup.patch
  48. 14
      SOURCES/0051-UP-fix-cli-resize.patch
  49. 46
      SOURCES/0052-RH-fix-bad-derefs.patch
  50. 16
      SOURCES/0053-UP-fix-failback.patch
  51. 225
      SOURCES/0054-UP-keep-udev-ref.patch
  52. 12
      SOURCES/0055-UP-handle-quiesced-paths.patch
  53. 12
      SOURCES/0056-UP-alua-prio-fix.patch
  54. 162
      SOURCES/0057-UP-fix-tmo.patch
  55. 12
      SOURCES/0058-UP-fix-failback.patch
  56. 34
      SOURCES/0059-UP-flush-failure-queueing.patch
  57. 96
      SOURCES/0060-UP-uevent-loop-udev.patch
  58. 5
      SOURCES/0061-RH-display-find-mpaths.patch
  59. 25
      SOURCES/0062-RH-dont-free-vecs.patch
  60. 18
      SOURCES/0063-RH-fix-warning.patch
  61. 184
      SOURCES/0064-RHBZ-1010040-fix-ID_FS-attrs.patch
  62. 14
      SOURCES/0065-UPBZ-995538-fail-rdac-on-unavailable.patch
  63. 88
      SOURCES/0066-UP-dos-4k-partition-fix.patch
  64. 16
      SOURCES/0067-RHBZ-1022899-fix-udev-partition-handling.patch
  65. 2
      SOURCES/0068-RHBZ-1034578-label-partition-devices.patch
  66. 67
      SOURCES/0069-UPBZ-1033791-improve-rdac-checker.patch
  67. 12
      SOURCES/0070-RHBZ-1036503-blacklist-td-devs.patch
  68. 251
      SOURCES/0071-RHBZ-1031546-strip-dev.patch
  69. 26
      SOURCES/0072-RHBZ-1039199-check-loop-control.patch
  70. 14
      SOURCES/0073-RH-update-build-flags.patch
  71. 22
      SOURCES/0074-RHBZ-1056976-dm-mpath-rules.patch
  72. 198
      SOURCES/0075-RHBZ-1056976-reload-flag.patch
  73. 62
      SOURCES/0076-RHBZ-1056686-add-hw_str_match.patch
  74. 8
      SOURCES/0077-RHBZ-1054806-mpathconf-always-reload.patch
  75. 70
      SOURCES/0079-RHBZ-1070581-add-wwid-option.patch
  76. 68
      SOURCES/0080-RHBZ-1075796-cmdline-wwid.patch
  77. 36
      SOURCES/0081-RHBZ-1066264-check-prefix-on-rename.patch
  78. 26
      SOURCES/0082-UPBZ-1109995-no-sync-turs-on-pthread_cancel.patch
  79. 58
      SOURCES/0083-RHBZ-1080055-orphan-paths-on-reload.patch
  80. 24
      SOURCES/0084-RHBZ-1110000-multipath-man.patch
  81. 12
      SOURCES/0085-UPBZ-1110006-datacore-config.patch
  82. 10
      SOURCES/0086-RHBZ-1110007-orphan-path-on-failed-add.patch
  83. 40
      SOURCES/0087-RHBZ-1110013-config-error-checking.patch
  84. 108
      SOURCES/0088-RHBZ-1069811-configurable-prio-timeout.patch
  85. 58
      SOURCES/0089-RHBZ-1110016-add-noasync-option.patch
  86. 41
      SOURCES/0090-UPBZ-1080038-reorder-paths-for-round-robin.patch
  87. 36
      SOURCES/0091-RHBZ-1069584-fix-empty-values-fast-io-fail-and-dev-loss.patch
  88. 47
      SOURCES/0092-UPBZ-1104605-reload-on-rename.patch
  89. 80
      SOURCES/0093-UPBZ-1086825-user-friendly-name-remap.patch
  90. 106
      SOURCES/0094-RHBZ-1086825-cleanup-remap.patch
  91. 12
      SOURCES/0095-RHBZ-1127944-xtremIO-config.patch
  92. 17
      SOURCES/0096-RHBZ-979474-new-wildcards.patch
  93. 148
      SOURCES/0097-RH-fix-coverity-errors.patch
  94. 324
      SOURCES/0098-UPBZ-1067171-mutipath-i.patch
  95. 62
      SOURCES/0099-RH-add-all-devs.patch
  96. 36
      SOURCES/0100-RHBZ-1067171-multipath-i-update.patch
  97. 44
      SOURCES/0101-RH-cleanup-partmaps-code.patch
  98. 359
      SOURCES/0102-RHBZ-631009-deferred-remove.patch
  99. 12
      SOURCES/0104-RHBZ-1159337-fix-double-free.patch
  100. 104
      SOURCES/0106-RHBZ-1169935-no-new-devs.patch
  101. Some files were not shown because too many files have changed in this diff Show More

1
SOURCES/0001-RH-dont_start_with_no_config.patch

@ -13,3 +13,4 @@ Index: multipath-tools-130222/multipathd/multipathd.service @@ -13,3 +13,4 @@ Index: multipath-tools-130222/multipathd/multipathd.service
+ConditionPathExists=/etc/multipath.conf
DefaultDependencies=no
Conflicts=shutdown.target

20
SOURCES/0002-RH-multipath.rules.patch

@ -38,17 +38,17 @@ Index: multipath-tools-130222/multipath/Makefile @@ -38,17 +38,17 @@ Index: multipath-tools-130222/multipath/Makefile
+++ multipath-tools-130222/multipath/Makefile
@@ -21,12 +21,15 @@ $(EXEC): $(OBJS)
install:
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
+ $(INSTALL_PROGRAM) -d $(DESTDIR)/lib/udev/rules.d
+ $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)

$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)
uninstall:
+ rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz

63
SOURCES/0003-RH-Make-build-system-RH-Fedora-friendly.patch

@ -34,8 +34,8 @@ Index: multipath-tools-130222/kpartx/Makefile @@ -34,8 +34,8 @@ Index: multipath-tools-130222/kpartx/Makefile
+++ multipath-tools-130222/kpartx/Makefile
@@ -26,17 +26,17 @@ $(EXEC): $(OBJS)
install: $(EXEC) $(EXEC).8
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)
- $(INSTALL_PROGRAM) -d $(DESTDIR)$(libudevdir)
- $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir)
- $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d
@ -44,65 +44,66 @@ Index: multipath-tools-130222/kpartx/Makefile @@ -44,65 +44,66 @@ Index: multipath-tools-130222/kpartx/Makefile
+# $(INSTALL_PROGRAM) -m 755 kpartx_id $(DESTDIR)$(libudevdir)
+# $(INSTALL_PROGRAM) -d $(DESTDIR)/etc/udev/rules.d
+# $(INSTALL_PROGRAM) -m 644 kpartx.rules $(DESTDIR)/etc/udev/rules.d/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)

$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
uninstall:
rm -f $(DESTDIR)$(bindir)/$(EXEC)
rm -f $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm -f $(DESTDIR)$(bindir)/$(EXEC)
rm -f $(DESTDIR)$(mandir)/$(EXEC).8.gz
- rm -f $(DESTDIR)$(libudevdir)/kpartx_id
+# rm -f $(DESTDIR)$(libudevdir)/kpartx_id

clean:
rm -f core *.o $(EXEC) *.gz
rm -f core *.o $(EXEC) *.gz
Index: multipath-tools-130222/multipathd/Makefile
===================================================================
--- multipath-tools-130222.orig/multipathd/Makefile
+++ multipath-tools-130222/multipathd/Makefile
@@ -35,6 +35,7 @@ install:
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(rcdir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(rcdir)
+ $(INSTALL_PROGRAM) -m 755 multipathd.init.redhat $(DESTDIR)$(rcdir)/$(EXEC)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(unitdir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).service $(DESTDIR)$(unitdir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(unitdir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).service $(DESTDIR)$(unitdir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
Index: multipath-tools-130222/libmultipath/Makefile
===================================================================
--- multipath-tools-130222.orig/libmultipath/Makefile
+++ multipath-tools-130222/libmultipath/Makefile
@@ -46,9 +46,11 @@ install:
$(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir)
$(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS)
$(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(libdir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir)
$(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS)
$(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(libdir)
+ ln -sf $(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB)

uninstall:
rm -f $(DESTDIR)$(syslibdir)/$(LIBS)
rm -f $(DESTDIR)$(syslibdir)/$(LIBS)
+ rm -f $(DESTDIR)$(syslibdir)/$(DEVLIB)

clean:
rm -f core *.a *.o *.gz *.so *.so.*
rm -f core *.a *.o *.gz *.so *.so.*
Index: multipath-tools-130222/libmpathpersist/Makefile
===================================================================
--- multipath-tools-130222.orig/libmpathpersist/Makefile
+++ multipath-tools-130222/libmpathpersist/Makefile
@@ -28,17 +28,14 @@ $(LIBS):
install: $(LIBS)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir)
$(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(syslibdir)
$(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(syslibdir)/$(LIBS)
- $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(syslibdir)
$(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(man3dir)
$(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)$(man3dir)
- $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)/usr/include/
- $(INSTALL_PROGRAM) -m 755 -d $(DESTDIR)/usr/share/doc/mpathpersist/
- ln -sf $(DESTDIR)$(syslibdir)/$(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB)
+ ln -sf $(LIBS) $(DESTDIR)$(syslibdir)/$(DEVLIB)
install -m 644 mpath_persistent_reserve_in.3.gz $(DESTDIR)$(man3dir)
install -m 644 mpath_persistent_reserve_out.3.gz $(DESTDIR)$(man3dir)
install -m 644 mpath_persistent_reserve_in.3.gz $(DESTDIR)$(man3dir)
install -m 644 mpath_persistent_reserve_out.3.gz $(DESTDIR)$(man3dir)
- install -m 644 mpath_persist.h $(DESTDIR)/usr/include/

uninstall:
rm -f $(DESTDIR)$(syslibdir)/$(LIBS)
rm -f $(DESTDIR)$(syslibdir)/$(LIBS)
+ rm -f $(DESTDIR)$(syslibdir)/$(DEVLIB)
rm $(DESTDIR)$(mandir)/mpath_persistent_reserve_in.3.gz
rm $(DESTDIR)$(mandir)/mpath_persistent_reserve_out.3.gz
rm $(DESTDIR)$(mandir)/mpath_persistent_reserve_in.3.gz
rm $(DESTDIR)$(mandir)/mpath_persistent_reserve_out.3.gz

18
SOURCES/0004-RH-multipathd-blacklist-all-by-default.patch

@ -25,13 +25,13 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -25,13 +25,13 @@ Index: multipath-tools-130222/libmultipath/config.c
#include "prio.h"
#include "devmapper.h"
+#include "version.h"

static int
hwe_strmatch (struct hwentry *hwe1, struct hwentry *hwe2)
@@ -585,6 +586,21 @@ load_config (char * file)

} else {
init_keywords();
} else {
init_keywords();
+ condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
+ condlog(0, "A default multipath.conf file is located at");
+ condlog(0, "/usr/share/doc/device-mapper-multipath-%d.%d.%d/multipath.conf", MULTIPATH_VERSION(VERSION_CODE));
@ -47,18 +47,18 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -47,18 +47,18 @@ Index: multipath-tools-130222/libmultipath/config.c
+ condlog(0, "cannot store default no-config blacklist\n");
+ goto out;
+ }
}

/*
}
/*
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -6,6 +6,7 @@

#define ORIGIN_DEFAULT 0
#define ORIGIN_CONFIG 1
+#define ORIGIN_NO_CONFIG 2

/*
* In kernel, fast_io_fail == 0 means immediate failure on rport delete.

72
SOURCES/0005-RH-add-mpathconf.patch

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
---
libmultipath/config.c | 1
multipath/Makefile | 5
multipath/main.c | 4
libmultipath/config.c | 1
multipath/Makefile | 5
multipath/main.c | 4
multipath/mpathconf | 312 ++++++++++++++++++++++++++++++++++++++++++++++++++
multipath/mpathconf.8 | 103 ++++++++++++++++
5 files changed, 423 insertions(+), 2 deletions(-)
@ -11,62 +11,62 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -11,62 +11,62 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -589,6 +589,7 @@ load_config (char * file)
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
condlog(0, "A default multipath.conf file is located at");
condlog(0, "/usr/share/doc/device-mapper-multipath-%d.%d.%d/multipath.conf", MULTIPATH_VERSION(VERSION_CODE));
condlog(0, "/etc/multipath.conf does not exist, blacklisting all devices.");
condlog(0, "A default multipath.conf file is located at");
condlog(0, "/usr/share/doc/device-mapper-multipath-%d.%d.%d/multipath.conf", MULTIPATH_VERSION(VERSION_CODE));
+ condlog(0, "You can run /sbin/mpathconf to create or modify /etc/multipath.conf");
if (conf->blist_devnode == NULL) {
conf->blist_devnode = vector_alloc();
if (!conf->blist_devnode) {
if (conf->blist_devnode == NULL) {
conf->blist_devnode = vector_alloc();
if (!conf->blist_devnode) {
Index: multipath-tools-130222/multipath/Makefile
===================================================================
--- multipath-tools-130222.orig/multipath/Makefile
+++ multipath-tools-130222/multipath/Makefile
@@ -17,22 +17,27 @@ $(EXEC): $(OBJS)
$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS)
$(GZIP) $(EXEC).8 > $(EXEC).8.gz
$(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz
$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS)
$(GZIP) $(EXEC).8 > $(EXEC).8.gz
$(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz
+ $(GZIP) mpathconf.8 > mpathconf.8.gz

install:
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
+ $(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)/lib/udev/rules.d
$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -d $(DESTDIR)/lib/udev/rules.d
$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)
+ $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(mandir)

uninstall:
rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
rm $(DESTDIR)$(bindir)/$(EXEC)
+ rm $(DESTDIR)$(bindir)/mpathconf
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
+ rm $(DESTDIR)$(mandir)/mpathconf.8.gz

clean:
rm -f core *.o $(EXEC) *.gz
rm -f core *.o $(EXEC) *.gz
Index: multipath-tools-130222/multipath/main.c
===================================================================
--- multipath-tools-130222.orig/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -433,10 +433,10 @@ main (int argc, char *argv[])
exit(1);
}

exit(1);
}
- if (dm_prereq())
+ if (load_config(DEFAULT_CONFIGFILE))
exit(1);

exit(1);
- if (load_config(DEFAULT_CONFIGFILE))
+ if (dm_prereq())
exit(1);

while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) {
exit(1);
while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) {
Index: multipath-tools-130222/multipath/mpathconf
===================================================================
--- /dev/null

100
SOURCES/0006-RH-add-find-multipaths.patch

@ -15,32 +15,32 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -15,32 +15,32 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -547,6 +547,7 @@ load_config (char * file)
conf->reassign_maps = DEFAULT_REASSIGN_MAPS;
conf->checkint = DEFAULT_CHECKINT;
conf->max_checkint = MAX_CHECKINT(conf->checkint);
conf->reassign_maps = DEFAULT_REASSIGN_MAPS;
conf->checkint = DEFAULT_CHECKINT;
conf->max_checkint = MAX_CHECKINT(conf->checkint);
+ conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;
conf->fast_io_fail = DEFAULT_FAST_IO_FAIL;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
conf->fast_io_fail = DEFAULT_FAST_IO_FAIL;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
Index: multipath-tools-130222/libmultipath/configure.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -508,6 +508,10 @@ coalesce_paths (struct vectors * vecs, v

memset(empty_buff, 0, WWID_SIZE);

memset(empty_buff, 0, WWID_SIZE);
+ /* ignore refwwid if it's empty */
+ if (refwwid && !strlen(refwwid))
+ refwwid = NULL;
+
if (force_reload) {
vector_foreach_slot (pathvec, pp1, k) {
pp1->mpp = NULL;
if (force_reload) {
vector_foreach_slot (pathvec, pp1, k) {
pp1->mpp = NULL;
@@ -537,6 +541,13 @@ coalesce_paths (struct vectors * vecs, v
if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE))
continue;

if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE))
continue;
+ /* If find_multipaths was selected check if the path is valid */
+ if (conf->find_multipaths && !refwwid &&
+ !should_multipath(pp1, pathvec)) {
@ -48,9 +48,9 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -48,9 +48,9 @@ Index: multipath-tools-130222/libmultipath/configure.c
+ continue;
+ }
+
/*
* at this point, we know we really got a new mp
*/
/*
* at this point, we know we really got a new mp
*/
Index: multipath-tools-130222/libmultipath/defaults.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/defaults.h
@ -69,7 +69,7 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -69,7 +69,7 @@ Index: multipath-tools-130222/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -585,6 +585,27 @@ def_reservation_key_handler(vector strve
}

static int
+def_find_multipaths_handler(vector strvec)
+{
@ -94,10 +94,10 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -94,10 +94,10 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
def_names_handler(vector strvec)
{
char * buff;
char * buff;
@@ -2700,6 +2721,18 @@ snprint_def_log_checker_err (char * buff
}

static int
+snprint_def_find_multipaths (char * buff, int len, void * data)
+{
@ -113,22 +113,22 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -113,22 +113,22 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_def_user_friendly_names (char * buff, int len, void * data)
{
if (conf->user_friendly_names == USER_FRIENDLY_NAMES_ON)
if (conf->user_friendly_names == USER_FRIENDLY_NAMES_ON)
@@ -2833,6 +2866,7 @@ init_keywords(void)
install_keyword("wwids_file", &wwids_file_handler, &snprint_def_wwids_file);
install_keyword("log_checker_err", &def_log_checker_err_handler, &snprint_def_log_checker_err);
install_keyword("reservation_key", &def_reservation_key_handler, &snprint_def_reservation_key);
install_keyword("wwids_file", &wwids_file_handler, &snprint_def_wwids_file);
install_keyword("log_checker_err", &def_log_checker_err_handler, &snprint_def_log_checker_err);
install_keyword("reservation_key", &def_reservation_key_handler, &snprint_def_reservation_key);
+ install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths);
install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
Index: multipath-tools-130222/libmultipath/wwids.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.c
+++ multipath-tools-130222/libmultipath/wwids.c
@@ -125,6 +125,32 @@ out:
}

int
+should_multipath(struct path *pp1, vector pathvec)
+{
@ -158,7 +158,7 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -158,7 +158,7 @@ Index: multipath-tools-130222/libmultipath/wwids.c
+int
remember_wwid(char *wwid)
{
int ret = check_wwids_file(wwid, 1);
int ret = check_wwids_file(wwid, 1);
Index: multipath-tools-130222/libmultipath/wwids.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.h
@ -166,24 +166,24 @@ Index: multipath-tools-130222/libmultipath/wwids.h @@ -166,24 +166,24 @@ Index: multipath-tools-130222/libmultipath/wwids.h
@@ -12,6 +12,7 @@
"#\n" \
"# Valid WWIDs:\n"

+int should_multipath(struct path *pp, vector pathvec);
int remember_wwid(char *wwid);
int check_wwids_file(char *wwid, int write_wwid);

Index: multipath-tools-130222/multipath/main.c
===================================================================
--- multipath-tools-130222.orig/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -333,7 +333,7 @@ configure (void)
/*
* core logic entry point
*/
/*
* core logic entry point
*/
- r = coalesce_paths(&vecs, NULL, NULL, conf->force_reload);
+ r = coalesce_paths(&vecs, NULL, refwwid, conf->force_reload);

out:
if (refwwid)
if (refwwid)
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
@ -195,28 +195,28 @@ Index: multipath-tools-130222/multipathd/main.c @@ -195,28 +195,28 @@ Index: multipath-tools-130222/multipathd/main.c
+#include <wwids.h>
#include <pgpolicies.h>
#include <uevent.h>

@@ -471,6 +472,11 @@ rescan:
return 1;
}

return 1;
}
+ if (conf->find_multipaths &&
+ !should_multipath(pp, vecs->pathvec)) {
+ orphan_path(pp);
+ return 0;
+ }
condlog(4,"%s: creating new map", pp->dev);
if ((mpp = add_map_with_path(vecs, pp, 1))) {
mpp->action = ACT_CREATE;
condlog(4,"%s: creating new map", pp->dev);
if ((mpp = add_map_with_path(vecs, pp, 1))) {
mpp->action = ACT_CREATE;
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -106,6 +106,7 @@ struct config {
unsigned int dev_loss;
int log_checker_err;
int allow_queueing;
unsigned int dev_loss;
int log_checker_err;
int allow_queueing;
+ int find_multipaths;
uid_t uid;
gid_t gid;
mode_t mode;
uid_t uid;
gid_t gid;
mode_t mode;

126
SOURCES/0007-RH-add-hp_tur-checker.patch

@ -10,7 +10,7 @@ Index: multipath-tools-120613/libmultipath/checkers.h @@ -10,7 +10,7 @@ Index: multipath-tools-120613/libmultipath/checkers.h
--- multipath-tools-120613.orig/libmultipath/checkers.h
+++ multipath-tools-120613/libmultipath/checkers.h
@@ -60,6 +60,7 @@ enum path_check_state {

#define DIRECTIO "directio"
#define TUR "tur"
+#define HP_TUR "hp_tur"
@ -22,39 +22,39 @@ Index: multipath-tools-120613/libmultipath/checkers.h @@ -22,39 +22,39 @@ Index: multipath-tools-120613/libmultipath/checkers.h
#define CHECKER_DEV_LEN 256
#define LIB_CHECKER_NAMELEN 256
+#define WWID_SIZE 128

struct checker {
struct list_head node;
struct list_head node;
@@ -88,6 +90,7 @@ struct checker {
int disable;
char name[CHECKER_NAME_LEN];
char message[CHECKER_MSG_LEN]; /* comm with callers */
int disable;
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 */
void ** mpcontext; /* store for persistent data shared
multipath-wide. Use MALLOC if
void * context; /* store for persistent data */
void ** mpcontext; /* store for persistent data shared
multipath-wide. Use MALLOC if
Index: multipath-tools-120613/libmultipath/checkers/Makefile
===================================================================
--- multipath-tools-120613.orig/libmultipath/checkers/Makefile
+++ multipath-tools-120613/libmultipath/checkers/Makefile
@@ -8,6 +8,7 @@ LIBS= \
libcheckcciss_tur.so \
libcheckreadsector0.so \
libchecktur.so \
libcheckcciss_tur.so \
libcheckreadsector0.so \
libchecktur.so \
+ libcheckhp_tur.so \
libcheckdirectio.so \
libcheckemc_clariion.so \
libcheckhp_sw.so \
libcheckdirectio.so \
libcheckemc_clariion.so \
libcheckhp_sw.so \
@@ -23,6 +24,9 @@ libcheckdirectio.so: libsg.o directio.o
libcheck%.so: libsg.o %.o
$(CC) $(LDFLAGS) $(SHARED_FLAGS) -o $@ $^

$(CC) $(LDFLAGS) $(SHARED_FLAGS) -o $@ $^
+hp_tur.o: tur.c
+ $(CC) $(CFLAGS) -DCHECK_WWID -c -o $@ $<
+
install:
$(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(libdir)

$(INSTALL_PROGRAM) -m 755 $(LIBS) $(DESTDIR)$(libdir)
Index: multipath-tools-120613/libmultipath/checkers/tur.c
===================================================================
--- multipath-tools-120613.orig/libmultipath/checkers/tur.c
@ -62,7 +62,7 @@ Index: multipath-tools-120613/libmultipath/checkers/tur.c @@ -62,7 +62,7 @@ Index: multipath-tools-120613/libmultipath/checkers/tur.c
@@ -24,12 +24,101 @@
#define TUR_CMD_LEN 6
#define HEAVY_CHECK_COUNT 10

+#ifdef CHECK_WWID
+#define MSG_TUR_UP "HP tur checker reports path is up"
+#define MSG_TUR_DOWN "HP tur checker reports path is down"
@ -158,38 +158,38 @@ Index: multipath-tools-120613/libmultipath/checkers/tur.c @@ -158,38 +158,38 @@ Index: multipath-tools-120613/libmultipath/checkers/tur.c
+ return (ret = 0);
+}
+#endif

struct tur_checker_context {
dev_t devt;
dev_t devt;
@@ -43,6 +132,7 @@ struct tur_checker_context {
pthread_cond_t active;
pthread_spinlock_t hldr_lock;
int holders;
pthread_cond_t active;
pthread_spinlock_t hldr_lock;
int holders;
+ char wwid[WWID_SIZE];
char message[CHECKER_MSG_LEN];
char message[CHECKER_MSG_LEN];
};

@@ -100,12 +190,15 @@ void libcheck_free (struct checker * c)
#define TUR_MSG(msg, fmt, args...) snprintf(msg, CHECKER_MSG_LEN, fmt, ##args);

int
-tur_check(int fd, unsigned int timeout, char *msg)
+tur_check (int fd, unsigned int timeout, char *msg, char *wwid)
{
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;
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 new_wwid[WWID_SIZE];
+#endif

retry:
memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
@@ -179,6 +272,24 @@ tur_check(int fd, unsigned int timeout,
TUR_MSG(msg, MSG_TUR_DOWN);
return PATH_DOWN;
}
TUR_MSG(msg, MSG_TUR_DOWN);
return PATH_DOWN;
}
+#ifdef CHECK_WWID
+ if (!do_inq(fd, timeout, new_wwid)) {
+
@ -208,47 +208,47 @@ Index: multipath-tools-120613/libmultipath/checkers/tur.c @@ -208,47 +208,47 @@ Index: multipath-tools-120613/libmultipath/checkers/tur.c
+ }
+up:
+#endif
TUR_MSG(msg, MSG_TUR_UP);
return PATH_UP;
TUR_MSG(msg, MSG_TUR_UP);
return PATH_UP;
}
@@ -215,7 +326,7 @@ void *tur_thread(void *ctx)
ct->state = PATH_PENDING;
pthread_mutex_unlock(&ct->lock);

ct->state = PATH_PENDING;
pthread_mutex_unlock(&ct->lock);
- state = tur_check(ct->fd, ct->timeout, ct->message);
+ state = tur_check(ct->fd, ct->timeout, ct->message, ct->wwid);

/* TUR checker done */
pthread_mutex_lock(&ct->lock);
/* TUR checker done */
pthread_mutex_lock(&ct->lock);
@@ -275,7 +386,7 @@ libcheck_check (struct checker * c)
ct->devt = sb.st_rdev;

if (c->sync)
ct->devt = sb.st_rdev;
if (c->sync)
- return tur_check(c->fd, c->timeout, c->message);
+ return tur_check(c->fd, c->timeout, c->message, ct->wwid);

/*
* Async mode
/*
* Async mode
@@ -319,7 +430,8 @@ libcheck_check (struct checker * c)
pthread_mutex_unlock(&ct->lock);
condlog(3, "%d:%d: tur thread not responding, "
"using sync mode", TUR_DEVT(ct));
pthread_mutex_unlock(&ct->lock);
condlog(3, "%d:%d: tur thread not responding, "
"using sync mode", TUR_DEVT(ct));
- return tur_check(c->fd, c->timeout, c->message);
+ return tur_check(c->fd, c->timeout, c->message,
+ ct->wwid);
}
/* Start new TUR checker */
ct->state = PATH_UNCHECKED;
}
/* Start new TUR checker */
ct->state = PATH_UNCHECKED;
@@ -337,7 +449,8 @@ libcheck_check (struct checker * c)
ct->holders--;
condlog(3, "%d:%d: failed to start tur thread, using"
" sync mode", TUR_DEVT(ct));
ct->holders--;
condlog(3, "%d:%d: failed to start tur thread, using"
" sync mode", TUR_DEVT(ct));
- return tur_check(c->fd, c->timeout, c->message);
+ return tur_check(c->fd, c->timeout, c->message,
+ ct->wwid);
}
pthread_attr_destroy(&attr);
tur_timeout(&tsp);
}
pthread_attr_destroy(&attr);
tur_timeout(&tsp);
Index: multipath-tools-120613/multipath.conf.annotated
===================================================================
--- multipath-tools-120613.orig/multipath.conf.annotated

36
SOURCES/0008-RH-revert-partition-changes.patch

@ -8,30 +8,30 @@ Index: multipath-tools-130222/kpartx/dos.c @@ -8,30 +8,30 @@ Index: multipath-tools-130222/kpartx/dos.c
--- multipath-tools-130222.orig/kpartx/dos.c
+++ multipath-tools-130222/kpartx/dos.c
@@ -98,8 +98,6 @@ read_dos_pt(int fd, struct slice all, st
break;
}
if (is_extended(p.sys_type)) {
break;
}
if (is_extended(p.sys_type)) {
- sp[i].size = 2; /* extended partitions only get two
- sectors mapped for LILO to install */
n += read_extended_partition(fd, &p, i, sp+n, ns-n);
}
}
n += read_extended_partition(fd, &p, i, sp+n, ns-n);
}
}
Index: multipath-tools-130222/kpartx/kpartx.c
===================================================================
--- multipath-tools-130222.orig/kpartx/kpartx.c
+++ multipath-tools-130222/kpartx/kpartx.c
@@ -516,6 +516,7 @@ main(int argc, char **argv){
d = c;
while (c) {
for (j = 0; j < n; j++) {
d = c;
while (c) {
for (j = 0; j < n; j++) {
+ uint64_t start;
int k = slices[j].container - 1;

if (slices[j].size == 0)
int k = slices[j].container - 1;
if (slices[j].size == 0)
@@ -541,9 +542,11 @@ main(int argc, char **argv){
}
strip_slash(partname);

}
strip_slash(partname);
- if (safe_sprintf(params, "%s %" PRIu64,
- device,
- slices[j].start)) {
@ -40,6 +40,6 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -40,6 +40,6 @@ Index: multipath-tools-130222/kpartx/kpartx.c
+ slices[k].major,
+ slices[k].minor,
+ start)) {
fprintf(stderr, "params too small\n");
exit(1);
}
fprintf(stderr, "params too small\n");
exit(1);
}

151
SOURCES/0009-RH-RHEL5-style-partitions.patch

@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
kpartx/bsd.c | 35 ---------------
kpartx/dos.c | 7 +--
kpartx/kpartx.c | 123 +++++++-------------------------------------------------
kpartx/kpartx.h | 1
kpartx/kpartx.h | 1
kpartx/sun.c | 35 ---------------
5 files changed, 24 insertions(+), 177 deletions(-)

@ -12,21 +12,21 @@ Index: multipath-tools-130222/kpartx/bsd.c @@ -12,21 +12,21 @@ Index: multipath-tools-130222/kpartx/bsd.c
+++ multipath-tools-130222/kpartx/bsd.c
@@ -50,10 +50,10 @@ int
read_bsd_pt(int fd, struct slice all, struct slice *sp, int ns) {
struct bsd_disklabel *l;
struct bsd_partition *p;
struct bsd_disklabel *l;
struct bsd_partition *p;
- unsigned int offset = all.start, end;
+ unsigned int offset = all.start;
int max_partitions;
char *bp;
int max_partitions;
char *bp;
- int n = 0, i, j;
+ int n = 0;

bp = getblock(fd, offset+1); /* 1 sector suffices */
if (bp == NULL)
bp = getblock(fd, offset+1); /* 1 sector suffices */
if (bp == NULL)
@@ -79,36 +79,5 @@ read_bsd_pt(int fd, struct slice all, st
break;
}
}
break;
}
}
- /*
- * Convention has it that the bsd disklabel will always have
- * the 'c' partition spanning the entire disk.
@ -58,7 +58,7 @@ Index: multipath-tools-130222/kpartx/bsd.c @@ -58,7 +58,7 @@ Index: multipath-tools-130222/kpartx/bsd.c
- }
- }
- }
return n;
return n;
}
Index: multipath-tools-130222/kpartx/dos.c
===================================================================
@ -66,49 +66,49 @@ Index: multipath-tools-130222/kpartx/dos.c @@ -66,49 +66,49 @@ Index: multipath-tools-130222/kpartx/dos.c
+++ multipath-tools-130222/kpartx/dos.c
@@ -16,7 +16,7 @@ is_extended(int type) {
}

static int
-read_extended_partition(int fd, struct partition *ep, int en,
+read_extended_partition(int fd, struct partition *ep,
struct slice *sp, int ns)
struct slice *sp, int ns)
{
struct partition p;
struct partition p;
@@ -53,7 +53,6 @@ read_extended_partition(int fd, struct p
if (n < ns) {
sp[n].start = here + le32_to_cpu(p.start_sect);
sp[n].size = le32_to_cpu(p.nr_sects);
if (n < ns) {
sp[n].start = here + le32_to_cpu(p.start_sect);
sp[n].size = le32_to_cpu(p.nr_sects);
- sp[n].container = en + 1;
n++;
} else {
fprintf(stderr,
n++;
} else {
fprintf(stderr,
@@ -98,7 +97,9 @@ read_dos_pt(int fd, struct slice all, st
break;
}
if (is_extended(p.sys_type)) {
break;
}
if (is_extended(p.sys_type)) {
- n += read_extended_partition(fd, &p, i, sp+n, ns-n);
+ n += read_extended_partition(fd, &p, sp+n, ns-n);
+ /* hide the extended partition itself */
+ sp[i].size = 2;
}
}
return n;
}
}
return n;
Index: multipath-tools-130222/kpartx/kpartx.c
===================================================================
--- multipath-tools-130222.orig/kpartx/kpartx.c
+++ multipath-tools-130222/kpartx/kpartx.c
@@ -192,7 +192,7 @@ get_hotplug_device(void)

int
main(int argc, char **argv){
- int i, j, m, n, op, off, arg, c, d, ro=0;
+ int i, j, m, n, op, off, arg, ro=0;
int fd = -1;
struct slice all;
struct pt *ptp;
int fd = -1;
struct slice all;
struct pt *ptp;
@@ -381,49 +381,30 @@ main(int argc, char **argv){
else
continue;

else
continue;
+ /*
+ * test for overlap, as in the case of an extended partition
+ * zero their size to avoid mapping
@ -122,24 +122,24 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -122,24 +122,24 @@ Index: multipath-tools-130222/kpartx/kpartx.c
+ }
+ }
+
switch(what) {
case LIST:
switch(what) {
case LIST:
- for (j = 0, c = 0, m = 0; j < n; j++) {
+ for (j = 0; j < n; j++) {
if (slices[j].size == 0)
continue;
if (slices[j].size == 0)
continue;
- if (slices[j].container > 0) {
- c++;
- continue;
- }
-
- slices[j].minor = m++;

printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
mapname, delim, j+1,
slices[j].size, device,
slices[j].start);
}
printf("%s%s%d : 0 %" PRIu64 " %s %" PRIu64"\n",
mapname, delim, j+1,
slices[j].size, device,
slices[j].start);
}
- /* Loop to resolve contained slices */
- d = c;
- while (c) {
@ -166,31 +166,31 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -166,31 +166,31 @@ Index: multipath-tools-130222/kpartx/kpartx.c
- if (d == c)
- break;
- }

break;

break;
@@ -462,16 +443,10 @@ main(int argc, char **argv){
case ADD:
case UPDATE:
/* ADD and UPDATE share the same code that adds new partitions. */
case ADD:
case UPDATE:
/* ADD and UPDATE share the same code that adds new partitions. */
- for (j = 0, c = 0; j < n; j++) {
+ for (j = 0; j < n; j++) {
if (slices[j].size == 0)
continue;

if (slices[j].size == 0)
continue;
- /* Skip all contained slices */
- if (slices[j].container > 0) {
- c++;
- continue;
- }
-
if (safe_sprintf(partname, "%s%s%d",
mapname, delim, j+1)) {
fprintf(stderr, "partname too small\n");
if (safe_sprintf(partname, "%s%s%d",
mapname, delim, j+1)) {
fprintf(stderr, "partname too small\n");
@@ -512,72 +487,6 @@ main(int argc, char **argv){
slices[j].minor, slices[j].size,
DM_TARGET, params);
}
slices[j].minor, slices[j].size,
DM_TARGET, params);
}
- /* Loop to resolve contained slices */
- d = c;
- while (c) {
@ -257,20 +257,20 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -257,20 +257,20 @@ Index: multipath-tools-130222/kpartx/kpartx.c
- if (d == c)
- break;
- }

if (what == ADD) {
/* Skip code that removes devmappings for deleted partitions */
if (what == ADD) {
/* Skip code that removes devmappings for deleted partitions */
Index: multipath-tools-130222/kpartx/kpartx.h
===================================================================
--- multipath-tools-130222.orig/kpartx/kpartx.h
+++ multipath-tools-130222/kpartx/kpartx.h
@@ -24,7 +24,6 @@
struct slice {
uint64_t start;
uint64_t size;
uint64_t start;
uint64_t size;
- int container;
int major;
int minor;
int major;
int minor;
};
Index: multipath-tools-130222/kpartx/sun.c
===================================================================
@ -278,19 +278,19 @@ Index: multipath-tools-130222/kpartx/sun.c @@ -278,19 +278,19 @@ Index: multipath-tools-130222/kpartx/sun.c
+++ multipath-tools-130222/kpartx/sun.c
@@ -62,8 +62,8 @@ int
read_sun_pt(int fd, struct slice all, struct slice *sp, int ns) {
struct sun_disk_label *l;
struct sun_raw_part *s;
struct sun_disk_label *l;
struct sun_raw_part *s;
- unsigned int offset = all.start, end;
- int i, j, n;
+ unsigned int offset = all.start;
+ int i, n;
char *bp;

bp = getblock(fd, offset);
char *bp;
bp = getblock(fd, offset);
@@ -95,37 +95,6 @@ read_sun_pt(int fd, struct slice all, st
break;
}
}
break;
}
}
- /*
- * Convention has it that the SUN disklabel will always have
- * the 'c' partition spanning the entire disk.
@ -322,5 +322,6 @@ Index: multipath-tools-130222/kpartx/sun.c @@ -322,5 +322,6 @@ Index: multipath-tools-130222/kpartx/sun.c
- }
- }
- }
return n;
return n;
}

12
SOURCES/0010-RH-dont-remove-map-on-enomem.patch

@ -7,12 +7,12 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,12 +7,12 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -990,7 +990,8 @@ mpvec_garbage_collector (struct vectors
return;

vector_foreach_slot (vecs->mpvec, mpp, i) {
return;
vector_foreach_slot (vecs->mpvec, mpp, i) {
- if (mpp && mpp->alias && !dm_map_present(mpp->alias)) {
+ if (mpp && mpp->alias && !dm_map_present(mpp->alias) &&
+ errno != ENOMEM) {
condlog(2, "%s: remove dead map", mpp->alias);
remove_map_and_stop_waiter(mpp, vecs, 1);
i--;
condlog(2, "%s: remove dead map", mpp->alias);
remove_map_and_stop_waiter(mpp, vecs, 1);
i--;

22
SOURCES/0012-RH-kpartx-msg.patch

@ -7,18 +7,18 @@ Index: multipath-tools-130222/kpartx/lopart.c @@ -7,18 +7,18 @@ Index: multipath-tools-130222/kpartx/lopart.c
--- multipath-tools-130222.orig/kpartx/lopart.c
+++ multipath-tools-130222/kpartx/lopart.c
@@ -205,13 +205,13 @@ find_unused_loop_device (void)
fprintf(stderr,
"mount: Could not find any loop device, and, according to %s,\n"
" this kernel does not know about the loop device.\n"
fprintf(stderr,
"mount: Could not find any loop device, and, according to %s,\n"
" this kernel does not know about the loop device.\n"
- " (If so, then recompile or `insmod loop.o'.)",
+ " (If so, then recompile or `modprobe loop'.)",
PROC_DEVICES);

else
fprintf(stderr,
"mount: Could not find any loop device. Maybe this kernel does not know\n"
PROC_DEVICES);
else
fprintf(stderr,
"mount: Could not find any loop device. Maybe this kernel does not know\n"
- " about the loop device (then recompile or `insmod loop.o'), or\n"
+ " about the loop device (then recompile or `modprobe loop'), or\n"
" maybe /dev/loop# has the wrong major number?");

} else
" maybe /dev/loop# has the wrong major number?");
} else

72
SOURCES/0013-RHBZ-883981-cleanup-rpmdiff-issues.patch

@ -14,8 +14,8 @@ Index: multipath-tools-130222/Makefile.inc @@ -14,8 +14,8 @@ Index: multipath-tools-130222/Makefile.inc
--- multipath-tools-130222.orig/Makefile.inc
+++ multipath-tools-130222/Makefile.inc
@@ -23,15 +23,15 @@ endif

prefix =
prefix =
exec_prefix = $(prefix)
-bindir = $(exec_prefix)/sbin
+bindir = $(exec_prefix)/usr/sbin
@ -31,17 +31,17 @@ Index: multipath-tools-130222/Makefile.inc @@ -31,17 +31,17 @@ Index: multipath-tools-130222/Makefile.inc
+libdir = $(prefix)/usr/$(LIB)/multipath
unitdir = $(prefix)/lib/systemd/system
mpathpersistdir = $(TOPDIR)/libmpathpersist

@@ -42,8 +42,9 @@ ifndef RPM_OPT_FLAGS
RPM_OPT_FLAGS = -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4
RPM_OPT_FLAGS = -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4
endif

+LDFLAGS += -Wl,-z,relro
OPTFLAGS = $(RPM_OPT_FLAGS) -Wunused -Wstrict-prototypes
-CFLAGS = $(OPTFLAGS) -fPIC -DLIB_STRING=\"${LIB}\"
+CFLAGS = $(OPTFLAGS) -DLIB_STRING=\"${LIB}\"
SHARED_FLAGS = -shared

%.o: %.c
Index: multipath-tools-130222/multipathd/Makefile
===================================================================
@ -57,7 +57,7 @@ Index: multipath-tools-130222/multipathd/Makefile @@ -57,7 +57,7 @@ Index: multipath-tools-130222/multipathd/Makefile
- -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist
+ -L$(multipathdir) -lmultipath -L$(mpathpersistdir) -lmpathpersist \
+ -Wl,-z,now -pie

#
# debuging stuff
Index: multipath-tools-130222/kpartx/Makefile
@ -67,34 +67,34 @@ Index: multipath-tools-130222/kpartx/Makefile @@ -67,34 +67,34 @@ Index: multipath-tools-130222/kpartx/Makefile
@@ -4,7 +4,7 @@
#
include ../Makefile.inc

-CFLAGS += -I. -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
+CFLAGS += -fPIC -I. -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64

LIBDM_API_COOKIE = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_set_cookie' /usr/include/libdevmapper.h)

Index: multipath-tools-130222/libmpathpersist/Makefile
===================================================================
--- multipath-tools-130222.orig/libmpathpersist/Makefile
+++ multipath-tools-130222/libmpathpersist/Makefile
@@ -10,7 +10,7 @@ DEVLIB = libmpathpersist.so
LIBS = $(DEVLIB).$(SONAME)


-CFLAGS += -I$(multipathdir) -I$(mpathpersistdir)
-CFLAGS += -I$(multipathdir) -I$(mpathpersistdir)
+CFLAGS += -fPIC -I$(multipathdir) -I$(mpathpersistdir)
LIBDEPS += -lpthread -ldevmapper -ldl -L$(multipathdir) -lmultipath

OBJS = mpath_persist.o mpath_updatepr.o mpath_pr_ioctl.o
OBJS = mpath_persist.o mpath_updatepr.o mpath_pr_ioctl.o
@@ -19,7 +19,7 @@ all: $(LIBS)


$(LIBS):
- $(CC) -Wall -fPIC -c $(CFLAGS) *.c
$(LIBS):
- $(CC) -Wall -fPIC -c $(CFLAGS) *.c
+ $(CC) -Wall -c $(CFLAGS) *.c
$(CC) -shared $(LIBDEPS) -Wl,-soname=$@ $(CFLAGS) -o $@ $(OBJS)
ln -s $(LIBS) $(DEVLIB)
$(GZIP) mpath_persistent_reserve_in.3 > mpath_persistent_reserve_in.3.gz
$(CC) -shared $(LIBDEPS) -Wl,-soname=$@ $(CFLAGS) -o $@ $(OBJS)
ln -s $(LIBS) $(DEVLIB)
$(GZIP) mpath_persistent_reserve_in.3 > mpath_persistent_reserve_in.3.gz
Index: multipath-tools-130222/libmultipath/Makefile
===================================================================
--- multipath-tools-130222.orig/libmultipath/Makefile
@ -104,7 +104,7 @@ Index: multipath-tools-130222/libmultipath/Makefile @@ -104,7 +104,7 @@ Index: multipath-tools-130222/libmultipath/Makefile
LIBS = $(DEVLIB).$(SONAME)
LIBDEPS = -lpthread -ldl -ldevmapper -ludev
+CFLAGS += -fPIC

OBJS = memory.o parser.o vector.o devmapper.o \
hwtable.o blacklist.o util.o dmparser.o config.o \
Index: multipath-tools-130222/libmultipath/checkers/Makefile
@ -112,37 +112,37 @@ Index: multipath-tools-130222/libmultipath/checkers/Makefile @@ -112,37 +112,37 @@ Index: multipath-tools-130222/libmultipath/checkers/Makefile
--- multipath-tools-130222.orig/libmultipath/checkers/Makefile
+++ multipath-tools-130222/libmultipath/checkers/Makefile
@@ -14,7 +14,7 @@ LIBS= \
libcheckhp_sw.so \
libcheckrdac.so

libcheckhp_sw.so \
libcheckrdac.so
-CFLAGS += -I..
+CFLAGS += -fPIC -I..

all: $(LIBS)

Index: multipath-tools-130222/libmultipath/prioritizers/Makefile
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/Makefile
+++ multipath-tools-130222/libmultipath/prioritizers/Makefile
@@ -17,7 +17,7 @@ LIBS = \
libprioweightedpath.so \
libprioiet.so

libprioweightedpath.so \
libprioiet.so
-CFLAGS += -I..
+CFLAGS += -fPIC -I..

all: $(LIBS)

Index: multipath-tools-130222/multipath/Makefile
===================================================================
--- multipath-tools-130222.orig/multipath/Makefile
+++ multipath-tools-130222/multipath/Makefile
@@ -6,7 +6,7 @@ include ../Makefile.inc

OBJS = main.o

-CFLAGS += -I$(multipathdir)
+CFLAGS += -fPIC -I$(multipathdir)
LDFLAGS += -lpthread -ldevmapper -ldl -L$(multipathdir) -lmultipath

EXEC = multipath

20
SOURCES/0014-RH-handle-other-sector-sizes.patch

@ -7,17 +7,17 @@ Index: multipath-tools-120821/kpartx/gpt.c @@ -7,17 +7,17 @@ Index: multipath-tools-120821/kpartx/gpt.c
--- multipath-tools-120821.orig/kpartx/gpt.c
+++ multipath-tools-120821/kpartx/gpt.c
@@ -637,6 +637,7 @@ read_gpt_pt (int fd, struct slice all, s
uint32_t i;
int n = 0;
uint32_t i;
int n = 0;
int last_used_index=-1;
+ int sector_size_mul = get_sector_size(fd)/512;

if (!find_valid_gpt (fd, &gpt, &ptes) || !gpt || !ptes) {
if (gpt)
if (!find_valid_gpt (fd, &gpt, &ptes) || !gpt || !ptes) {
if (gpt)
@@ -652,9 +653,11 @@ read_gpt_pt (int fd, struct slice all, s
sp[n].size = 0;
n++;
} else {
sp[n].size = 0;
n++;
} else {
- sp[n].start = __le64_to_cpu(ptes[i].starting_lba);
- sp[n].size = __le64_to_cpu(ptes[i].ending_lba) -
- __le64_to_cpu(ptes[i].starting_lba) + 1;
@ -27,5 +27,5 @@ Index: multipath-tools-120821/kpartx/gpt.c @@ -27,5 +27,5 @@ Index: multipath-tools-120821/kpartx/gpt.c
+ (__le64_to_cpu(ptes[i].ending_lba) -
+ __le64_to_cpu(ptes[i].starting_lba) + 1);
last_used_index=n;
n++;
}
n++;
}

10
SOURCES/0015-RH-fix-output-buffer.patch

@ -12,7 +12,7 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -12,7 +12,7 @@ Index: multipath-tools-130222/libmultipath/print.c
#include <unistd.h>
+#include <string.h>
+#include <errno.h>

#include "checkers.h"
#include "vector.h"
@@ -24,6 +26,7 @@
@ -20,7 +20,7 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -20,7 +20,7 @@ Index: multipath-tools-130222/libmultipath/print.c
#include "devmapper.h"
#include "uevent.h"
+#include "debug.h"

#define MAX(x,y) (x > y) ? x : y
#define TAIL (line + len - 1 - c)
@@ -754,12 +757,32 @@ snprint_pathgroup (char * line, int len,
@ -32,7 +32,7 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -32,7 +32,7 @@ Index: multipath-tools-130222/libmultipath/print.c
+ char *buff = NULL;
+ char *old = NULL;
+ int len, maxlen = MAX_LINE_LEN * MAX_LINES;

- memset(&buff[0], 0, MAX_LINE_LEN * MAX_LINES);
- snprint_multipath_topology(&buff[0], MAX_LINE_LEN * MAX_LINES,
- mpp, verbosity);
@ -55,8 +55,8 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -55,8 +55,8 @@ Index: multipath-tools-130222/libmultipath/print.c
+ buff = REALLOC(buff, maxlen);
+ }
+ } while (resize);
printf("%s", buff);
printf("%s", buff);
+ FREE(buff);
}

extern int

12
SOURCES/0016-RH-dont-print-ghost-messages.patch

@ -7,12 +7,12 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -7,12 +7,12 @@ Index: multipath-tools-130222/libmultipath/discovery.c
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -898,7 +898,8 @@ get_state (struct path * pp, int daemon)
c->timeout = DEF_TIMEOUT;
state = checker_check(c);
condlog(3, "%s: state = %s", pp->dev, checker_state_name(state));
c->timeout = DEF_TIMEOUT;
state = checker_check(c);
condlog(3, "%s: state = %s", pp->dev, checker_state_name(state));
- if (state != PATH_UP && strlen(checker_message(c)))
+ if (state != PATH_UP && state != PATH_GHOST &&
+ strlen(checker_message(c)))
condlog(3, "%s: checker msg is \"%s\"",
pp->dev, checker_message(c));
return state;
condlog(3, "%s: checker msg is \"%s\"",
pp->dev, checker_message(c));
return state;

12
SOURCES/0018-RH-fix-factorize.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -437,6 +437,8 @@ restart:
merge_hwe(hwe2, hwe1);
if (hwe_strmatch(hwe2, hwe1) == 0) {
vector_del_slot(hw, i);
merge_hwe(hwe2, hwe1);
if (hwe_strmatch(hwe2, hwe1) == 0) {
vector_del_slot(hw, i);
+ free_hwe(hwe1);
+ n -= 1;
/*
* Play safe here; we have modified
* the original vector so the outer
/*
* Play safe here; we have modified
* the original vector so the outer

40
SOURCES/0019-RH-fix-sockets.patch

@ -12,37 +12,37 @@ Index: multipath-tools-130222/libmpathpersist/mpath_updatepr.c @@ -12,37 +12,37 @@ Index: multipath-tools-130222/libmpathpersist/mpath_updatepr.c
#include "memory.h"
#include "../libmultipath/uxsock.h"
+#include "../libmultipath/defaults.h"

unsigned long mem_allocated; /* Total memory used in Bytes */

@@ -25,7 +26,7 @@ int update_prflag(char * arg1, char * ar
size_t len;
int ret = 0;

size_t len;
int ret = 0;
- fd = ux_socket_connect("/var/run/multipathd.sock");
+ fd = ux_socket_connect(DEFAULT_SOCKET);
if (fd == -1) {
condlog (0, "ux socket connect error");
return 1 ;
if (fd == -1) {
condlog (0, "ux socket connect error");
return 1 ;
Index: multipath-tools-130222/libmultipath/uxsock.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/uxsock.c
+++ multipath-tools-130222/libmultipath/uxsock.c
@@ -31,7 +31,7 @@ int ux_socket_connect(const char *name)
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
addr.sun_path[0] = '\0';
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
addr.sun_path[0] = '\0';
- len = strlen(name) + 1;
+ len = strlen(name) + 1 + sizeof(sa_family_t);
strncpy(&addr.sun_path[1], name, len);

fd = socket(AF_LOCAL, SOCK_STREAM, 0);
strncpy(&addr.sun_path[1], name, len);
fd = socket(AF_LOCAL, SOCK_STREAM, 0);
@@ -62,7 +62,7 @@ int ux_socket_listen(const char *name)
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
addr.sun_path[0] = '\0';
memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_LOCAL;
addr.sun_path[0] = '\0';
- len = strlen(name) + 1;
+ len = strlen(name) + 1 + sizeof(sa_family_t);
strncpy(&addr.sun_path[1], name, len);

if (bind(fd, (struct sockaddr *)&addr, len) == -1) {
strncpy(&addr.sun_path[1], name, len);
if (bind(fd, (struct sockaddr *)&addr, len) == -1) {

23
SOURCES/0020-RHBZ-907360-static-pthread-init.patch

@ -7,7 +7,7 @@ Index: multipath-tools-130222/libmultipath/uevent.c @@ -7,7 +7,7 @@ Index: multipath-tools-130222/libmultipath/uevent.c
--- multipath-tools-130222.orig/libmultipath/uevent.c
+++ multipath-tools-130222/libmultipath/uevent.c
@@ -53,8 +53,10 @@ typedef int (uev_trigger)(struct uevent

pthread_t uevq_thr;
LIST_HEAD(uevq);
-pthread_mutex_t uevq_lock, *uevq_lockp = &uevq_lock;
@ -20,21 +20,22 @@ Index: multipath-tools-130222/libmultipath/uevent.c @@ -20,21 +20,22 @@ Index: multipath-tools-130222/libmultipath/uevent.c
void * my_trigger_data;
int servicing_uev;
@@ -409,10 +411,6 @@ int uevent_listen(void)
* thereby not getting to empty the socket's receive buffer queue
* often enough.
*/
* thereby not getting to empty the socket's receive buffer queue
* often enough.
*/
- INIT_LIST_HEAD(&uevq);
-
- pthread_mutex_init(uevq_lockp, NULL);
- pthread_cond_init(uev_condp, NULL);
pthread_cleanup_push(uevq_stop, NULL);

monitor = udev_monitor_new_from_netlink(conf->udev, "udev");
pthread_cleanup_push(uevq_stop, NULL);
monitor = udev_monitor_new_from_netlink(conf->udev, "udev");
@@ -525,8 +523,6 @@ out:
if (need_failback)
err = failback_listen();
pthread_cleanup_pop(1);
if (need_failback)
err = failback_listen();
pthread_cleanup_pop(1);
- pthread_mutex_destroy(uevq_lockp);
- pthread_cond_destroy(uev_condp);
return err;
return err;
}

5
SOURCES/0021-RHBZ-919119-respect-kernel-cmdline.patch

@ -10,12 +10,12 @@ Index: multipath-tools-130222/multipath/multipath.rules @@ -10,12 +10,12 @@ Index: multipath-tools-130222/multipath/multipath.rules
@@ -2,6 +2,8 @@
# so name them after their devmap name
SUBSYSTEM!="block", GOTO="end_mpath"

+IMPORT{cmdline}="nompath"
+ENV{nompath}=="?*", GOTO="end_mpath"
ENV{MPATH_SBIN_PATH}="/sbin"
TEST!="$env{MPATH_SBIN_PATH}/multipath", ENV{MPATH_SBIN_PATH}="/usr/sbin"

Index: multipath-tools-130222/multipathd/multipathd.service
===================================================================
--- multipath-tools-130222.orig/multipathd/multipathd.service
@ -27,3 +27,4 @@ Index: multipath-tools-130222/multipathd/multipathd.service @@ -27,3 +27,4 @@ Index: multipath-tools-130222/multipathd/multipathd.service
+ConditionKernelCommandLine=!nompath
DefaultDependencies=no
Conflicts=shutdown.target

11
SOURCES/0022-RH-multipathd-check-wwids.patch

@ -7,9 +7,10 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,9 +7,10 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -1363,6 +1363,7 @@ configure (struct vectors * vecs, int st

sync_maps_state(mpvec);
vector_foreach_slot(mpvec, mpp, i){
sync_maps_state(mpvec);
vector_foreach_slot(mpvec, mpp, i){
+ remember_wwid(mpp->wwid);
update_map_pr(mpp);
}
update_map_pr(mpp);
}

112
SOURCES/0023-RH-multipath-wipe-wwid.patch

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
---
libmultipath/discovery.c | 3 +
libmultipath/wwids.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++
libmultipath/wwids.h | 1
libmultipath/wwids.h | 1
multipath/main.c | 26 ++++++++++++--
multipath/multipath.8 | 5 ++
5 files changed, 115 insertions(+), 6 deletions(-)
@ -11,22 +11,22 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -11,22 +11,22 @@ Index: multipath-tools-130222/libmultipath/discovery.c
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -53,7 +53,8 @@ store_pathinfo (vector pathvec, vector h
goto out;
}
pp->udev = udev_device_ref(udevice);
goto out;
}
pp->udev = udev_device_ref(udevice);
- err = pathinfo(pp, hwtable, flag | DI_BLACKLIST);
+ err = pathinfo(pp, hwtable,
+ (conf->dry_run == 3)? flag : (flag | DI_BLACKLIST));
if (err)
goto out;

if (err)
goto out;
Index: multipath-tools-130222/libmultipath/wwids.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.c
+++ multipath-tools-130222/libmultipath/wwids.c
@@ -82,6 +82,92 @@ write_out_wwid(int fd, char *wwid) {
}

int
+do_remove_wwid(int fd, char *str) {
+ char buf[4097];
@ -116,7 +116,7 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -116,7 +116,7 @@ Index: multipath-tools-130222/libmultipath/wwids.c
+int
check_wwids_file(char *wwid, int write_wwid)
{
int fd, can_write, found, ret;
int fd, can_write, found, ret;
Index: multipath-tools-130222/libmultipath/wwids.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.h
@ -126,7 +126,7 @@ Index: multipath-tools-130222/libmultipath/wwids.h @@ -126,7 +126,7 @@ Index: multipath-tools-130222/libmultipath/wwids.h
int remember_wwid(char *wwid);
int check_wwids_file(char *wwid, int write_wwid);
+int remove_wwid(char *wwid);

#endif /* _WWIDS_H */
Index: multipath-tools-130222/multipath/main.c
===================================================================
@ -134,42 +134,42 @@ Index: multipath-tools-130222/multipath/main.c @@ -134,42 +134,42 @@ Index: multipath-tools-130222/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -83,7 +83,7 @@ usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
- fprintf (stderr, " %s [-c] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
+ fprintf (stderr, " %s [-c|-w] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
@@ -104,6 +104,7 @@ usage (char * progname)
" -B treat the bindings file as read only\n" \
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
" -b fil bindings file location\n" \
" -B treat the bindings file as read only\n" \
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
" -b fil bindings file location\n" \
+ " -w remove a device from the wwids file\n" \
" -p pol force all maps to specified path grouping policy :\n" \
" . failover one path per priority group\n" \
" . multibus all paths in one priority group\n" \
" -p pol force all maps to specified path grouping policy :\n" \
" . failover one path per priority group\n" \
" . multibus all paths in one priority group\n" \
@@ -212,7 +213,6 @@ get_dm_mpvec (vector curmp, vector pathv

if (!conf->dry_run)
reinstate_paths(mpp);
if (!conf->dry_run)
reinstate_paths(mpp);
- remember_wwid(mpp->wwid);
}
return 0;
}
return 0;
}
@@ -262,7 +262,7 @@ configure (void)
/*
* if we have a blacklisted device parameter, exit early
*/
/*
* if we have a blacklisted device parameter, exit early
*/
- if (dev && conf->dev_type == DEV_DEVNODE &&
+ if (dev && conf->dev_type == DEV_DEVNODE && conf->dry_run != 3 &&
(filter_devnode(conf->blist_devnode,
conf->elist_devnode, dev) > 0)) {
if (conf->dry_run == 2)
(filter_devnode(conf->blist_devnode,
conf->elist_devnode, dev) > 0)) {
if (conf->dry_run == 2)
@@ -284,6 +284,17 @@ configure (void)
condlog(3, "scope is nul");
goto out;
}
condlog(3, "scope is nul");
goto out;
}
+ if (conf->dry_run == 3) {
+ r = remove_wwid(refwwid);
+ if (r == 0)
@ -181,39 +181,39 @@ Index: multipath-tools-130222/multipath/main.c @@ -181,39 +181,39 @@ Index: multipath-tools-130222/multipath/main.c
+ }
+ goto out;
+ }
condlog(3, "scope limited to %s", refwwid);
if (conf->dry_run == 2) {
if (check_wwids_file(refwwid, 0) == 0){
condlog(3, "scope limited to %s", refwwid);
if (conf->dry_run == 2) {
if (check_wwids_file(refwwid, 0) == 0){
@@ -439,7 +450,7 @@ main (int argc, char *argv[])
if (dm_prereq())
exit(1);

if (dm_prereq())
exit(1);
- while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtq")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtqw")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
@@ -504,6 +515,9 @@ main (int argc, char *argv[])
case 'h':
usage(argv[0]);
exit(0);
case 'h':
usage(argv[0]);
exit(0);
+ case 'w':
+ conf->dry_run = 3;
+ break;
case ':':
fprintf(stderr, "Missing option argument\n");
usage(argv[0]);
case ':':
fprintf(stderr, "Missing option argument\n");
usage(argv[0]);
@@ -555,6 +569,10 @@ main (int argc, char *argv[])
condlog(0, "the -c option requires a path to check");
goto out;
}
condlog(0, "the -c option requires a path to check");
goto out;
}
+ if (conf->dry_run == 3 && !conf->dev) {
+ condlog(0, "the -w option requires a device");
+ goto out;
+ }
if (conf->remove == FLUSH_ONE) {
if (conf->dev_type == DEV_DEVMAP) {
r = dm_suspend_and_flush_map(conf->dev);
if (conf->remove == FLUSH_ONE) {
if (conf->dev_type == DEV_DEVMAP) {
r = dm_suspend_and_flush_map(conf->dev);
Index: multipath-tools-130222/multipath/multipath.8
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.8

66
SOURCES/0024-RH-multipath-wipe-wwids.patch

@ -11,7 +11,7 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -11,7 +11,7 @@ Index: multipath-tools-130222/libmultipath/wwids.c
+++ multipath-tools-130222/libmultipath/wwids.c
@@ -82,6 +82,50 @@ write_out_wwid(int fd, char *wwid) {
}

int
+replace_wwids(vector mp)
+{
@ -58,8 +58,8 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -58,8 +58,8 @@ Index: multipath-tools-130222/libmultipath/wwids.c
+
+int
do_remove_wwid(int fd, char *str) {
char buf[4097];
char *ptr;
char buf[4097];
char *ptr;
Index: multipath-tools-130222/libmultipath/wwids.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.h
@ -69,7 +69,7 @@ Index: multipath-tools-130222/libmultipath/wwids.h @@ -69,7 +69,7 @@ Index: multipath-tools-130222/libmultipath/wwids.h
int check_wwids_file(char *wwid, int write_wwid);
int remove_wwid(char *wwid);
+int replace_wwids(vector mp);

#endif /* _WWIDS_H */
Index: multipath-tools-130222/multipath/main.c
===================================================================
@ -77,44 +77,44 @@ Index: multipath-tools-130222/multipath/main.c @@ -77,44 +77,44 @@ Index: multipath-tools-130222/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -83,7 +83,7 @@ usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
- fprintf (stderr, " %s [-c|-w] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
+ fprintf (stderr, " %s [-c|-w|-W] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
@@ -105,6 +105,7 @@ usage (char * progname)
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
" -b fil bindings file location\n" \
" -w remove a device from the wwids file\n" \
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
" -b fil bindings file location\n" \
" -w remove a device from the wwids file\n" \
+ " -W reset the wwids file include only the current devices\n" \
" -p pol force all maps to specified path grouping policy :\n" \
" . failover one path per priority group\n" \
" . multibus all paths in one priority group\n" \
" -p pol force all maps to specified path grouping policy :\n" \
" . failover one path per priority group\n" \
" . multibus all paths in one priority group\n" \
@@ -450,7 +451,7 @@ main (int argc, char *argv[])
if (dm_prereq())
exit(1);

if (dm_prereq())
exit(1);
- while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:Brtqw")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:BrtqwW")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
@@ -518,6 +519,9 @@ main (int argc, char *argv[])
case 'w':
conf->dry_run = 3;
break;
case 'w':
conf->dry_run = 3;
break;
+ case 'W':
+ conf->dry_run = 4;
+ break;
case ':':
fprintf(stderr, "Missing option argument\n");
usage(argv[0]);
case ':':
fprintf(stderr, "Missing option argument\n");
usage(argv[0]);
@@ -573,6 +577,27 @@ main (int argc, char *argv[])
condlog(0, "the -w option requires a device");
goto out;
}
condlog(0, "the -w option requires a device");
goto out;
}
+ if (conf->dry_run == 4) {
+ struct multipath * mpp;
+ int i;
@ -136,9 +136,9 @@ Index: multipath-tools-130222/multipath/main.c @@ -136,9 +136,9 @@ Index: multipath-tools-130222/multipath/main.c
+ vector_free(curmp);
+ goto out;
+ }
if (conf->remove == FLUSH_ONE) {
if (conf->dev_type == DEV_DEVMAP) {
r = dm_suspend_and_flush_map(conf->dev);
if (conf->remove == FLUSH_ONE) {
if (conf->dev_type == DEV_DEVMAP) {
r = dm_suspend_and_flush_map(conf->dev);
Index: multipath-tools-130222/multipath/multipath.8
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.8

23
SOURCES/0025-UPBZ-916668_add_maj_min.patch

@ -7,22 +7,23 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,22 +7,23 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -537,7 +537,8 @@ rescan:
goto fail_map;

if (retries >= 0) {
goto fail_map;
if (retries >= 0) {
- condlog(2, "%s path added to devmap %s", pp->dev, mpp->alias);
+ condlog(2, "%s [%s]: path added to devmap %s",
+ pp->dev, pp->dev_t, mpp->alias);
return 0;
}
else
return 0;
}
else
@@ -642,8 +643,8 @@ ev_remove_path (struct path *pp, struct
}
sync_map_state(mpp);

}
sync_map_state(mpp);
- condlog(2, "%s: path removed from map %s",
- pp->dev, mpp->alias);
+ condlog(2, "%s [%s]: path removed from map %s",
+ pp->dev, pp->dev_t, mpp->alias);
}
}
}
}

14
SOURCES/0026-fix-checker-time.patch

@ -7,17 +7,17 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,17 +7,17 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -1226,11 +1226,10 @@ check_path (struct vectors * vecs, struc
pp->checkint = 2 * pp->checkint;
else
pp->checkint = conf->max_checkint;
pp->checkint = 2 * pp->checkint;
else
pp->checkint = conf->max_checkint;
-
- pp->tick = pp->checkint;
- condlog(4, "%s: delay next check %is",
- pp->dev_t, pp->tick);
}
}
+ pp->tick = pp->checkint;
+ condlog(4, "%s: delay next check %is",
+ pp->dev_t, pp->tick);
}
}
else if (newstate == PATH_DOWN) {
}
}
else if (newstate == PATH_DOWN) {

6
SOURCES/0027-RH-get-wwid.patch

@ -12,6 +12,6 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c @@ -12,6 +12,6 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c
{
- if (mpp->wwid)
+ if (strlen(mpp->wwid))
return;

dm_get_uuid(mpp->alias, mpp->wwid);
return;
dm_get_uuid(mpp->alias, mpp->wwid);

32
SOURCES/0028-RHBZ-929078-refresh-udev-dev.patch

@ -8,14 +8,14 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -8,14 +8,14 @@ Index: multipath-tools-130222/libmultipath/discovery.c
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -1034,7 +1034,7 @@ pathinfo (struct path *pp, vector hwtabl
}
}

}
}
- if (path_state == PATH_UP && (mask & DI_WWID) && !strlen(pp->wwid))
+ if ((mask & DI_WWID) && !strlen(pp->wwid))
get_uid(pp);
if (mask & DI_BLACKLIST && mask & DI_WWID) {
if (filter_wwid(conf->blist_wwid, conf->elist_wwid,
get_uid(pp);
if (mask & DI_BLACKLIST && mask & DI_WWID) {
if (filter_wwid(conf->blist_wwid, conf->elist_wwid,
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
@ -23,16 +23,16 @@ Index: multipath-tools-130222/multipathd/main.c @@ -23,16 +23,16 @@ Index: multipath-tools-130222/multipathd/main.c
@@ -376,7 +376,7 @@ static int
uev_add_path (struct uevent *uev, struct vectors * vecs)
{
struct path *pp;
struct path *pp;
- int ret;
+ int ret, i;

condlog(2, "%s: add path (uevent)", uev->kernel);
if (strstr(uev->kernel, "..") != NULL) {
condlog(2, "%s: add path (uevent)", uev->kernel);
if (strstr(uev->kernel, "..") != NULL) {
@@ -393,6 +393,23 @@ uev_add_path (struct uevent *uev, struct
uev->kernel);
if (pp->mpp)
return 0;
uev->kernel);
if (pp->mpp)
return 0;
+ if (!strlen(pp->wwid)) {
+ udev_device_unref(pp->udev);
+ pp->udev = udev_device_ref(uev->udev);
@ -50,6 +50,6 @@ Index: multipath-tools-130222/multipathd/main.c @@ -50,6 +50,6 @@ Index: multipath-tools-130222/multipathd/main.c
+ return 1;
+ }
+ }
} else {
/*
* get path vital state
} else {
/*
* get path vital state

10
SOURCES/0029-RH-no-prio-put-msg.patch

@ -7,14 +7,14 @@ Index: multipath-tools-130222/libmultipath/prio.c @@ -7,14 +7,14 @@ Index: multipath-tools-130222/libmultipath/prio.c
--- multipath-tools-130222.orig/libmultipath/prio.c
+++ multipath-tools-130222/libmultipath/prio.c
@@ -162,7 +162,10 @@ void prio_put (struct prio * dst)
if (!dst)
return;

if (!dst)
return;
- src = prio_lookup(dst->name);
+ if (!strlen(dst->name))
+ src = NULL;
+ else
+ src = prio_lookup(dst->name);
memset(dst, 0x0, sizeof(struct prio));
free_prio(src);
memset(dst, 0x0, sizeof(struct prio));
free_prio(src);
}

122
SOURCES/0030-RHBZ-916528-override-queue-no-daemon.patch

@ -14,32 +14,32 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -14,32 +14,32 @@ Index: multipath-tools-130222/libmultipath/dict.c
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -438,14 +438,11 @@ def_queue_without_daemon(vector strvec)
if (!buff)
return 1;

if (!buff)
return 1;
- if (!strncmp(buff, "off", 3) || !strncmp(buff, "no", 2) ||
- !strncmp(buff, "0", 1))
- conf->queue_without_daemon = QUE_NO_DAEMON_OFF;
- else if (!strncmp(buff, "on", 2) || !strncmp(buff, "yes", 3) ||
+ if (!strncmp(buff, "on", 2) || !strncmp(buff, "yes", 3) ||
!strncmp(buff, "1", 1))
conf->queue_without_daemon = QUE_NO_DAEMON_ON;
else
!strncmp(buff, "1", 1))
conf->queue_without_daemon = QUE_NO_DAEMON_ON;
else
- conf->queue_without_daemon = QUE_NO_DAEMON_UNDEF;
+ conf->queue_without_daemon = QUE_NO_DAEMON_OFF;

free(buff);
return 0;
free(buff);
return 0;
@@ -2670,8 +2667,9 @@ snprint_def_queue_without_daemon (char *
case QUE_NO_DAEMON_OFF:
return snprintf(buff, len, "\"no\"");
case QUE_NO_DAEMON_ON:
case QUE_NO_DAEMON_OFF:
return snprintf(buff, len, "\"no\"");
case QUE_NO_DAEMON_ON:
- case QUE_NO_DAEMON_UNDEF:
return snprintf(buff, len, "\"yes\"");
return snprintf(buff, len, "\"yes\"");
+ case QUE_NO_DAEMON_FORCE:
+ return snprintf(buff, len, "\"forced\"");
}
return 0;
}
return 0;
}
Index: multipath-tools-130222/libmultipath/structs.h
===================================================================
@ -47,48 +47,48 @@ Index: multipath-tools-130222/libmultipath/structs.h @@ -47,48 +47,48 @@ Index: multipath-tools-130222/libmultipath/structs.h
+++ multipath-tools-130222/libmultipath/structs.h
@@ -67,9 +67,9 @@ enum pgstates {
};

enum queue_without_daemon_states {
- QUE_NO_DAEMON_UNDEF,
QUE_NO_DAEMON_OFF,
QUE_NO_DAEMON_ON,
QUE_NO_DAEMON_OFF,
QUE_NO_DAEMON_ON,
+ QUE_NO_DAEMON_FORCE,
};

enum pgtimeouts {
Index: multipath-tools-130222/multipathd/cli.c
===================================================================
--- multipath-tools-130222.orig/multipathd/cli.c
+++ multipath-tools-130222/multipathd/cli.c
@@ -162,6 +162,7 @@ load_keys (void)
r += add_key(keys, "resize", RESIZE, 0);
r += add_key(keys, "reset", RESET, 0);
r += add_key(keys, "reload", RELOAD, 0);
r += add_key(keys, "resize", RESIZE, 0);
r += add_key(keys, "reset", RESET, 0);
r += add_key(keys, "reload", RELOAD, 0);
+ r += add_key(keys, "forcequeueing", FORCEQ, 0);
r += add_key(keys, "disablequeueing", DISABLEQ, 0);
r += add_key(keys, "restorequeueing", RESTOREQ, 0);
r += add_key(keys, "paths", PATHS, 0);
r += add_key(keys, "disablequeueing", DISABLEQ, 0);
r += add_key(keys, "restorequeueing", RESTOREQ, 0);
r += add_key(keys, "paths", PATHS, 0);
@@ -459,6 +460,8 @@ cli_init (void) {
add_handler(GETPRSTATUS+MAP, NULL);
add_handler(SETPRSTATUS+MAP, NULL);
add_handler(UNSETPRSTATUS+MAP, NULL);
add_handler(GETPRSTATUS+MAP, NULL);
add_handler(SETPRSTATUS+MAP, NULL);
add_handler(UNSETPRSTATUS+MAP, NULL);
+ add_handler(FORCEQ+DAEMON, NULL);
+ add_handler(RESTOREQ+DAEMON, NULL);

return 0;
return 0;
}
Index: multipath-tools-130222/multipathd/cli.h
===================================================================
--- multipath-tools-130222.orig/multipathd/cli.h
+++ multipath-tools-130222/multipathd/cli.h
@@ -10,6 +10,7 @@ enum {
__RESIZE,
__RESET,
__RELOAD,
__RESIZE,
__RESET,
__RELOAD,
+ __FORCEQ,
__DISABLEQ,
__RESTOREQ,
__PATHS,
__DISABLEQ,
__RESTOREQ,
__PATHS,
@@ -45,6 +46,7 @@ enum {
#define RESIZE (1 << __RESIZE)
#define RESET (1 << __RESET)
@ -103,7 +103,7 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c @@ -103,7 +103,7 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c
+++ multipath-tools-130222/multipathd/cli_handlers.c
@@ -628,6 +628,24 @@ cli_resize(void *v, char **reply, int *l
}

int
+cli_force_no_daemon_q(void * v, char ** reply, int * len, void * data)
+{
@ -125,7 +125,7 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c @@ -125,7 +125,7 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c
+int
cli_restore_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
struct vectors * vecs = (struct vectors *)data;
Index: multipath-tools-130222/multipathd/cli_handlers.h
===================================================================
--- multipath-tools-130222.orig/multipathd/cli_handlers.h
@ -144,57 +144,57 @@ Index: multipath-tools-130222/multipathd/main.c @@ -144,57 +144,57 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -904,6 +904,8 @@ uxlsnrloop (void * ap)
set_handler_callback(GETPRSTATUS+MAP, cli_getprstatus);
set_handler_callback(SETPRSTATUS+MAP, cli_setprstatus);
set_handler_callback(UNSETPRSTATUS+MAP, cli_unsetprstatus);
set_handler_callback(GETPRSTATUS+MAP, cli_getprstatus);
set_handler_callback(SETPRSTATUS+MAP, cli_setprstatus);
set_handler_callback(UNSETPRSTATUS+MAP, cli_unsetprstatus);
+ set_handler_callback(FORCEQ+DAEMON, cli_force_no_daemon_q);
+ set_handler_callback(RESTOREQ+DAEMON, cli_restore_no_daemon_q);

umask(077);
uxsock_listen(&uxsock_trigger, ap);
umask(077);
uxsock_listen(&uxsock_trigger, ap);
Index: multipath-tools-130222/multipathd/multipathd.init.redhat
===================================================================
--- multipath-tools-130222.orig/multipathd/multipathd.init.redhat
+++ multipath-tools-130222/multipathd/multipathd.init.redhat
@@ -81,23 +81,28 @@ force_stop() {
echo
echo
}

-stop() {
+check_root() {
root_dev=$(awk '{ if ($1 !~ /^[ \t]*#/ && $2 == "/") { print $1; }}' /etc/mtab)
dm_num=`dmsetup info -c --noheadings -o minor $root_dev 2> /dev/null`
if [ $? -eq 0 ]; then
root_dm_device="dm-$dm_num"
[ -d $syspath/$root_dm_device ] && teardown_slaves $syspath/$root_dm_device
fi
dm_num=`dmsetup info -c --noheadings -o minor $root_dev 2> /dev/null`
if [ $? -eq 0 ]; then
root_dm_device="dm-$dm_num"
[ -d $syspath/$root_dm_device ] && teardown_slaves $syspath/$root_dm_device
fi
+}

- force_stop
+force_queue_without_daemon() {
+ $DAEMON forcequeueing daemon
}

restart() {
- stop
+ force_queue_without_daemon
+ check_root
+ force_stop
start
start
}

force_restart() {
+ force_queue_without_daemon
force_stop
start
force_stop
start
}
@@ -115,7 +120,8 @@ start)
start
;;
start
;;
stop)
- stop
+ check_root
+ force_stop
;;
;;
force-stop)
force_stop
force_stop

12
SOURCES/0031-RHBZ-957188-kpartx-use-dm-name.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/kpartx/kpartx.c
--- multipath-tools-130222.orig/kpartx/kpartx.c
+++ multipath-tools-130222/kpartx/kpartx.c
@@ -348,7 +348,7 @@ main(int argc, char **argv){
if (delim == NULL) {
delim = malloc(DELIM_SIZE);
memset(delim, 0, DELIM_SIZE);
if (delim == NULL) {
delim = malloc(DELIM_SIZE);
memset(delim, 0, DELIM_SIZE);
- set_delimiter(device, delim);
+ set_delimiter(mapname, delim);
}

fd = open(device, O_RDONLY);
}
fd = open(device, O_RDONLY);

12
SOURCES/0032-RHBZ-956464-mpathconf-defaults.patch

@ -7,13 +7,13 @@ Index: multipath-tools-130222/multipath/mpathconf @@ -7,13 +7,13 @@ Index: multipath-tools-130222/multipath/mpathconf
--- multipath-tools-130222.orig/multipath/mpathconf
+++ multipath-tools-130222/multipath/mpathconf
@@ -31,8 +31,8 @@ function usage
echo "Commands:"
echo "Enable: --enable "
echo "Disable: --disable"
echo "Commands:"
echo "Enable: --enable "
echo "Disable: --disable"
- echo "Set user_friendly_names (Default n): --user_friendly_names <y|n>"
- echo "Set find_multipaths (Default n): --find_multipaths <y|n>"
+ echo "Set user_friendly_names (Default y): --user_friendly_names <y|n>"
+ echo "Set find_multipaths (Default y): --find_multipaths <y|n>"
echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>"
echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>"
echo ""
echo "Load the dm-multipath modules on enable (Default y): --with_module <y|n>"
echo "start/stop/reload multipathd (Default n): --with_multipathd <y|n>"
echo ""

32
SOURCES/0033-RHBZ-829963-e-series-conf.patch

@ -13,32 +13,32 @@ Index: multipath-tools-130222/libmultipath/hwtable.c @@ -13,32 +13,32 @@ Index: multipath-tools-130222/libmultipath/hwtable.c
--- multipath-tools-130222.orig/libmultipath/hwtable.c
+++ multipath-tools-130222/libmultipath/hwtable.c
@@ -1046,9 +1046,13 @@ static struct hwentry default_hw[] = {
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
},
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
},
- /* LSI/Engenio/NetApp E-Series RDAC storage */
+ /* LSI/Engenio/NetApp E-Series RDAC storage
+ *
+ * Maintainer : Sean Stewart
+ * Mail : sean.stewart@netapp.com
+ */
{
{
- .vendor = "(LSI|ENGENIO)",
+ .vendor = "(NETAPP|LSI|ENGENIO)",
.product = "INF-01-00",
.bl_product = "Universal Xport",
.features = "2 pg_init_retries 50",
.product = "INF-01-00",
.bl_product = "Universal Xport",
.features = "2 pg_init_retries 50",
@@ -1056,10 +1060,12 @@ static struct hwentry default_hw[] = {
.pgpolicy = GROUP_BY_PRIO,
.pgfailback = -FAILBACK_IMMEDIATE,
.rr_weight = RR_WEIGHT_NONE,
.pgpolicy = GROUP_BY_PRIO,
.pgfailback = -FAILBACK_IMMEDIATE,
.rr_weight = RR_WEIGHT_NONE,
- .no_path_retry = 15,
+ .no_path_retry = 30,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
.checker_name = RDAC,
.prio_name = PRIO_RDAC,
.prio_args = NULL,
+ .detect_prio = DETECT_PRIO_ON,
+ .retain_hwhandler = RETAIN_HWHANDLER_ON,
},
{
.vendor = "STK",
},
{
.vendor = "STK",

30
SOURCES/0034-RHBZ-851416-mpathconf-display.patch

@ -8,17 +8,17 @@ Index: multipath-tools-130222/multipath/mpathconf @@ -8,17 +8,17 @@ Index: multipath-tools-130222/multipath/mpathconf
+++ multipath-tools-130222/multipath/mpathconf
@@ -159,7 +159,7 @@ if [ -z "$MODULE" -o "$MODULE" = "y" ];
fi

if [ "$MULTIPATHD" = "y" ]; then
- if service multipathd status > /dev/null ; then
+ if /bin/systemctl status multipathd.service > /dev/null 2>&1 ; then
HAVE_MULTIPATHD=1
else
HAVE_MULTIPATHD=0
HAVE_MULTIPATHD=1
else
HAVE_MULTIPATHD=0
@@ -210,8 +210,17 @@ if [ -n "$SHOW_STATUS" ]; then
echo "dm_multipath module is not loaded"
fi
fi
echo "dm_multipath module is not loaded"
fi
fi
- if [ -n "$HAVE_MULTIPATHD" ]; then
- service multipathd status
+ if [ -z "$HAVE_MULTIPATHD" ]; then
@ -32,21 +32,21 @@ Index: multipath-tools-130222/multipath/mpathconf @@ -32,21 +32,21 @@ Index: multipath-tools-130222/multipath/mpathconf
+ echo "multipathd is running"
+ else
+ echo "multipathd is not running"
fi
exit 0
fi
exit 0
fi
@@ -301,12 +310,12 @@ if [ "$ENABLE" = 1 ]; then
modprobe dm_multipath
fi
if [ "$HAVE_MULTIPATHD" = 0 ]; then
modprobe dm_multipath
fi
if [ "$HAVE_MULTIPATHD" = 0 ]; then
- service multipathd start
+ systemctl start multipathd.service
fi
fi
elif [ "$ENABLE" = 0 ]; then
if [ "$HAVE_MULTIPATHD" = 1 ]; then
if [ "$HAVE_MULTIPATHD" = 1 ]; then
- service multipathd stop
+ systemctl stop multipathd.service
fi
fi
elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then
- service multipathd reload
+ systemctl reload multipathd.service

13
SOURCES/0035-RHBZ-891921-list-mpp.patch

@ -8,7 +8,7 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -8,7 +8,7 @@ Index: multipath-tools-130222/libmultipath/print.c
+++ multipath-tools-130222/libmultipath/print.c
@@ -422,6 +422,16 @@ snprint_path_serial (char * buff, size_t
}

static int
+snprint_path_mpp (char * buff, size_t len, struct path * pp)
+{
@ -22,11 +22,12 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -22,11 +22,12 @@ Index: multipath-tools-130222/libmultipath/print.c
+static int
snprint_path_checker (char * buff, size_t len, struct path * pp)
{
struct checker * c = &pp->checker;
struct checker * c = &pp->checker;
@@ -464,6 +474,7 @@ struct path_data pd[] = {
{'p', "pri", 0, snprint_pri},
{'S', "size", 0, snprint_path_size},
{'z', "serial", 0, snprint_path_serial},
{'p', "pri", 0, snprint_pri},
{'S', "size", 0, snprint_path_size},
{'z', "serial", 0, snprint_path_serial},
+ {'m', "multipath", 0, snprint_path_mpp},
{0, NULL, 0 , NULL}
{0, NULL, 0 , NULL}
};

15
SOURCES/0037-RHBZ-768873-fix-rename.patch

@ -9,9 +9,9 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -9,9 +9,9 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -917,51 +917,6 @@ out:
return r;
return r;
}

-extern char *
-dm_get_name(char *uuid)
-{
@ -77,10 +77,11 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -77,10 +77,11 @@ Index: multipath-tools-130222/libmultipath/propsel.c
--- multipath-tools-130222.orig/libmultipath/propsel.c
+++ multipath-tools-130222/libmultipath/propsel.c
@@ -263,8 +263,6 @@ select_alias (struct multipath * mp)
conf->bindings_file, mp->alias_prefix, conf->bindings_read_only);
}
if (mp->alias == NULL)
conf->bindings_file, mp->alias_prefix, conf->bindings_read_only);
}
if (mp->alias == NULL)
- mp->alias = dm_get_name(mp->wwid);
- if (mp->alias == NULL)
mp->alias = STRDUP(mp->wwid);
}
mp->alias = STRDUP(mp->wwid);
}

12
SOURCES/0038-RHBZ-799860-netapp-config.patch

@ -7,10 +7,10 @@ Index: multipath-tools-130222/libmultipath/hwtable.c @@ -7,10 +7,10 @@ Index: multipath-tools-130222/libmultipath/hwtable.c
--- multipath-tools-130222.orig/libmultipath/hwtable.c
+++ multipath-tools-130222/libmultipath/hwtable.c
@@ -794,6 +794,7 @@ static struct hwentry default_hw[] = {
.prio_name = PRIO_ONTAP,
.prio_args = NULL,
.retain_hwhandler = RETAIN_HWHANDLER_ON,
.prio_name = PRIO_ONTAP,
.prio_args = NULL,
.retain_hwhandler = RETAIN_HWHANDLER_ON,
+ .user_friendly_names = USER_FRIENDLY_NAMES_OFF,
.detect_prio = DETECT_PRIO_ON,
},
/*
.detect_prio = DETECT_PRIO_ON,
},
/*

6
SOURCES/0039-RH-detect-prio-fix.patch

@ -11,8 +11,8 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -11,8 +11,8 @@ Index: multipath-tools-130222/libmultipath/propsel.c
detect_prio(struct path * pp)
{
+ int ret;
struct prio *p = &pp->prio;

struct prio *p = &pp->prio;
- if (get_target_port_group_support(pp->fd) > 0)
- prio_get(p, PRIO_ALUA, DEFAULT_PRIO_ARGS);
+ if (get_target_port_group_support(pp->fd) <= 0)
@ -24,5 +24,5 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -24,5 +24,5 @@ Index: multipath-tools-130222/libmultipath/propsel.c
+ return;
+ prio_get(p, PRIO_ALUA, DEFAULT_PRIO_ARGS);
}

extern int

92
SOURCES/0040-RH-bindings-fix.patch

@ -7,58 +7,58 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -7,58 +7,58 @@ Index: multipath-tools-130222/libmultipath/alias.c
--- multipath-tools-130222.orig/libmultipath/alias.c
+++ multipath-tools-130222/libmultipath/alias.c
@@ -46,11 +46,11 @@ format_devname(char *name, int id, int l
memset(name,0, len);
strcpy(name, prefix);
for (pos = len - 1; pos >= prefix_len; pos--) {
memset(name,0, len);
strcpy(name, prefix);
for (pos = len - 1; pos >= prefix_len; pos--) {
+ id--;
name[pos] = 'a' + id % 26;
if (id < 26)
break;
id /= 26;
name[pos] = 'a' + id % 26;
if (id < 26)
break;
id /= 26;
- id--;
}
memmove(name + prefix_len, name + pos, len - pos);
name[prefix_len + len - pos] = '\0';
}
memmove(name + prefix_len, name + pos, len - pos);
name[prefix_len + len - pos] = '\0';
@@ -66,13 +66,22 @@ scan_devname(char *alias, char *prefix)
if (!prefix || strncmp(alias, prefix, strlen(prefix)))
return -1;

if (!prefix || strncmp(alias, prefix, strlen(prefix)))
return -1;
+ if (strlen(alias) == strlen(prefix))
+ return -1;
+ return -1;
+
+ if (strlen(alias) > strlen(prefix) + 7)
+ /* id of 'aaaaaaaa' overflows int */
+ return -1;
+
c = alias + strlen(prefix);
while (*c != '\0' && *c != ' ' && *c != '\t') {
c = alias + strlen(prefix);
while (*c != '\0' && *c != ' ' && *c != '\t') {
+ if (*c < 'a' || *c > 'z')
+ return -1;
i = *c - 'a';
n = ( n * 26 ) + i;
i = *c - 'a';
n = ( n * 26 ) + i;
+ if (n < 0)
+ return -1;
c++;
c++;
- if (*c < 'a' || *c > 'z')
- break;
n++;
}

n++;
}
@@ -84,7 +93,9 @@ lookup_binding(FILE *f, char *map_wwid,
{
char buf[LINE_MAX];
unsigned int line_nr = 0;
char buf[LINE_MAX];
unsigned int line_nr = 0;
- int id = 0;
+ int id = 1;
+ int biggest_id = 1;
+ int smallest_bigger_id = INT_MAX;

*map_alias = NULL;

*map_alias = NULL;
@@ -100,8 +111,12 @@ lookup_binding(FILE *f, char *map_wwid,
if (!alias) /* blank line */
continue;
curr_id = scan_devname(alias, prefix);
if (!alias) /* blank line */
continue;
curr_id = scan_devname(alias, prefix);
- if (curr_id >= id)
- id = curr_id + 1;
+ if (curr_id == id)
@ -67,18 +67,18 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -67,18 +67,18 @@ Index: multipath-tools-130222/libmultipath/alias.c
+ biggest_id = curr_id;
+ if (curr_id > id && curr_id < smallest_bigger_id)
+ smallest_bigger_id = curr_id;
wwid = strtok(NULL, " \t");
if (!wwid){
condlog(3,
wwid = strtok(NULL, " \t");
if (!wwid){
condlog(3,
@@ -116,11 +131,17 @@ lookup_binding(FILE *f, char *map_wwid,
if (*map_alias == NULL)
condlog(0, "Cannot copy alias from bindings "
"file : %s", strerror(errno));
if (*map_alias == NULL)
condlog(0, "Cannot copy alias from bindings "
"file : %s", strerror(errno));
- return id;
+ return 0;
}
}
condlog(3, "No matching wwid [%s] in bindings file.", map_wwid);
}
}
condlog(3, "No matching wwid [%s] in bindings file.", map_wwid);
- return id;
+ if (id < 0) {
+ condlog(0, "no more available user_friendly_names");
@ -88,14 +88,14 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -88,14 +88,14 @@ Index: multipath-tools-130222/libmultipath/alias.c
+ return id;
+ return biggest_id + 1;
}

static int
@@ -254,7 +275,7 @@ get_user_friendly_alias(char *wwid, char
return NULL;
}

return NULL;
}
- if (!alias && can_write && !bindings_read_only)
+ if (!alias && can_write && !bindings_read_only && id)
alias = allocate_binding(fd, wwid, id, prefix);

fclose(f);
alias = allocate_binding(fd, wwid, id, prefix);
fclose(f);

48
SOURCES/0041-RH-check-for-erofs.patch

@ -9,38 +9,38 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -9,38 +9,38 @@ Index: multipath-tools-130222/libmultipath/configure.c
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -384,24 +384,17 @@ domap (struct multipath * mpp, char * pa

r = dm_addmap_create(mpp, params);

r = dm_addmap_create(mpp, params);
- if (!r)
- r = dm_addmap_create_ro(mpp, params);
-
lock_multipath(mpp, 0);
break;

case ACT_RELOAD:
r = dm_addmap_reload(mpp, params);
lock_multipath(mpp, 0);
break;
case ACT_RELOAD:
r = dm_addmap_reload(mpp, params);
- if (!r)
- r = dm_addmap_reload_ro(mpp, params);
if (r)
r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias);
break;

case ACT_RESIZE:
r = dm_addmap_reload(mpp, params);
if (r)
r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias);
break;
case ACT_RESIZE:
r = dm_addmap_reload(mpp, params);
- if (!r)
- r = dm_addmap_reload_ro(mpp, params);
if (r)
r = dm_simplecmd_flush(DM_DEVICE_RESUME, mpp->alias, 1);
break;
if (r)
r = dm_simplecmd_flush(DM_DEVICE_RESUME, mpp->alias, 1);
break;
Index: multipath-tools-130222/libmultipath/devmapper.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -298,42 +298,39 @@ dm_addmap (int task, const char *target,
return r;
return r;
}

-static int
-_dm_addmap_create (struct multipath *mpp, char * params, int ro) {
- int r;
@ -73,14 +73,14 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -73,14 +73,14 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ }
+ if (err != EROFS)
+ break;
}
}
- return r;
+ return 0;
}

#define ADDMAP_RW 0
#define ADDMAP_RO 1

extern int
-dm_addmap_create (struct multipath *mpp, char *params) {
- return _dm_addmap_create(mpp, params, ADDMAP_RW);
@ -102,9 +102,9 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -102,9 +102,9 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ return 1;
+ if (errno != EROFS)
+ return 0;
return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, ADDMAP_RO);
return dm_addmap(DM_DEVICE_RELOAD, TGT_MPATH, mpp, params, 0, ADDMAP_RO);
}

Index: multipath-tools-130222/libmultipath/devmapper.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.h

299
SOURCES/0042-UP-fix-signal-handling.patch

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
---
libmultipath/file.c | 4 +-
libmultipath/lock.c | 9 ----
libmultipath/lock.h | 1
libmultipath/lock.h | 1
libmultipath/log_pthread.c | 22 -----------
libmultipath/waiter.c | 2 -
multipathd/cli_handlers.c | 4 +-
@ -16,22 +16,22 @@ Index: multipath-tools-130222/libmultipath/file.c @@ -16,22 +16,22 @@ Index: multipath-tools-130222/libmultipath/file.c
--- multipath-tools-130222.orig/libmultipath/file.c
+++ multipath-tools-130222/libmultipath/file.c
@@ -98,7 +98,7 @@ lock_file(int fd, char *file_name)
sigaddset(&set, SIGALRM);

sigaction(SIGALRM, &act, &oldact);
sigaddset(&set, SIGALRM);
sigaction(SIGALRM, &act, &oldact);
- sigprocmask(SIG_UNBLOCK, &set, &oldset);
+ pthread_sigmask(SIG_UNBLOCK, &set, &oldset);

alarm(FILE_TIMEOUT);
err = fcntl(fd, F_SETLKW, &lock);
alarm(FILE_TIMEOUT);
err = fcntl(fd, F_SETLKW, &lock);
@@ -112,7 +112,7 @@ lock_file(int fd, char *file_name)
condlog(0, "%s is locked. Giving up.", file_name);
}

condlog(0, "%s is locked. Giving up.", file_name);
}
- sigprocmask(SIG_SETMASK, &oldset, NULL);
+ pthread_sigmask(SIG_SETMASK, &oldset, NULL);
sigaction(SIGALRM, &oldact, NULL);
return err;
sigaction(SIGALRM, &oldact, NULL);
return err;
}
Index: multipath-tools-130222/libmultipath/lock.c
===================================================================
@ -42,7 +42,7 @@ Index: multipath-tools-130222/libmultipath/lock.c @@ -42,7 +42,7 @@ Index: multipath-tools-130222/libmultipath/lock.c
-#include <signal.h>
#include "lock.h"
#include <stdio.h>

-void block_signal (int signum, sigset_t *old)
-{
- sigset_t set;
@ -53,26 +53,26 @@ Index: multipath-tools-130222/libmultipath/lock.c @@ -53,26 +53,26 @@ Index: multipath-tools-130222/libmultipath/lock.c
-
void cleanup_lock (void * data)
{
unlock ((*(struct mutex_lock *)data));
unlock ((*(struct mutex_lock *)data));
Index: multipath-tools-130222/libmultipath/lock.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/lock.h
+++ multipath-tools-130222/libmultipath/lock.h
@@ -29,6 +29,5 @@ struct mutex_lock {
#endif

void cleanup_lock (void * data);
-void block_signal(int signum, sigset_t *old);

#endif /* _LOCK_H */
Index: multipath-tools-130222/libmultipath/log_pthread.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/log_pthread.c
+++ multipath-tools-130222/libmultipath/log_pthread.c
@@ -22,26 +22,13 @@ pthread_cond_t logev_cond;

int logq_running;

-static void
-sigusr1 (int sig)
-{
@ -85,55 +85,55 @@ Index: multipath-tools-130222/libmultipath/log_pthread.c @@ -85,55 +85,55 @@ Index: multipath-tools-130222/libmultipath/log_pthread.c
{
- sigset_t old;
-
if (log_thr == (pthread_t)0) {
syslog(prio, fmt, ap);
return;
}

if (log_thr == (pthread_t)0) {
syslog(prio, fmt, ap);
return;
}
- block_signal(SIGUSR1, &old);
- block_signal(SIGHUP, NULL);
-
pthread_mutex_lock(&logq_lock);
log_enqueue(prio, fmt, ap);
pthread_mutex_unlock(&logq_lock);
pthread_mutex_lock(&logq_lock);
log_enqueue(prio, fmt, ap);
pthread_mutex_unlock(&logq_lock);
@@ -49,8 +36,6 @@ void log_safe (int prio, const char * fm
pthread_mutex_lock(&logev_lock);
pthread_cond_signal(&logev_cond);
pthread_mutex_unlock(&logev_lock);
pthread_mutex_lock(&logev_lock);
pthread_cond_signal(&logev_cond);
pthread_mutex_unlock(&logev_lock);
-
- pthread_sigmask(SIG_SETMASK, &old, NULL);
}

void log_thread_flush (void)
@@ -81,15 +66,8 @@ static void flush_logqueue (void)

static void * log_thread (void * et)
{
- struct sigaction sig;
int running;

int running;
- sig.sa_handler = sigusr1;
- sigemptyset(&sig.sa_mask);
- sig.sa_flags = 0;
- if (sigaction(SIGUSR1, &sig, NULL) < 0)
- logdbg(stderr, "Cannot set signal handler");
-
pthread_mutex_lock(&logev_lock);
logq_running = 1;
pthread_mutex_unlock(&logev_lock);
pthread_mutex_lock(&logev_lock);
logq_running = 1;
pthread_mutex_unlock(&logev_lock);
Index: multipath-tools-130222/libmultipath/waiter.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/waiter.c
+++ multipath-tools-130222/libmultipath/waiter.c
@@ -157,8 +157,6 @@ void *waitevent (void *et)
waiter = (struct event_thread *)et;
pthread_cleanup_push(free_waiter, et);

waiter = (struct event_thread *)et;
pthread_cleanup_push(free_waiter, et);
- block_signal(SIGUSR1, NULL);
- block_signal(SIGHUP, NULL);
while (1) {
r = waiteventloop(waiter);

while (1) {
r = waiteventloop(waiter);
Index: multipath-tools-130222/multipathd/cli_handlers.c
===================================================================
--- multipath-tools-130222.orig/multipathd/cli_handlers.c
@ -141,13 +141,13 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c @@ -141,13 +141,13 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c
@@ -939,8 +939,8 @@ int
cli_shutdown (void * v, char ** reply, int * len, void * data)
{
condlog(3, "shutdown (operator)");
condlog(3, "shutdown (operator)");
-
- return exit_daemon(0);
+ exit_daemon();
+ return 0;
}

int
Index: multipath-tools-130222/multipathd/main.c
===================================================================
@ -159,27 +159,27 @@ Index: multipath-tools-130222/multipathd/main.c @@ -159,27 +159,27 @@ Index: multipath-tools-130222/multipathd/main.c
#include <libudev.h>
+#include <semaphore.h>
#include <mpath_persist.h>

/*
@@ -52,6 +53,7 @@
#include <wwids.h>
#include <pgpolicies.h>
#include <uevent.h>
+#include <log.h>

#include "main.h"
#include "pidfile.h"
@@ -81,13 +83,11 @@ struct mpath_event_param

unsigned int mpath_mx_alloc_len;

-pthread_cond_t exit_cond = PTHREAD_COND_INITIALIZER;
-pthread_mutex_t exit_mutex = PTHREAD_MUTEX_INITIALIZER;
-
int logsink;
enum daemon_status running_state;
pid_t daemon_pid;

+static sem_t exit_sem;
/*
* global copy of vecs for use in sig handlers
@ -191,9 +191,9 @@ Index: multipath-tools-130222/multipathd/main.c @@ -191,9 +191,9 @@ Index: multipath-tools-130222/multipathd/main.c
- block_signal(SIGUSR1, NULL);
- block_signal(SIGHUP, NULL);
-
if (uevent_listen())
condlog(0, "error starting uevent listener");

if (uevent_listen())
condlog(0, "error starting uevent listener");
@@ -850,9 +847,6 @@ ueventloop (void * ap)
static void *
uevqloop (void * ap)
@ -201,9 +201,9 @@ Index: multipath-tools-130222/multipathd/main.c @@ -201,9 +201,9 @@ Index: multipath-tools-130222/multipathd/main.c
- block_signal(SIGUSR1, NULL);
- block_signal(SIGHUP, NULL);
-
if (uevent_dispatch(&uev_trigger, ap))
condlog(0, "error starting uevent dispatcher");

if (uevent_dispatch(&uev_trigger, ap))
condlog(0, "error starting uevent dispatcher");
@@ -861,9 +855,6 @@ uevqloop (void * ap)
static void *
uxlsnrloop (void * ap)
@ -211,13 +211,13 @@ Index: multipath-tools-130222/multipathd/main.c @@ -211,13 +211,13 @@ Index: multipath-tools-130222/multipathd/main.c
- block_signal(SIGUSR1, NULL);
- block_signal(SIGHUP, NULL);
-
if (cli_init())
return NULL;

if (cli_init())
return NULL;
@@ -913,18 +904,10 @@ uxlsnrloop (void * ap)
return NULL;
return NULL;
}

-int
-exit_daemon (int status)
+void
@ -234,36 +234,36 @@ Index: multipath-tools-130222/multipathd/main.c @@ -234,36 +234,36 @@ Index: multipath-tools-130222/multipathd/main.c
- return status;
+ sem_post(&exit_sem);
}

const char *
@@ -1287,7 +1270,6 @@ checkerloop (void *ap)
struct path *pp;
int count = 0;
unsigned int i;
struct path *pp;
int count = 0;
unsigned int i;
- sigset_t old;

mlockall(MCL_CURRENT | MCL_FUTURE);
vecs = (struct vectors *)ap;
mlockall(MCL_CURRENT | MCL_FUTURE);
vecs = (struct vectors *)ap;
@@ -1301,7 +1283,6 @@ checkerloop (void *ap)
}

while (1) {
}
while (1) {
- block_signal(SIGHUP, &old);
pthread_cleanup_push(cleanup_lock, &vecs->lock);
lock(vecs->lock);
pthread_testcancel();
pthread_cleanup_push(cleanup_lock, &vecs->lock);
lock(vecs->lock);
pthread_testcancel();
@@ -1325,7 +1306,6 @@ checkerloop (void *ap)
}

lock_cleanup_pop(vecs->lock);
}
lock_cleanup_pop(vecs->lock);
- pthread_sigmask(SIG_SETMASK, &old, NULL);
sleep(1);
}
return NULL;
sleep(1);
}
return NULL;
@@ -1485,36 +1465,56 @@ signal_set(int signo, void (*func) (int)
return (osig.sa_handler);
return (osig.sa_handler);
}

+void
+handle_signals(void)
+{
@ -301,21 +301,21 @@ Index: multipath-tools-130222/multipathd/main.c @@ -301,21 +301,21 @@ Index: multipath-tools-130222/multipathd/main.c
-#endif
+ reconfig_sig = 1;
}

static void
sigend (int sig)
{
- exit_daemon(0);
+ exit_daemon();
}

static void
sigusr1 (int sig)
{
- condlog(3, "SIGUSR1 received");
+ log_reset_sig = 1;
}

static void
signal_init(void)
{
@ -326,65 +326,65 @@ Index: multipath-tools-130222/multipathd/main.c @@ -326,65 +326,65 @@ Index: multipath-tools-130222/multipathd/main.c
+ sigaddset(&set, SIGUSR1);
+ pthread_sigmask(SIG_BLOCK, &set, NULL);
+
signal_set(SIGHUP, sighup);
signal_set(SIGUSR1, sigusr1);
signal_set(SIGINT, sigend);
signal_set(SIGHUP, sighup);
signal_set(SIGUSR1, sigusr1);
signal_set(SIGINT, sigend);
@@ -1587,10 +1587,11 @@ child (void * param)
struct vectors * vecs;
struct multipath * mpp;
int i;
struct vectors * vecs;
struct multipath * mpp;
int i;
- sigset_t set;
int rc, pid_rc;

mlockall(MCL_CURRENT | MCL_FUTURE);
int rc, pid_rc;
mlockall(MCL_CURRENT | MCL_FUTURE);
+ sem_init(&exit_sem, 0, 0);
+ signal_init();

setup_thread_attr(&misc_attr, 64 * 1024, 1);
setup_thread_attr(&waiter_attr, 32 * 1024, 1);
setup_thread_attr(&misc_attr, 64 * 1024, 1);
setup_thread_attr(&waiter_attr, 32 * 1024, 1);
@@ -1650,7 +1651,6 @@ child (void * param)
if (!vecs)
exit(1);

if (!vecs)
exit(1);
- signal_init();
setscheduler();
set_oom_adj();

setscheduler();
set_oom_adj();
@@ -1693,25 +1693,17 @@ child (void * param)
}
pthread_attr_destroy(&misc_attr);

}
pthread_attr_destroy(&misc_attr);
- pthread_mutex_lock(&exit_mutex);
/* Startup complete, create logfile */
pid_rc = pidfile_create(DEFAULT_PIDFILE, daemon_pid);
/* Ignore errors, we can live without */

running_state = DAEMON_RUNNING;
/* Startup complete, create logfile */
pid_rc = pidfile_create(DEFAULT_PIDFILE, daemon_pid);
/* Ignore errors, we can live without */
running_state = DAEMON_RUNNING;
- pthread_cond_wait(&exit_cond, &exit_mutex);
- /* Need to block these to avoid deadlocking */
- sigemptyset(&set);
- sigaddset(&set, SIGTERM);
- sigaddset(&set, SIGINT);
- pthread_sigmask(SIG_BLOCK, &set, NULL);

/*
* exit path
*/
/*
* exit path
*/
+ while(sem_wait(&exit_sem) != 0); /* Do nothing */
running_state = DAEMON_SHUTDOWN;
running_state = DAEMON_SHUTDOWN;
- pthread_sigmask(SIG_UNBLOCK, &set, NULL);
- block_signal(SIGHUP, NULL);
lock(vecs->lock);
if (conf->queue_without_daemon == QUE_NO_DAEMON_OFF)
vector_foreach_slot(vecs->mpvec, mpp, i)
lock(vecs->lock);
if (conf->queue_without_daemon == QUE_NO_DAEMON_OFF)
vector_foreach_slot(vecs->mpvec, mpp, i)
Index: multipath-tools-130222/multipathd/main.h
===================================================================
--- multipath-tools-130222.orig/multipathd/main.h
+++ multipath-tools-130222/multipathd/main.h
@@ -16,7 +16,7 @@ struct prin_resp;

extern pid_t daemon_pid;

-int exit_daemon(int);
+void exit_daemon(void);
const char * daemon_status(void);
@ -395,7 +395,7 @@ Index: multipath-tools-130222/multipathd/main.h @@ -395,7 +395,7 @@ Index: multipath-tools-130222/multipathd/main.h
int update_map_pr(struct multipath *mpp);
void * mpath_pr_event_handler_fn (void * pathp );
+void handle_signals(void);

#endif /* MAIN_H */
Index: multipath-tools-130222/multipathd/uxlsnr.c
===================================================================
@ -424,69 +424,70 @@ Index: multipath-tools-130222/multipathd/uxlsnr.c @@ -424,69 +424,70 @@ Index: multipath-tools-130222/multipathd/uxlsnr.c
+#include <structs_vec.h>
#include <uxsock.h>
#include <defaults.h>

+#include "main.h"
#include "cli.h"
#include "uxlsnr.h"

-#define SLEEP_TIME 5000
+struct timespec sleep_time = {5, 0};

struct client {
int fd;
int fd;
@@ -42,6 +44,8 @@ struct client {
static struct client *clients;
static unsigned num_clients;
struct pollfd *polls;
+volatile sig_atomic_t reconfig_sig = 0;
+volatile sig_atomic_t log_reset_sig = 0;

/*
* handle a new client joining
@@ -104,6 +108,7 @@ void * uxsock_listen(int (*uxsock_trigge
int rlen;
char *inbuf;
char *reply;
int rlen;
char *inbuf;
char *reply;
+ sigset_t mask;

ux_sock = ux_socket_listen(DEFAULT_SOCKET);

ux_sock = ux_socket_listen(DEFAULT_SOCKET);
@@ -115,7 +120,9 @@ void * uxsock_listen(int (*uxsock_trigge
pthread_cleanup_push(uxsock_cleanup, NULL);

polls = (struct pollfd *)MALLOC(0);
pthread_cleanup_push(uxsock_cleanup, NULL);
polls = (struct pollfd *)MALLOC(0);
-
+ pthread_sigmask(SIG_SETMASK, NULL, &mask);
+ sigdelset(&mask, SIGHUP);
+ sigdelset(&mask, SIGUSR1);
while (1) {
struct client *c;
int i, poll_count;
while (1) {
struct client *c;
int i, poll_count;
@@ -132,11 +139,13 @@ void * uxsock_listen(int (*uxsock_trigge
}

/* most of our life is spent in this call */
}
/* most of our life is spent in this call */
- poll_count = poll(polls, i, SLEEP_TIME);
+ poll_count = ppoll(polls, i, &sleep_time, &mask);

if (poll_count == -1) {
if (poll_count == -1) {
- if (errno == EINTR)
+ if (errno == EINTR) {
+ handle_signals();
continue;
continue;
+ }

/* something went badly wrong! */
condlog(0, "poll");
/* something went badly wrong! */
condlog(0, "poll");
Index: multipath-tools-130222/multipathd/uxlsnr.h
===================================================================
--- multipath-tools-130222.orig/multipathd/uxlsnr.h
+++ multipath-tools-130222/multipathd/uxlsnr.h
@@ -4,5 +4,8 @@
void * uxsock_listen(int (*uxsock_trigger)
(char *, char **, int *, void *),
void * trigger_data);
(char *, char **, int *, void *),
void * trigger_data);
+
+extern volatile sig_atomic_t reconfig_sig;
+extern volatile sig_atomic_t log_reset_sig;
#endif

54
SOURCES/0043-RH-signal-waiter.patch

@ -8,44 +8,44 @@ Index: multipath-tools-130222/libmultipath/waiter.c @@ -8,44 +8,44 @@ Index: multipath-tools-130222/libmultipath/waiter.c
--- multipath-tools-130222.orig/libmultipath/waiter.c
+++ multipath-tools-130222/libmultipath/waiter.c
@@ -57,6 +57,7 @@ void stop_waiter_thread (struct multipat
thread = mpp->waiter;
mpp->waiter = (pthread_t)0;
pthread_cancel(thread);
thread = mpp->waiter;
mpp->waiter = (pthread_t)0;
pthread_cancel(thread);
+ pthread_kill(thread, SIGUSR2);
}

/*
@@ -65,6 +66,7 @@ void stop_waiter_thread (struct multipat
*/
int waiteventloop (struct event_thread *waiter)
{
+ sigset_t set, oldset;
int event_nr;
int r;

int event_nr;
int r;
@@ -97,8 +99,15 @@ int waiteventloop (struct event_thread *
dm_task_no_open_count(waiter->dmt);

/* wait */
dm_task_no_open_count(waiter->dmt);
/* wait */
+ sigemptyset(&set);
+ sigaddset(&set, SIGUSR2);
+ pthread_sigmask(SIG_UNBLOCK, &set, &oldset);
+
+ pthread_testcancel();
r = dm_task_run(waiter->dmt);
r = dm_task_run(waiter->dmt);
+ pthread_testcancel();

+ pthread_sigmask(SIG_SETMASK, &oldset, NULL);
dm_task_destroy(waiter->dmt);
waiter->dmt = NULL;

dm_task_destroy(waiter->dmt);
waiter->dmt = NULL;
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -1506,6 +1506,12 @@ sigusr1 (int sig)
}

static void
+sigusr2 (int sig)
+{
@ -55,17 +55,17 @@ Index: multipath-tools-130222/multipathd/main.c @@ -55,17 +55,17 @@ Index: multipath-tools-130222/multipathd/main.c
+static void
signal_init(void)
{
sigset_t set;
sigset_t set;
@@ -1513,10 +1519,12 @@ signal_init(void)
sigemptyset(&set);
sigaddset(&set, SIGHUP);
sigaddset(&set, SIGUSR1);
sigemptyset(&set);
sigaddset(&set, SIGHUP);
sigaddset(&set, SIGUSR1);
+ sigaddset(&set, SIGUSR2);
pthread_sigmask(SIG_BLOCK, &set, NULL);

signal_set(SIGHUP, sighup);
signal_set(SIGUSR1, sigusr1);
pthread_sigmask(SIG_BLOCK, &set, NULL);
signal_set(SIGHUP, sighup);
signal_set(SIGUSR1, sigusr1);
+ signal_set(SIGUSR2, sigusr2);
signal_set(SIGINT, sigend);
signal_set(SIGTERM, sigend);
signal(SIGPIPE, SIG_IGN);
signal_set(SIGINT, sigend);
signal_set(SIGTERM, sigend);
signal(SIGPIPE, SIG_IGN);

14
SOURCES/0044-RHBZ-976688-fix-wipe-wwids.patch

@ -11,18 +11,18 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -11,18 +11,18 @@ Index: multipath-tools-130222/libmultipath/wwids.c
#include <limits.h>
#include <stdio.h>
+#include <sys/types.h>

#include "checkers.h"
#include "vector.h"
@@ -100,6 +101,11 @@ replace_wwids(vector mp)
condlog(0, "cannot truncate wwids file : %s", strerror(errno));
goto out_file;
}
condlog(0, "cannot truncate wwids file : %s", strerror(errno));
goto out_file;
}
+ if (lseek(fd, 0, SEEK_SET) < 0) {
+ condlog(0, "cannot seek to the start of the file : %s",
+ strerror(errno));
+ goto out_file;
+ }
len = strlen(WWIDS_FILE_HEADER);
if (write_all(fd, WWIDS_FILE_HEADER, len) != len) {
condlog(0, "Can't write wwid file header : %s",
len = strlen(WWIDS_FILE_HEADER);
if (write_all(fd, WWIDS_FILE_HEADER, len) != len) {
condlog(0, "Can't write wwid file header : %s",

2
SOURCES/0045-RHBZ-977297-man-page-fix.patch

@ -16,7 +16,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5 @@ -16,7 +16,7 @@ Index: multipath-tools-130222/multipath/multipath.conf.5
.TP
.B uid_attribute
@@ -182,7 +182,7 @@ Generate a random priority between 1 and
Generate the path priority based on the regular expression and the
Generate the path priority based on the regular expression and the
priority provided as argument. requires prio_args keyword.
.TP
-Default value is \fBnone\fR.

22
SOURCES/0046-RHBZ-883981-move-udev-rules.patch

@ -7,22 +7,22 @@ Index: multipath-tools-130222/multipath/Makefile @@ -7,22 +7,22 @@ Index: multipath-tools-130222/multipath/Makefile
--- multipath-tools-130222.orig/multipath/Makefile
+++ multipath-tools-130222/multipath/Makefile
@@ -23,8 +23,8 @@ install:
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
- $(INSTALL_PROGRAM) -d $(DESTDIR)/lib/udev/rules.d
- $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
+ $(INSTALL_PROGRAM) -d $(DESTDIR)/usr/lib/udev/rules.d
+ $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/usr/lib/udev/rules.d/62-multipath.rules
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
@@ -32,7 +32,7 @@ install:
$(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(mandir)

$(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(mandir)
uninstall:
- rm $(DESTDIR)/lib/udev/rules.d/62-multipath.rules
+ rm $(DESTDIR)/usr/lib/udev/rules.d/62-multipath.rules
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)$(bindir)/mpathconf
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)$(bindir)/mpathconf
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz

36
SOURCES/0047-RHBZ-kpartx-read-only-loop-devs.patch

@ -8,32 +8,32 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -8,32 +8,32 @@ Index: multipath-tools-130222/kpartx/kpartx.c
--- multipath-tools-130222.orig/kpartx/kpartx.c
+++ multipath-tools-130222/kpartx/kpartx.c
@@ -204,7 +204,6 @@ main(int argc, char **argv){
char * delim = NULL;
char *uuid = NULL;
char *mapname = NULL;
char * delim = NULL;
char *uuid = NULL;
char *mapname = NULL;
- int loopro = 0;
int hotplug = 0;
int loopcreated = 0;
struct stat buf;
int hotplug = 0;
int loopcreated = 0;
struct stat buf;
@@ -315,7 +314,7 @@ main(int argc, char **argv){
if (!loopdev) {
loopdev = find_unused_loop_device();

if (!loopdev) {
loopdev = find_unused_loop_device();
- if (set_loop(loopdev, device, 0, &loopro)) {
+ if (set_loop(loopdev, device, 0, &ro)) {
fprintf(stderr, "can't set up loop\n");
exit (1);
}
fprintf(stderr, "can't set up loop\n");
exit (1);
}
Index: multipath-tools-130222/kpartx/lopart.c
===================================================================
--- multipath-tools-130222.orig/kpartx/lopart.c
+++ multipath-tools-130222/kpartx/lopart.c
@@ -230,7 +230,7 @@ set_loop (const char *device, const char

if ((ffd = open (file, mode)) < 0) {

if ((ffd = open (file, mode)) < 0) {
- if (!*loopro && errno == EROFS)
+ if (!*loopro && (errno == EROFS || errno == EACCES))
ffd = open (file, mode = O_RDONLY);

if (ffd < 0) {
ffd = open (file, mode = O_RDONLY);
if (ffd < 0) {

8
SOURCES/0048-RH-print-defaults.patch

@ -12,14 +12,14 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -12,14 +12,14 @@ Index: multipath-tools-130222/libmultipath/dict.c
{
- if (conf->max_checkint == MAX_CHECKINT(conf->checkint))
- return 0;
return snprintf(buff, len, "%i", conf->max_checkint);
return snprintf(buff, len, "%i", conf->max_checkint);
}

static int
snprint_reassign_maps (char * buff, int len, void * data)
{
- if (conf->reassign_maps == DEFAULT_REASSIGN_MAPS)
- return 0;
return snprintf(buff, len, "\"%s\"",
conf->reassign_maps?"yes":"no");
return snprintf(buff, len, "\"%s\"",
conf->reassign_maps?"yes":"no");
}

10
SOURCES/0049-RH-remove-ID_FS_TYPE.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/multipath/multipath.rules @@ -7,11 +7,11 @@ Index: multipath-tools-130222/multipath/multipath.rules
--- multipath-tools-130222.orig/multipath/multipath.rules
+++ multipath-tools-130222/multipath/multipath.rules
@@ -11,7 +11,7 @@ ACTION=="add", ENV{DEVTYPE}!="partition"
ENV{DM_MULTIPATH_DEVICE_PATH}!="1", \
TEST=="/etc/multipath.conf", \
PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \
ENV{DM_MULTIPATH_DEVICE_PATH}!="1", \
TEST=="/etc/multipath.conf", \
PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \
- ENV{DM_MULTIPATH_DEVICE_PATH}="1"
+ ENV{DM_MULTIPATH_DEVICE_PATH}="1" ENV{ID_FS_TYPE}="mpath_member"

ENV{DM_MULTIPATH_DEVICE_PATH}=="1", ENV{DEVTYPE}!="partition", \
RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"
RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"

12
SOURCES/0050-RH-listing-speedup.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/multipath/main.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/multipath/main.c
--- multipath-tools-130222.orig/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -311,7 +311,7 @@ configure (void)
/*
* get a path list
*/
/*
* get a path list
*/
- if (conf->dev)
+ if (conf->dev && !conf->list)
di_flag = DI_WWID;

if (conf->list > 1)
di_flag = DI_WWID;
if (conf->list > 1)

14
SOURCES/0051-UP-fix-cli-resize.patch

@ -3,21 +3,21 @@ index 7b1cb62..4b860bb 100644 @@ -3,21 +3,21 @@ index 7b1cb62..4b860bb 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -603,7 +603,18 @@ cli_resize(void *v, char **reply, int *len, void *data)
}

pgp = VECTOR_SLOT(mpp->pg, 0);
}
pgp = VECTOR_SLOT(mpp->pg, 0);
+
+ if (!pgp){
+ condlog(0, "%s: couldn't get path group. cannot resize",
+ mapname);
+ return 1;
+ }
pp = VECTOR_SLOT(pgp->paths, 0);
pp = VECTOR_SLOT(pgp->paths, 0);
+
+ if (!pp){
+ condlog(0, "%s: couldn't get path. cannot resize", mapname);
+ return 1;
+ }
if (!pp->udev || sysfs_get_size(pp, &size)) {
condlog(0, "%s: couldn't get size for sysfs. cannot resize",
mapname);
if (!pp->udev || sysfs_get_size(pp, &size)) {
condlog(0, "%s: couldn't get size for sysfs. cannot resize",
mapname);

46
SOURCES/0052-RH-fix-bad-derefs.patch

@ -8,47 +8,47 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c @@ -8,47 +8,47 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c
--- multipath-tools-130222.orig/multipathd/cli_handlers.c
+++ multipath-tools-130222/multipathd/cli_handlers.c
@@ -632,7 +632,8 @@ cli_resize(void *v, char **reply, int *l
return 1;

dm_lib_release();
return 1;
dm_lib_release();
- setup_multipath(vecs, mpp);
+ if (setup_multipath(vecs, mpp) != 0)
+ return 1;
sync_map_state(mpp);

return 0;
sync_map_state(mpp);
return 0;
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -134,7 +134,6 @@ coalesce_maps(struct vectors *vecs, vect
struct multipath * ompp;
vector ompv = vecs->mpvec;
unsigned int i;
struct multipath * ompp;
vector ompv = vecs->mpvec;
unsigned int i;
- int j;

vector_foreach_slot (ompv, ompp, i) {
if (!find_mp_by_wwid(nmpv, ompp->wwid)) {
vector_foreach_slot (ompv, ompp, i) {
if (!find_mp_by_wwid(nmpv, ompp->wwid)) {
@@ -148,16 +147,17 @@ coalesce_maps(struct vectors *vecs, vect
/*
* may be just because the device is open
*/
/*
* may be just because the device is open
*/
+ if (setup_multipath(vecs, ompp) != 0) {
+ i--;
+ continue;
+ }
if (!vector_alloc_slot(nmpv))
return 1;

vector_set_slot(nmpv, ompp);
if (!vector_alloc_slot(nmpv))
return 1;
vector_set_slot(nmpv, ompp);
- setup_multipath(vecs, ompp);

- if ((j = find_slot(ompv, (void *)ompp)) != -1)
- vector_del_slot(ompv, j);
-
- continue;
+ vector_del_slot(ompv, i);
+ i--;
}
else {
dm_lib_release();
}
else {
dm_lib_release();

16
SOURCES/0053-UP-fix-failback.patch

@ -7,17 +7,17 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -7,17 +7,17 @@ Index: multipath-tools-130222/libmultipath/dict.c
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -1126,11 +1126,11 @@ hw_failback_handler(vector strvec)

buff = set_value(strvec);

buff = set_value(strvec);
- if (strlen(buff) == 6 && !strcmp(buff, "\"manual\""))
+ if (strlen(buff) == 6 && !strcmp(buff, "manual"))
hwe->pgfailback = -FAILBACK_MANUAL;
hwe->pgfailback = -FAILBACK_MANUAL;
- else if (strlen(buff) == 9 && !strcmp(buff, "\"immediate\""))
+ else if (strlen(buff) == 9 && !strcmp(buff, "immediate"))
hwe->pgfailback = -FAILBACK_IMMEDIATE;
hwe->pgfailback = -FAILBACK_IMMEDIATE;
- else if (strlen(buff) == 10 && !strcmp(buff, "\"followover\""))
+ else if (strlen(buff) == 10 && !strcmp(buff, "followover"))
hwe->pgfailback = -FAILBACK_FOLLOWOVER;
else
hwe->pgfailback = atoi(buff);
hwe->pgfailback = -FAILBACK_FOLLOWOVER;
else
hwe->pgfailback = atoi(buff);

225
SOURCES/0054-UP-keep-udev-ref.patch

@ -25,29 +25,29 @@ Index: multipath-tools-130222/libmpathpersist/mpath_persist.c @@ -25,29 +25,29 @@ Index: multipath-tools-130222/libmpathpersist/mpath_persist.c
#include <structs.h>
#include <structs_vec.h>
+#include <libudev.h>

#include <prio.h>
#include <unistd.h>
@@ -20,6 +20,7 @@
#include <ctype.h>
#include <propsel.h>

+#include "mpath_persist.h"
#include "mpathpr.h"
#include "mpath_pr_ioctl.h"

@@ -32,9 +33,9 @@


int
-mpath_lib_init (void)
+mpath_lib_init (struct udev *udev)
{
- if (load_config(DEFAULT_CONFIGFILE)){
+ if (load_config(DEFAULT_CONFIGFILE, udev)){
condlog(0, "Failed to initialize multipath config.");
return 1;
}
condlog(0, "Failed to initialize multipath config.");
return 1;
}
Index: multipath-tools-130222/libmpathpersist/mpath_persist.h
===================================================================
--- multipath-tools-130222.orig/libmpathpersist/mpath_persist.h
@ -58,8 +58,8 @@ Index: multipath-tools-130222/libmpathpersist/mpath_persist.h @@ -58,8 +58,8 @@ Index: multipath-tools-130222/libmpathpersist/mpath_persist.h
*/
-extern int mpath_lib_init (void );
+extern int mpath_lib_init (struct udev *udev);


/*
Index: multipath-tools-130222/libmpathpersist/mpath_pr_ioctl.c
===================================================================
@ -69,65 +69,65 @@ Index: multipath-tools-130222/libmpathpersist/mpath_pr_ioctl.c @@ -69,65 +69,65 @@ Index: multipath-tools-130222/libmpathpersist/mpath_pr_ioctl.c
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
-#include "mpath_pr_ioctl.h"
-#include <mpath_persist.h>
-#include "mpath_pr_ioctl.h"
-#include <mpath_persist.h>
+#include <libudev.h>
+#include "mpath_pr_ioctl.h"
+#include <mpath_persist.h>

#include <debug.h>

Index: multipath-tools-130222/libmultipath/config.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -467,9 +467,6 @@ free_config (struct config * conf)
if (conf->dev)
FREE(conf->dev);

if (conf->dev)
FREE(conf->dev);
- if (conf->udev)
- udev_unref(conf->udev);
-
if (conf->multipath_dir)
FREE(conf->multipath_dir);

if (conf->multipath_dir)
FREE(conf->multipath_dir);
@@ -519,12 +516,12 @@ free_config (struct config * conf)
}

int
-load_config (char * file)
+load_config (char * file, struct udev *udev)
{
if (!conf)
conf = alloc_config();

if (!conf)
conf = alloc_config();
- if (!conf)
+ if (!conf || !udev)
return 1;

/*
return 1;
/*
@@ -533,7 +530,7 @@ load_config (char * file)
if (!conf->verbosity)
conf->verbosity = DEFAULT_VERBOSITY;

if (!conf->verbosity)
conf->verbosity = DEFAULT_VERBOSITY;
- conf->udev = udev_new();
+ conf->udev = udev;
dm_drv_version(conf->version, TGT_MPATH);
conf->dev_type = DEV_NONE;
conf->minio = DEFAULT_MINIO;
dm_drv_version(conf->version, TGT_MPATH);
conf->dev_type = DEV_NONE;
conf->minio = DEFAULT_MINIO;
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -159,7 +159,7 @@ void free_mptable (vector mptable);

int store_hwe (vector hwtable, struct hwentry *);

-int load_config (char * file);
+int load_config (char * file, struct udev * udev);
struct config * alloc_config (void);
void free_config (struct config * conf);

Index: multipath-tools-130222/mpathpersist/main.c
===================================================================
--- multipath-tools-130222.orig/mpathpersist/main.c
@ -141,41 +141,41 @@ Index: multipath-tools-130222/mpathpersist/main.c @@ -141,41 +141,41 @@ Index: multipath-tools-130222/mpathpersist/main.c
#include "main.h"
#include <pthread.h>
@@ -68,7 +69,8 @@ int main (int argc, char * argv[])
int noisy = 0;
int num_transport =0;
void *resp = NULL;
- struct transportid * tmp;
int noisy = 0;
int num_transport =0;
void *resp = NULL;
- struct transportid * tmp;
+ struct transportid * tmp;
+ struct udev *udev = NULL;

if (optind == argc)
{
if (optind == argc)
{
@@ -84,8 +86,8 @@ int main (int argc, char * argv[])
exit (1);
}

exit (1);
}
-
- mpath_lib_init();
+ udev = udev_new();
+ mpath_lib_init(udev);
memset(transportids,0,MPATH_MX_TIDS);

while (1)
memset(transportids,0,MPATH_MX_TIDS);
while (1)
@@ -461,12 +463,13 @@ int main (int argc, char * argv[])
if (res < 0)
{
mpath_lib_exit();
if (res < 0)
{
mpath_lib_exit();
+ udev_unref(udev);
return MPATH_PR_FILE_ERROR;
}

return MPATH_PR_FILE_ERROR;
}
out :
mpath_lib_exit();
mpath_lib_exit();
-
+ udev_unref(udev);
return (ret >= 0) ? ret : MPATH_PR_OTHER;
return (ret >= 0) ? ret : MPATH_PR_OTHER;
}

Index: multipath-tools-130222/multipath/main.c
===================================================================
--- multipath-tools-130222.orig/multipath/main.c
@ -185,7 +185,7 @@ Index: multipath-tools-130222/multipath/main.c @@ -185,7 +185,7 @@ Index: multipath-tools-130222/multipath/main.c
#include <unistd.h>
#include <ctype.h>
+#include <libudev.h>

#include <checkers.h>
#include <prio.h>
@@ -435,6 +436,7 @@ convert_dev(char *dev)
@ -193,42 +193,42 @@ Index: multipath-tools-130222/multipath/main.c @@ -193,42 +193,42 @@ Index: multipath-tools-130222/multipath/main.c
main (int argc, char *argv[])
{
+ struct udev *udev;
int arg;
extern char *optarg;
extern int optind;
int arg;
extern char *optarg;
extern int optind;
@@ -445,7 +447,9 @@ main (int argc, char *argv[])
exit(1);
}

exit(1);
}
- if (load_config(DEFAULT_CONFIGFILE))
+ udev = udev_new();
+
+ if (load_config(DEFAULT_CONFIGFILE, udev))
exit(1);

if (dm_prereq())
exit(1);
if (dm_prereq())
@@ -560,11 +564,11 @@ main (int argc, char *argv[])

if (init_checkers()) {
condlog(0, "failed to initialize checkers");
if (init_checkers()) {
condlog(0, "failed to initialize checkers");
- exit(1);
+ goto out;
}
if (init_prio()) {
condlog(0, "failed to initialize prioritizers");
}
if (init_prio()) {
condlog(0, "failed to initialize prioritizers");
- exit(1);
+ goto out;
}
dm_init();

}
dm_init();
@@ -628,7 +632,7 @@ out:
*/
free_config(conf);
conf = NULL;
*/
free_config(conf);
conf = NULL;
-
+ udev_unref(udev);
#ifdef _DEBUG_
dbg_free_final(NULL);
dbg_free_final(NULL);
#endif
Index: multipath-tools-130222/multipathd/main.c
===================================================================
@ -237,71 +237,72 @@ Index: multipath-tools-130222/multipathd/main.c @@ -237,71 +237,72 @@ Index: multipath-tools-130222/multipathd/main.c
@@ -93,6 +93,8 @@ static sem_t exit_sem;
*/
struct vectors * gvecs;

+struct udev * udev;
+
static int
need_switch_pathgroup (struct multipath * mpp, int refresh)
{
@@ -1408,7 +1410,7 @@ reconfigure (struct vectors * vecs)
vecs->pathvec = NULL;
conf = NULL;

vecs->pathvec = NULL;
conf = NULL;
- if (!load_config(DEFAULT_CONFIGFILE)) {
+ if (!load_config(DEFAULT_CONFIGFILE, udev)) {
conf->verbosity = old->verbosity;
conf->daemon = 1;
configure(vecs, 1);
conf->verbosity = old->verbosity;
conf->daemon = 1;
configure(vecs, 1);
@@ -1601,6 +1603,8 @@ child (void * param)
sem_init(&exit_sem, 0, 0);
signal_init();

sem_init(&exit_sem, 0, 0);
signal_init();
+ udev = udev_new();
+
setup_thread_attr(&misc_attr, 64 * 1024, 1);
setup_thread_attr(&waiter_attr, 32 * 1024, 1);

setup_thread_attr(&misc_attr, 64 * 1024, 1);
setup_thread_attr(&waiter_attr, 32 * 1024, 1);
@@ -1615,7 +1619,7 @@ child (void * param)
condlog(2, "--------start up--------");
condlog(2, "read " DEFAULT_CONFIGFILE);

condlog(2, "--------start up--------");
condlog(2, "read " DEFAULT_CONFIGFILE);
- if (load_config(DEFAULT_CONFIGFILE))
+ if (load_config(DEFAULT_CONFIGFILE, udev))
exit(1);

if (init_checkers()) {
exit(1);
if (init_checkers()) {
@@ -1765,7 +1769,8 @@ child (void * param)
*/
free_config(conf);
conf = NULL;
*/
free_config(conf);
conf = NULL;
-
+ udev_unref(udev);
+ udev = NULL;
#ifdef _DEBUG_
dbg_free_final(NULL);
dbg_free_final(NULL);
#endif
Index: multipath-tools-130222/mpathpersist/Makefile
===================================================================
--- multipath-tools-130222.orig/mpathpersist/Makefile
+++ multipath-tools-130222/mpathpersist/Makefile
@@ -5,7 +5,7 @@ include ../Makefile.inc
OBJS = main.o

CFLAGS += -I$(multipathdir) -I$(mpathpersistdir)
-LDFLAGS += -lpthread -ldevmapper -L$(mpathpersistdir) -lmpathpersist -L$(multipathdir) -lmultipath
OBJS = main.o
CFLAGS += -I$(multipathdir) -I$(mpathpersistdir)
-LDFLAGS += -lpthread -ldevmapper -L$(mpathpersistdir) -lmpathpersist -L$(multipathdir) -lmultipath
+LDFLAGS += -lpthread -ldevmapper -L$(mpathpersistdir) -lmpathpersist -L$(multipathdir) -lmultipath -ludev

EXEC = mpathpersist

Index: multipath-tools-130222/multipath/Makefile
===================================================================
--- multipath-tools-130222.orig/multipath/Makefile
+++ multipath-tools-130222/multipath/Makefile
@@ -7,7 +7,7 @@ include ../Makefile.inc
OBJS = main.o

CFLAGS += -fPIC -I$(multipathdir)
-LDFLAGS += -lpthread -ldevmapper -ldl -L$(multipathdir) -lmultipath
+LDFLAGS += -lpthread -ldevmapper -ldl -L$(multipathdir) -lmultipath -ludev

EXEC = multipath

12
SOURCES/0055-UP-handle-quiesced-paths.patch

@ -7,10 +7,10 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -7,10 +7,10 @@ Index: multipath-tools-130222/libmultipath/discovery.c
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -799,6 +799,7 @@ path_offline (struct path * pp)
condlog(3, "%s: path state = %s", pp->dev, buff);

if (!strncmp(buff, "offline", 7) ||
condlog(3, "%s: path state = %s", pp->dev, buff);
if (!strncmp(buff, "offline", 7) ||
+ !strncmp(buff, "quiesce", 7) ||
!strncmp(buff, "transport-offline", 17)) {
pp->offline = 1;
return PATH_DOWN;
!strncmp(buff, "transport-offline", 17)) {
pp->offline = 1;
return PATH_DOWN;

12
SOURCES/0056-UP-alua-prio-fix.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/prioritizers/alua.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/prioritizers/alua.c
--- multipath-tools-130222.orig/libmultipath/prioritizers/alua.c
+++ multipath-tools-130222/libmultipath/prioritizers/alua.c
@@ -108,7 +108,7 @@ int getprio (struct path * pp, char * ar
default:
rc = 0;
}
default:
rc = 0;
}
- if (priopath)
+ if (priopath && aas != AAS_OPTIMIZED)
rc += 80;
} else {
switch(-rc) {
rc += 80;
} else {
switch(-rc) {

162
SOURCES/0057-UP-fix-tmo.patch

@ -1,7 +1,7 @@ @@ -1,7 +1,7 @@
---
libmultipath/discovery.c | 109 +++++++++++++++++++++++++++++++++++++----------
libmultipath/sysfs.c | 86 +++++++++++++++++++++++++++++++------
libmultipath/sysfs.h | 2
libmultipath/sysfs.h | 2
3 files changed, 161 insertions(+), 36 deletions(-)

Index: multipath-tools-130222/libmultipath/discovery.c
@ -14,28 +14,28 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -14,28 +14,28 @@ Index: multipath-tools-130222/libmultipath/discovery.c
declare_sysfs_get_str(rev);
-declare_sysfs_get_str(state);
declare_sysfs_get_str(dev);

int
@@ -315,9 +314,14 @@ static void
sysfs_set_rport_tmo(struct multipath *mpp, struct path *pp)
{
struct udev_device *rport_dev = NULL;
struct udev_device *rport_dev = NULL;
- char value[11];
+ char value[16];
char rport_id[32];
char rport_id[32];
+ int delay_fast_io_fail = 0;
+ int current_dev_loss = 0;
+ int ret;

+ if (!mpp->dev_loss && mpp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
+ 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,
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,
@@ -330,33 +334,85 @@ sysfs_set_rport_tmo(struct multipath *mp
condlog(4, "target%d:%d:%d -> %s", pp->sg_id.host_no,
pp->sg_id.channel, pp->sg_id.scsi_id, rport_id);

condlog(4, "target%d:%d:%d -> %s", pp->sg_id.host_no,
pp->sg_id.channel, pp->sg_id.scsi_id, rport_id);
- snprintf(value, 11, "%u", mpp->dev_loss);
- if (mpp->dev_loss &&
- sysfs_attr_set_value(rport_dev, "dev_loss_tmo", value, 11) <= 0) {
@ -56,8 +56,8 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -56,8 +56,8 @@ Index: multipath-tools-130222/libmultipath/discovery.c
+ if (ret <= 0) {
+ condlog(0, "%s: failed to read dev_loss_tmo value, "
+ "error %d", rport_id, -ret);
goto out;
}
goto out;
}
+ if (sscanf(value, "%u\n", &current_dev_loss) != 1) {
+ condlog(0, "%s: Cannot parse dev_loss_tmo "
+ "attribute '%s'", rport_id, value);
@ -84,16 +84,16 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -84,16 +84,16 @@ Index: multipath-tools-130222/libmultipath/discovery.c
+ condlog(3, "%s: limiting dev_loss_tmo to 600, since "
+ "fast_io_fail is unset or off", rport_id);
+ mpp->dev_loss = 600;
}
}
- if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET){
+ if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
if (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
sprintf(value, "off");
else if (mpp->fast_io_fail == MP_FAST_IO_FAIL_ZERO)
sprintf(value, "0");
if (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
sprintf(value, "off");
else if (mpp->fast_io_fail == MP_FAST_IO_FAIL_ZERO)
sprintf(value, "0");
+ else if (delay_fast_io_fail)
+ snprintf(value, 16, "%u", current_dev_loss - 1);
else
else
- snprintf(value, 11, "%u", mpp->fast_io_fail);
- if (sysfs_attr_set_value(rport_dev, "fast_io_fail_tmo",
- value, 11) <= 0) {
@ -134,18 +134,18 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -134,18 +134,18 @@ Index: multipath-tools-130222/libmultipath/discovery.c
+ else
+ condlog(0, "%s: failed to set fast_io_fail_tmo to %s, error %d",
+ rport_id, value, -ret);
}
}
}
}
out:
@@ -394,7 +450,7 @@ sysfs_set_session_tmo(struct multipath *
} else {
snprintf(value, 11, "%u", mpp->fast_io_fail);
if (sysfs_attr_set_value(session_dev, "recovery_tmo",
} else {
snprintf(value, 11, "%u", mpp->fast_io_fail);
if (sysfs_attr_set_value(session_dev, "recovery_tmo",
- value, 11)) {
+ value, 11) <= 0) {
condlog(3, "%s: Failed to set recovery_tmo, "
" error %d", pp->dev, errno);
}
condlog(3, "%s: Failed to set recovery_tmo, "
" error %d", pp->dev, errno);
}
@@ -752,6 +808,9 @@ cciss_sysfs_pathinfo (struct path * pp)
static int
common_sysfs_pathinfo (struct path * pp)
@ -153,29 +153,29 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -153,29 +153,29 @@ Index: multipath-tools-130222/libmultipath/discovery.c
+ if (!pp)
+ return 1;
+
if (!pp->udev) {
condlog(4, "%s: udev not initialised", pp->dev);
return 1;
if (!pp->udev) {
condlog(4, "%s: udev not initialised", pp->dev);
return 1;
@@ -793,7 +852,8 @@ path_offline (struct path * pp)
return PATH_DOWN;
}

return PATH_DOWN;
}
- if (sysfs_get_state(parent, buff, SCSI_STATE_SIZE))
+ memset(buff, 0x0, SCSI_STATE_SIZE);
+ if (sysfs_attr_get_value(parent, "state", buff, SCSI_STATE_SIZE) <= 0)
return PATH_DOWN;

condlog(3, "%s: path state = %s", pp->dev, buff);
return PATH_DOWN;
condlog(3, "%s: path state = %s", pp->dev, buff);
@@ -983,6 +1043,9 @@ pathinfo (struct path *pp, vector hwtabl
{
int path_state;

int path_state;
+ if (!pp)
+ return 1;
+
condlog(3, "%s: mask = 0x%x", pp->dev, mask);

/*
condlog(3, "%s: mask = 0x%x", pp->dev, mask);
/*
Index: multipath-tools-130222/libmultipath/sysfs.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/sysfs.c
@ -183,7 +183,7 @@ Index: multipath-tools-130222/libmultipath/sysfs.c @@ -183,7 +183,7 @@ Index: multipath-tools-130222/libmultipath/sysfs.c
@@ -38,7 +38,12 @@
#include "debug.h"
#include "devmapper.h"

-ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
+/*
+ * When we modify an attribute value we cannot rely on libudev for now,
@ -191,26 +191,26 @@ Index: multipath-tools-130222/libmultipath/sysfs.c @@ -191,26 +191,26 @@ Index: multipath-tools-130222/libmultipath/sysfs.c
+ * So for modified attributes we need to implement our own function.
+ */
+ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
char * value, size_t value_len)
char * value, size_t value_len)
{
char devpath[PATH_SIZE];
char devpath[PATH_SIZE];
@@ -54,28 +59,83 @@ ssize_t sysfs_attr_set_value(struct udev
condlog(4, "open '%s'", devpath);
if (stat(devpath, &statbuf) != 0) {
condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
condlog(4, "open '%s'", devpath);
if (stat(devpath, &statbuf) != 0) {
condlog(4, "stat '%s' failed: %s", devpath, strerror(errno));
- return 0;
+ return -errno;
}

/* skip directories */
}
/* skip directories */
- if (S_ISDIR(statbuf.st_mode))
- return 0;
+ if (S_ISDIR(statbuf.st_mode)) {
+ condlog(4, "%s is a directory", devpath);
+ return -EISDIR;
+ }

/* skip non-writeable files */
/* skip non-writeable files */
- if ((statbuf.st_mode & S_IWUSR) == 0)
+ if ((statbuf.st_mode & S_IRUSR) == 0) {
+ condlog(4, "%s is not readable", devpath);
@ -246,8 +246,8 @@ Index: multipath-tools-130222/libmultipath/sysfs.c @@ -246,8 +246,8 @@ Index: multipath-tools-130222/libmultipath/sysfs.c
+ ssize_t size = -1;
+
+ if (!dev || !attr_name || !value || !value_len)
return 0;

return 0;
+ snprintf(devpath, PATH_SIZE, "%s/%s", udev_device_get_syspath(dev),
+ attr_name);
+ condlog(4, "open '%s'", devpath);
@ -268,60 +268,60 @@ Index: multipath-tools-130222/libmultipath/sysfs.c @@ -268,60 +268,60 @@ Index: multipath-tools-130222/libmultipath/sysfs.c
+ return -EPERM;
+ }
+
/* write attribute value */
fd = open(devpath, O_WRONLY);
if (fd < 0) {
condlog(4, "attribute '%s' can not be opened: %s",
devpath, strerror(errno));
/* write attribute value */
fd = open(devpath, O_WRONLY);
if (fd < 0) {
condlog(4, "attribute '%s' can not be opened: %s",
devpath, strerror(errno));
- return 0;
+ return -errno;
}
size = write(fd, value, value_len);
if (size < 0) {
condlog(4, "write to %s failed: %s", devpath, strerror(errno));
}
size = write(fd, value, value_len);
if (size < 0) {
condlog(4, "write to %s failed: %s", devpath, strerror(errno));
- size = 0;
+ size = -errno;
} else if (size < value_len) {
condlog(4, "tried to write %ld to %s. Wrote %ld",
(long)value_len, devpath, (long)size);
} else if (size < value_len) {
condlog(4, "tried to write %ld to %s. Wrote %ld",
(long)value_len, devpath, (long)size);
@@ -89,14 +149,14 @@ ssize_t sysfs_attr_set_value(struct udev
int
sysfs_get_size (struct path *pp, unsigned long long * size)
{
- const char * attr;
+ char attr[255];
int r;

int r;
- if (!pp->udev)
+ if (!pp->udev || !size)
return 1;

return 1;
- attr = udev_device_get_sysattr_value(pp->udev, "size");
- if (!attr) {
+ attr[0] = '\0';
+ if (sysfs_attr_get_value(pp->udev, "size", attr, 255) == 0) {
condlog(3, "%s: No size attribute in sysfs", pp->dev);
return 1;
}
condlog(3, "%s: No size attribute in sysfs", pp->dev);
return 1;
}
@@ -104,8 +164,8 @@ sysfs_get_size (struct path *pp, unsigne
r = sscanf(attr, "%llu\n", size);

if (r != 1) {
r = sscanf(attr, "%llu\n", size);
if (r != 1) {
- condlog(3, "%s: Cannot parse size attribute '%s'",
- pp->dev, attr);
+ condlog(3, "%s: Cannot parse size attribute", pp->dev);
+ *size = 0;
return 1;
}

return 1;
}
Index: multipath-tools-130222/libmultipath/sysfs.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/sysfs.h
+++ multipath-tools-130222/libmultipath/sysfs.h
@@ -7,6 +7,8 @@

ssize_t sysfs_attr_set_value(struct udev_device *dev, const char *attr_name,
char * value, size_t value_len);
char * value, size_t value_len);
+ssize_t sysfs_attr_get_value(struct udev_device *dev, const char *attr_name,
+ char * value, size_t value_len);
int sysfs_get_size (struct path *pp, unsigned long long * size);

12
SOURCES/0058-UP-fix-failback.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/dict.c
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -2562,7 +2562,7 @@ snprint_def_failback (char * buff, int l
if (!pgfailback)
pgfailback = DEFAULT_FAILBACK;

if (!pgfailback)
pgfailback = DEFAULT_FAILBACK;
- switch(conf->pgfailback) {
+ switch(pgfailback) {
case FAILBACK_UNDEF:
break;
case -FAILBACK_MANUAL:
case FAILBACK_UNDEF:
break;
case -FAILBACK_MANUAL:

34
SOURCES/0059-UP-flush-failure-queueing.patch

@ -9,13 +9,13 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -9,13 +9,13 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -363,7 +363,7 @@ out:
}

extern int
-dm_get_map(char * name, unsigned long long * size, char * outparams)
+dm_get_map(const char * name, unsigned long long * size, char * outparams)
{
int r = 1;
struct dm_task *dmt;
int r = 1;
struct dm_task *dmt;
@@ -682,7 +682,9 @@ _dm_flush_map (const char * mapname, int
extern int
dm_suspend_and_flush_map (const char * mapname)
@ -24,13 +24,13 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -24,13 +24,13 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ int s = 0, queue_if_no_path = 0;
+ unsigned long long mapsize;
+ char params[PARAMS_SIZE] = {0};

if (!dm_map_present(mapname))
return 0;
if (!dm_map_present(mapname))
return 0;
@@ -690,8 +692,17 @@ dm_suspend_and_flush_map (const char * m
if (dm_type(mapname, TGT_MPATH) <= 0)
return 0; /* nothing to do */

if (dm_type(mapname, TGT_MPATH) <= 0)
return 0; /* nothing to do */
- s = dm_queue_if_no_path((char *)mapname, 0);
- if (!s)
+ if (!dm_get_map(mapname, &mapsize, params)) {
@ -44,18 +44,18 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -44,18 +44,18 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ if (s)
+ queue_if_no_path = 0;
+ else
s = dm_simplecmd_flush(DM_DEVICE_SUSPEND, mapname, 0);

if (!dm_flush_map(mapname)) {
s = dm_simplecmd_flush(DM_DEVICE_SUSPEND, mapname, 0);
if (!dm_flush_map(mapname)) {
@@ -700,6 +711,8 @@ dm_suspend_and_flush_map (const char * m
}
condlog(2, "failed to remove multipath map %s", mapname);
dm_simplecmd_noflush(DM_DEVICE_RESUME, mapname);
}
condlog(2, "failed to remove multipath map %s", mapname);
dm_simplecmd_noflush(DM_DEVICE_RESUME, mapname);
+ if (queue_if_no_path)
+ s = dm_queue_if_no_path((char *)mapname, 1);
return 1;
return 1;
}

Index: multipath-tools-130222/libmultipath/devmapper.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.h

96
SOURCES/0060-UP-uevent-loop-udev.patch

@ -13,40 +13,40 @@ Index: multipath-tools-130222/libmultipath/uevent.c @@ -13,40 +13,40 @@ Index: multipath-tools-130222/libmultipath/uevent.c
#include "uevent.h"
#include "vector.h"
-#include "config.h"

typedef int (uev_trigger)(struct uevent *, void * trigger_data);

@@ -127,11 +126,14 @@ service_uevq(struct list_head *tmpq)

static void uevq_stop(void *arg)
{
+ struct udev *udev = arg;
+
condlog(3, "Stopping uev queue");
pthread_mutex_lock(uevq_lockp);
my_uev_trigger = NULL;
pthread_cond_signal(uev_condp);
pthread_mutex_unlock(uevq_lockp);
condlog(3, "Stopping uev queue");
pthread_mutex_lock(uevq_lockp);
my_uev_trigger = NULL;
pthread_cond_signal(uev_condp);
pthread_mutex_unlock(uevq_lockp);
+ udev_unref(udev);
}

void
@@ -399,9 +401,9 @@ exit:
return 1;
return 1;
}

-int uevent_listen(void)
+int uevent_listen(struct udev *udev)
{
- int err;
+ int err = 2;
struct udev_monitor *monitor = NULL;
int fd, socket_flags;
int need_failback = 1;
struct udev_monitor *monitor = NULL;
int fd, socket_flags;
int need_failback = 1;
@@ -411,9 +413,14 @@ int uevent_listen(void)
* thereby not getting to empty the socket's receive buffer queue
* often enough.
*/
* thereby not getting to empty the socket's receive buffer queue
* often enough.
*/
- pthread_cleanup_push(uevq_stop, NULL);
+ if (!udev) {
+ condlog(1, "no udev context");
@ -54,12 +54,12 @@ Index: multipath-tools-130222/libmultipath/uevent.c @@ -54,12 +54,12 @@ Index: multipath-tools-130222/libmultipath/uevent.c
+ }
+ udev_ref(udev);
+ pthread_cleanup_push(uevq_stop, udev);

- monitor = udev_monitor_new_from_netlink(conf->udev, "udev");
+ monitor = udev_monitor_new_from_netlink(udev, "udev");
if (!monitor) {
condlog(2, "failed to create udev monitor");
goto out;
if (!monitor) {
condlog(2, "failed to create udev monitor");
goto out;
Index: multipath-tools-130222/libmultipath/uevent.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/uevent.h
@ -67,20 +67,20 @@ Index: multipath-tools-130222/libmultipath/uevent.h @@ -67,20 +67,20 @@ Index: multipath-tools-130222/libmultipath/uevent.h
@@ -13,6 +13,8 @@
#define NETLINK_KOBJECT_UEVENT 15
#endif

+struct udev;
+
struct uevent {
struct list_head node;
struct udev_device *udev;
struct list_head node;
struct udev_device *udev;
@@ -27,7 +29,7 @@ struct uevent {
int is_uevent_busy(void);
void setup_thread_attr(pthread_attr_t *attr, size_t stacksize, int detached);

-int uevent_listen(void);
+int uevent_listen(struct udev *udev);
int uevent_dispatch(int (*store_uev)(struct uevent *, void * trigger_data),
void * trigger_data);
void * trigger_data);
int uevent_get_major(struct uevent *uev);
Index: multipath-tools-130222/multipathd/main.c
===================================================================
@ -92,36 +92,36 @@ Index: multipath-tools-130222/multipathd/main.c @@ -92,36 +92,36 @@ Index: multipath-tools-130222/multipathd/main.c
{
- if (uevent_listen())
+ if (uevent_listen(udev))
condlog(0, "error starting uevent listener");

return NULL;
condlog(0, "error starting uevent listener");
return NULL;
@@ -1593,7 +1593,7 @@ static int
child (void * param)
{
pthread_t check_thr, uevent_thr, uxlsnr_thr, uevq_thr;
pthread_t check_thr, uevent_thr, uxlsnr_thr, uevq_thr;
- pthread_attr_t log_attr, misc_attr;
+ pthread_attr_t log_attr, misc_attr, uevent_attr;
struct vectors * vecs;
struct multipath * mpp;
int i;
struct vectors * vecs;
struct multipath * mpp;
int i;
@@ -1606,6 +1606,7 @@ child (void * param)
udev = udev_new();

setup_thread_attr(&misc_attr, 64 * 1024, 1);
udev = udev_new();
setup_thread_attr(&misc_attr, 64 * 1024, 1);
+ setup_thread_attr(&uevent_attr, 128 * 1024, 1);
setup_thread_attr(&waiter_attr, 32 * 1024, 1);

if (logsink) {
setup_thread_attr(&waiter_attr, 32 * 1024, 1);
if (logsink) {
@@ -1671,10 +1672,11 @@ child (void * param)
/*
* Start uevent listener early to catch events
*/
/*
* Start uevent listener early to catch events
*/
- if ((rc = pthread_create(&uevent_thr, &misc_attr, ueventloop, vecs))) {
+ if ((rc = pthread_create(&uevent_thr, &uevent_attr, ueventloop, udev))) {
condlog(0, "failed to create uevent thread: %d", rc);
exit(1);
}
condlog(0, "failed to create uevent thread: %d", rc);
exit(1);
}
+ pthread_attr_destroy(&uevent_attr);
if ((rc = pthread_create(&uxlsnr_thr, &misc_attr, uxlsnrloop, vecs))) {
condlog(0, "failed to create cli listener: %d", rc);
exit(1);
if ((rc = pthread_create(&uxlsnr_thr, &misc_attr, uxlsnrloop, vecs))) {
condlog(0, "failed to create cli listener: %d", rc);
exit(1);

5
SOURCES/0061-RH-display-find-mpaths.patch

@ -12,5 +12,6 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -12,5 +12,6 @@ Index: multipath-tools-130222/libmultipath/dict.c
{
- if (conf->find_multipaths == DEFAULT_FIND_MULTIPATHS)
- return 0;
if (!conf->find_multipaths)
return snprintf(buff, len, "no");
if (!conf->find_multipaths)
return snprintf(buff, len, "no");

25
SOURCES/0062-RH-dont-free-vecs.patch

@ -7,21 +7,22 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,21 +7,22 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -1735,8 +1735,9 @@ child (void * param)
vecs->pathvec = NULL;
unlock(vecs->lock);
/* Now all the waitevent threads will start rushing in. */
vecs->pathvec = NULL;
unlock(vecs->lock);
/* Now all the waitevent threads will start rushing in. */
+ /* freeing vecs isn't worth the races
while (vecs->lock.depth > 0) {
while (vecs->lock.depth > 0) {
- sleep (1); /* This is weak. */
+ sleep (1);
condlog(3, "Have %d wait event checkers threads to de-alloc,"
" waiting...", vecs->lock.depth);
}
condlog(3, "Have %d wait event checkers threads to de-alloc,"
" waiting...", vecs->lock.depth);
}
@@ -1746,7 +1747,7 @@ child (void * param)
vecs->lock.mutex = NULL;
FREE(vecs);
vecs = NULL;
vecs->lock.mutex = NULL;
FREE(vecs);
vecs = NULL;
-
+ */
cleanup_checkers();
cleanup_prio();
cleanup_checkers();
cleanup_prio();

18
SOURCES/0063-RH-fix-warning.patch

@ -7,20 +7,20 @@ Index: multipath-tools-130222/kpartx/dasd.c @@ -7,20 +7,20 @@ Index: multipath-tools-130222/kpartx/dasd.c
--- multipath-tools-130222.orig/kpartx/dasd.c
+++ multipath-tools-130222/kpartx/dasd.c
@@ -46,6 +46,8 @@ unsigned long long sectors512(unsigned l
return sectors * (blocksize >> 9);
return sectors * (blocksize >> 9);
}

+typedef unsigned int __attribute__((__may_alias__)) label_ints_t;
+
/*
*/
int
int
@@ -169,7 +171,7 @@ read_dasd_pt(int fd, struct slice all, s
/*
* VM style CMS1 labeled disk
*/
/*
* VM style CMS1 labeled disk
*/
- unsigned int *label = (unsigned int *) &vlabel;
+ label_ints_t *label = (label_ints_t *) &vlabel;

blocksize = label[4];
if (label[14] != 0) {
blocksize = label[4];
if (label[14] != 0) {

184
SOURCES/0064-RHBZ-1010040-fix-ID_FS-attrs.patch

@ -6,7 +6,7 @@ @@ -6,7 +6,7 @@
multipath/main.c | 36 +++++++++++++++-
multipath/multipath.rules | 26 +++++++++---
multipathd/main.c | 4 +
multipathd/multipathd.service | 2
multipathd/multipathd.service | 2
multipathd/pidfile.c | 3 +
9 files changed, 160 insertions(+), 13 deletions(-)

@ -16,7 +16,7 @@ Index: multipath-tools-130222/libmultipath/defaults.h @@ -16,7 +16,7 @@ Index: multipath-tools-130222/libmultipath/defaults.h
+++ multipath-tools-130222/libmultipath/defaults.h
@@ -24,7 +24,8 @@
#define MAX_CHECKINT(a) (a << 2)

#define MAX_DEV_LOSS_TMO 0x7FFFFFFF
-#define DEFAULT_PIDFILE "/var/run/multipathd.pid"
+#define DEFAULT_PIDFILE "/var/run/multipathd/multipathd.pid"
@ -33,28 +33,28 @@ Index: multipath-tools-130222/libmultipath/file.c @@ -33,28 +33,28 @@ Index: multipath-tools-130222/libmultipath/file.c
#include <stdio.h>
#include <signal.h>
+#include <time.h>

#include "file.h"
#include "debug.h"
#include "uxsock.h"
+#include "defaults.h"


/*
@@ -36,8 +38,8 @@
* See the file COPYING included with this distribution for more details.
*/

-static int
-ensure_directories_exist(char *str, mode_t dir_mode)
+int
+ensure_directories_exist(const char *str, mode_t dir_mode)
{
char *pathname;
char *end;
char *pathname;
char *end;
@@ -178,3 +180,86 @@ fail:
close(fd);
return -1;
close(fd);
return -1;
}
+
+/* If you can't get the timestamp, return equal to just keep using the
@ -144,13 +144,13 @@ Index: multipath-tools-130222/libmultipath/file.h @@ -144,13 +144,13 @@ Index: multipath-tools-130222/libmultipath/file.h
--- multipath-tools-130222.orig/libmultipath/file.h
+++ multipath-tools-130222/libmultipath/file.h
@@ -7,5 +7,8 @@

#define FILE_TIMEOUT 30
int open_file(char *file, int *can_write, char *header);
+int ensure_directories_exist(const char *str, mode_t dir_mode);
+int update_timestamp(int create);
+int timestamp_equal(long int chk_timestamp);

#endif /* _FILE_H */
Index: multipath-tools-130222/multipathd/pidfile.c
===================================================================
@ -158,79 +158,79 @@ Index: multipath-tools-130222/multipathd/pidfile.c @@ -158,79 +158,79 @@ Index: multipath-tools-130222/multipathd/pidfile.c
+++ multipath-tools-130222/multipathd/pidfile.c
@@ -9,6 +9,7 @@
#include <fcntl.h> /* for fcntl() */

#include <debug.h>
+#include <file.h>

#include "pidfile.h"

@@ -18,6 +19,8 @@ int pidfile_create(const char *pidFile,
struct flock lock;
int fd, value;

struct flock lock;
int fd, value;
+ if (ensure_directories_exist(pidFile, 0700))
+ return 1;
if((fd = open(pidFile, O_WRONLY | O_CREAT,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))) < 0) {
condlog(0, "Cannot open pidfile [%s], error was [%s]",
if((fd = open(pidFile, O_WRONLY | O_CREAT,
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH))) < 0) {
condlog(0, "Cannot open pidfile [%s], error was [%s]",
Index: multipath-tools-130222/libmultipath/wwids.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.c
+++ multipath-tools-130222/libmultipath/wwids.c
@@ -125,6 +125,7 @@ replace_wwids(vector mp)
goto out_file;
}
ret = 0;
goto out_file;
}
ret = 0;
+ update_timestamp(0);
out_file:
close(fd);
close(fd);
out:
@@ -209,6 +210,8 @@ remove_wwid(char *wwid) {
goto out_file;
}
ret = do_remove_wwid(fd, str);
goto out_file;
}
ret = do_remove_wwid(fd, str);
+ if (!ret)
+ update_timestamp(0);

out_file:
close(fd);
close(fd);
@@ -294,8 +297,10 @@ remember_wwid(char *wwid)
condlog(3, "failed writing wwid %s to wwids file", wwid);
return -1;
}
condlog(3, "failed writing wwid %s to wwids file", wwid);
return -1;
}
- if (ret == 1)
+ if (ret == 1) {
condlog(3, "wrote wwid %s to wwids file", wwid);
condlog(3, "wrote wwid %s to wwids file", wwid);
+ update_timestamp(0);
+ }
else
condlog(4, "wwid %s already in wwids file", wwid);
return 0;
else
condlog(4, "wwid %s already in wwids file", wwid);
return 0;
Index: multipath-tools-130222/multipath/multipath.rules
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.rules
+++ multipath-tools-130222/multipath/multipath.rules
@@ -4,18 +4,34 @@ SUBSYSTEM!="block", GOTO="end_mpath"

IMPORT{cmdline}="nompath"
ENV{nompath}=="?*", GOTO="end_mpath"
+ENV{DEVTYPE}=="partition", GOTO="end_mpath"
ENV{MPATH_SBIN_PATH}="/sbin"
TEST!="$env{MPATH_SBIN_PATH}/multipath", ENV{MPATH_SBIN_PATH}="/usr/sbin"
+TEST!="/etc/multipath.conf", GOTO="check_kpartx"

-ACTION=="add", ENV{DEVTYPE}!="partition", \
- ENV{DM_MULTIPATH_DEVICE_PATH}!="1", \
- TEST=="/etc/multipath.conf", \
+ACTION=="add", ENV{DM_MULTIPATH_DEVICE_PATH}!="1", \
PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \
PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \
- ENV{DM_MULTIPATH_DEVICE_PATH}="1" ENV{ID_FS_TYPE}="mpath_member"
+ ENV{DM_MULTIPATH_DEVICE_PATH}="1", ENV{ID_FS_TYPE}="mpath_member"

-ENV{DM_MULTIPATH_DEVICE_PATH}=="1", ENV{DEVTYPE}!="partition", \
+ENV{DM_MULTIPATH_DEVICE_PATH}=="1", \
RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"

RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"
+ACTION!="change", GOTO="update_timestamp"
+IMPORT{db}="DM_MULTIPATH_TIMESTAMP"
+IMPORT{db}="DM_MULTIPATH_DEVICE_PATH"
@ -259,39 +259,39 @@ Index: multipath-tools-130222/multipathd/main.c @@ -259,39 +259,39 @@ Index: multipath-tools-130222/multipathd/main.c
#include <uevent.h>
#include <log.h>
+#include <file.h>

#include "main.h"
#include "pidfile.h"
@@ -1417,6 +1418,7 @@ reconfigure (struct vectors * vecs)
free_config(old);
retval = 0;
}
free_config(old);
retval = 0;
}
+ update_timestamp(0);

return retval;
return retval;
}
@@ -1709,6 +1711,7 @@ child (void * param)

/* Startup complete, create logfile */
pid_rc = pidfile_create(DEFAULT_PIDFILE, daemon_pid);
/* Startup complete, create logfile */
pid_rc = pidfile_create(DEFAULT_PIDFILE, daemon_pid);
+ update_timestamp(1);
/* Ignore errors, we can live without */

running_state = DAEMON_RUNNING;
/* Ignore errors, we can live without */
running_state = DAEMON_RUNNING;
@@ -1758,6 +1761,7 @@ child (void * param)
if (!pid_rc) {
condlog(3, "unlink pidfile");
unlink(DEFAULT_PIDFILE);
if (!pid_rc) {
condlog(3, "unlink pidfile");
unlink(DEFAULT_PIDFILE);
+ unlink(DEFAULT_TIMESTAMP_FILE);
}

condlog(2, "--------shut down-------");
}
condlog(2, "--------shut down-------");
Index: multipath-tools-130222/multipathd/multipathd.service
===================================================================
--- multipath-tools-130222.orig/multipathd/multipathd.service
+++ multipath-tools-130222/multipathd/multipathd.service
@@ -9,7 +9,7 @@ Conflicts=shutdown.target

[Service]
Type=forking
-PIDFile=/var/run/multipathd.pid
@ -309,31 +309,31 @@ Index: multipath-tools-130222/multipath/main.c @@ -309,31 +309,31 @@ Index: multipath-tools-130222/multipath/main.c
#include <wwids.h>
+#include <file.h>
#include "dev_t.h"

int logsink;
@@ -84,7 +85,7 @@ usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
- fprintf (stderr, " %s [-c|-w|-W] [-d] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
+ fprintf (stderr, " %s [-c|-w|-W] [-d] [-T tm:val] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
@@ -98,6 +99,9 @@ usage (char * progname)
" -f flush a multipath device map\n" \
" -F flush all multipath device maps\n" \
" -c check if a device should be a path in a multipath device\n" \
" -f flush a multipath device map\n" \
" -F flush all multipath device maps\n" \
" -c check if a device should be a path in a multipath device\n" \
+ " -T tm:val\n" \
+ " check if tm matches the multipathd timestamp. If so val is\n" \
+ " whether or not the device is a path in a multipath device\n" \
" -q allow queue_if_no_path when multipathd is not running\n"\
" -d dry run, do not create or update devmaps\n" \
" -t dump internal hardware table\n" \
" -q allow queue_if_no_path when multipathd is not running\n"\
" -d dry run, do not create or update devmaps\n" \
" -t dump internal hardware table\n" \
@@ -441,7 +445,31 @@ main (int argc, char *argv[])
extern char *optarg;
extern int optind;
int r = 1;
extern char *optarg;
extern int optind;
int r = 1;
-
+ long int timestamp = -1;
+ int valid = -1;
@ -360,24 +360,24 @@ Index: multipath-tools-130222/multipath/main.c @@ -360,24 +360,24 @@ Index: multipath-tools-130222/multipath/main.c
+ }
+ }
+ optind = 1;
if (getuid() != 0) {
fprintf(stderr, "need to be root\n");
exit(1);
if (getuid() != 0) {
fprintf(stderr, "need to be root\n");
exit(1);
@@ -455,7 +483,7 @@ main (int argc, char *argv[])
if (dm_prereq())
exit(1);

if (dm_prereq())
exit(1);
- while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:BrtqwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
@@ -517,6 +545,8 @@ main (int argc, char *argv[])
case 't':
r = dump_config();
goto out;
case 't':
r = dump_config();
goto out;
+ case 'T':
+ break;
case 'h':
usage(argv[0]);
exit(0);
case 'h':
usage(argv[0]);
exit(0);

14
SOURCES/0065-UPBZ-995538-fail-rdac-on-unavailable.patch

@ -7,15 +7,15 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c @@ -7,15 +7,15 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c
--- multipath-tools-130222.orig/libmultipath/checkers/rdac.c
+++ multipath-tools-130222/libmultipath/checkers/rdac.c
@@ -222,10 +222,9 @@ libcheck_check (struct checker * c)
goto done;
}

goto done;
}
- /* check if controller is in service mode */
+ /* check if controller is reporting asymmetric access state of unavailable */
if ((inq.avtcvp & 0x10) &&
if ((inq.avtcvp & 0x10) &&
- ((inq.asym_access_state_cur & 0x0F) == 0x3) &&
- (inq.vendor_specific_cur == 0x7)) {
+ ((inq.asym_access_state_cur & 0x0F) == 0x3)) {
ret = PATH_DOWN;
goto done;
}
ret = PATH_DOWN;
goto done;
}

88
SOURCES/0066-UP-dos-4k-partition-fix.patch

@ -10,62 +10,62 @@ Index: multipath-tools-130222/kpartx/dos.c @@ -10,62 +10,62 @@ Index: multipath-tools-130222/kpartx/dos.c
--- multipath-tools-130222.orig/kpartx/dos.c
+++ multipath-tools-130222/kpartx/dos.c
@@ -26,7 +26,9 @@ read_extended_partition(int fd, struct p
int moretodo = 1;
int i, n=0;

int moretodo = 1;
int i, n=0;
- next = start = le32_to_cpu(ep->start_sect);
+ int sector_size_mul = get_sector_size(fd)/512;
+
+ next = start = sector_size_mul * le32_to_cpu(ep->start_sect);

while (moretodo) {
here = next;
while (moretodo) {
here = next;
@@ -45,14 +47,14 @@ read_extended_partition(int fd, struct p
memcpy(&p, bp + 0x1be + i * sizeof (p), sizeof (p));
if (is_extended(p.sys_type)) {
if (p.nr_sects && !moretodo) {
memcpy(&p, bp + 0x1be + i * sizeof (p), sizeof (p));
if (is_extended(p.sys_type)) {
if (p.nr_sects && !moretodo) {
- next = start + le32_to_cpu(p.start_sect);
+ next = start + sector_size_mul * le32_to_cpu(p.start_sect);
moretodo = 1;
}
continue;
}
if (n < ns) {
moretodo = 1;
}
continue;
}
if (n < ns) {
- sp[n].start = here + le32_to_cpu(p.start_sect);
- sp[n].size = le32_to_cpu(p.nr_sects);
+ sp[n].start = here + sector_size_mul * le32_to_cpu(p.start_sect);
+ sp[n].size = sector_size_mul * le32_to_cpu(p.nr_sects);
n++;
} else {
fprintf(stderr,
n++;
} else {
fprintf(stderr,
@@ -76,6 +78,7 @@ read_dos_pt(int fd, struct slice all, st
unsigned long offset = all.start;
int i, n=4;
unsigned char *bp;
unsigned long offset = all.start;
int i, n=4;
unsigned char *bp;
+ int sector_size_mul = get_sector_size(fd)/512;

bp = (unsigned char *)getblock(fd, offset);
if (bp == NULL)
bp = (unsigned char *)getblock(fd, offset);
if (bp == NULL)
@@ -89,8 +92,8 @@ read_dos_pt(int fd, struct slice all, st
if (is_gpt(p.sys_type))
return 0;
if (i < ns) {
if (is_gpt(p.sys_type))
return 0;
if (i < ns) {
- sp[i].start = le32_to_cpu(p.start_sect);
- sp[i].size = le32_to_cpu(p.nr_sects);
+ sp[i].start = sector_size_mul * le32_to_cpu(p.start_sect);
+ sp[i].size = sector_size_mul * le32_to_cpu(p.nr_sects);
} else {
fprintf(stderr,
"dos_partition: too many slices\n");
} else {
fprintf(stderr,
"dos_partition: too many slices\n");
@@ -99,7 +102,7 @@ read_dos_pt(int fd, struct slice all, st
if (is_extended(p.sys_type)) {
n += read_extended_partition(fd, &p, sp+n, ns-n);
/* hide the extended partition itself */
if (is_extended(p.sys_type)) {
n += read_extended_partition(fd, &p, sp+n, ns-n);
/* hide the extended partition itself */
- sp[i].size = 2;
+ sp[i].size = sector_size_mul * 2;
}
}
return n;
}
}
return n;
Index: multipath-tools-130222/kpartx/gpt.c
===================================================================
--- multipath-tools-130222.orig/kpartx/gpt.c
@ -75,12 +75,12 @@ Index: multipath-tools-130222/kpartx/gpt.c @@ -75,12 +75,12 @@ Index: multipath-tools-130222/kpartx/gpt.c
#include <linux/fs.h>
#include "crc32.h"
+#include "kpartx.h"

#if BYTE_ORDER == LITTLE_ENDIAN
# define __le16_to_cpu(x) (x)
@@ -116,25 +117,6 @@ is_pmbr_valid(legacy_mbr *mbr)


/************************************************************
- * get_sector_size
- * Requires:
@ -117,8 +117,8 @@ Index: multipath-tools-130222/kpartx/kpartx.c @@ -117,8 +117,8 @@ Index: multipath-tools-130222/kpartx/kpartx.c
#include <sys/types.h>
#include <ctype.h>
@@ -606,3 +607,14 @@ getblock (int fd, unsigned int secnr) {

return bp->block;
return bp->block;
}
+
+int
@ -137,16 +137,16 @@ Index: multipath-tools-130222/kpartx/kpartx.h @@ -137,16 +137,16 @@ Index: multipath-tools-130222/kpartx/kpartx.h
+++ multipath-tools-130222/kpartx/kpartx.h
@@ -2,6 +2,7 @@
#define _KPARTX_H

#include <stdint.h>
+#include <sys/ioctl.h>

/*
* For each partition type there is a routine that takes
@@ -18,6 +19,13 @@
#define safe_sprintf(var, format, args...) \
snprintf(var, sizeof(var), format, ##args) >= sizeof(var)

snprintf(var, sizeof(var), format, ##args) >= sizeof(var)
+#ifndef BLKSSZGET
+#define BLKSSZGET _IO(0x12,104) /* get block device sector size */
+#endif

16
SOURCES/0067-RHBZ-1022899-fix-udev-partition-handling.patch

@ -7,13 +7,13 @@ Index: multipath-tools-130222/multipath/multipath.rules @@ -7,13 +7,13 @@ Index: multipath-tools-130222/multipath/multipath.rules
--- multipath-tools-130222.orig/multipath/multipath.rules
+++ multipath-tools-130222/multipath/multipath.rules
@@ -13,12 +13,13 @@ ACTION=="add", ENV{DM_MULTIPATH_DEVICE_P
PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \
ENV{DM_MULTIPATH_DEVICE_PATH}="1", ENV{ID_FS_TYPE}="mpath_member"

PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -c $tempnode", \
ENV{DM_MULTIPATH_DEVICE_PATH}="1", ENV{ID_FS_TYPE}="mpath_member"
-ENV{DM_MULTIPATH_DEVICE_PATH}=="1", \
+ENV{DM_MULTIPATH_DEVICE_PATH}=="1", ENV{DM_MULTIPATH_WIPE_PARTS}="1", \
RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"

RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"
ACTION!="change", GOTO="update_timestamp"
IMPORT{db}="DM_MULTIPATH_TIMESTAMP"
IMPORT{db}="DM_MULTIPATH_DEVICE_PATH"
@ -22,16 +22,16 @@ Index: multipath-tools-130222/multipath/multipath.rules @@ -22,16 +22,16 @@ Index: multipath-tools-130222/multipath/multipath.rules
# the old result if the timestamp hasn't changed.
PROGRAM=="$env{MPATH_SBIN_PATH}/multipath -T $env{DM_MULTIPATH_TIMESTAMP}:$env{DM_MULTIPATH_DEVICE_PATH} -c $env{DEVNAME}", \
@@ -27,8 +28,13 @@ PROGRAM=="$env{MPATH_SBIN_PATH}/multipat

# If the device isn't part of a multipath device, clear this
ENV{DM_MULTIPATH_DEVICE_PATH}=""
+ENV{DM_MULTIPATH_WIPE_PARTS}=""

LABEL="update_timestamp"
+ENV{DM_MULTIPATH_DEVICE_PATH}=="1", ENV{DM_MULTIPATH_WIPE_PARTS}!="1", \
+ ENV{DM_MULTIPATH_WIPE_PARTS}="1", \
+ RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}"
+
IMPORT{file}="/run/multipathd/timestamp"

LABEL="check_kpartx"

2
SOURCES/0068-RHBZ-1034578-label-partition-devices.patch

@ -7,7 +7,7 @@ Index: multipath-tools-130222/multipath/multipath.rules @@ -7,7 +7,7 @@ Index: multipath-tools-130222/multipath/multipath.rules
--- multipath-tools-130222.orig/multipath/multipath.rules
+++ multipath-tools-130222/multipath/multipath.rules
@@ -4,7 +4,8 @@ SUBSYSTEM!="block", GOTO="end_mpath"

IMPORT{cmdline}="nompath"
ENV{nompath}=="?*", GOTO="end_mpath"
-ENV{DEVTYPE}=="partition", GOTO="end_mpath"

67
SOURCES/0069-UPBZ-1033791-improve-rdac-checker.patch

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
---
libmultipath/checkers/rdac.c | 91 ++++++++++++++++++++++++++++++++++++++-----
libmultipath/discovery.c | 2
libmultipath/discovery.c | 2
2 files changed, 81 insertions(+), 12 deletions(-)

Index: multipath-tools-130222/libmultipath/checkers/rdac.c
@ -23,24 +23,24 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c @@ -23,24 +23,24 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c
+#define RTPG_UNAVAIL_CFW_DL2 0x5
+#define RTPG_UNAVAIL_QUIESCED 0x6
+#define RTPG_UNAVAIL_SERVICE_MODE 0x7

struct control_mode_page {
unsigned char header[8];
unsigned char header[8];
@@ -199,22 +211,64 @@ struct volume_access_inq
char PQ_PDT;
char dontcare0[7];
char avtcvp;
char PQ_PDT;
char dontcare0[7];
char avtcvp;
- char dontcare1;
- char asym_access_state_cur;
+ char vol_ppp;
+ char aas_cur;
char vendor_specific_cur;
char vendor_specific_cur;
- char dontcare2[36];
+ char aas_alt;
+ char vendor_specific_alt;
+ char dontcare1[34];
};

+const char
+*checker_msg_string(struct volume_access_inq *inq)
+{
@ -82,23 +82,23 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c @@ -82,23 +82,23 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c
extern int
libcheck_check (struct checker * c)
{
struct volume_access_inq inq;
struct volume_access_inq inq;
- int ret;
+ int ret, inqfail;

+ inqfail = 0;
memset(&inq, 0, sizeof(struct volume_access_inq));
if (0 != do_inq(c->fd, 0xC9, &inq, sizeof(struct volume_access_inq),
c->timeout)) {
ret = PATH_DOWN;
memset(&inq, 0, sizeof(struct volume_access_inq));
if (0 != do_inq(c->fd, 0xC9, &inq, sizeof(struct volume_access_inq),
c->timeout)) {
ret = PATH_DOWN;
+ inqfail = 1;
goto done;
} else if (((inq.PQ_PDT & 0xE0) == 0x20) || (inq.PQ_PDT & 0x7f)) {
/* LUN not connected*/
goto done;
} else if (((inq.PQ_PDT & 0xE0) == 0x20) || (inq.PQ_PDT & 0x7f)) {
/* LUN not connected*/
@@ -222,11 +276,27 @@ libcheck_check (struct checker * c)
goto done;
}

goto done;
}
- /* check if controller is reporting asymmetric access state of unavailable */
- if ((inq.avtcvp & 0x10) &&
- ((inq.asym_access_state_cur & 0x0F) == 0x3)) {
@ -125,28 +125,29 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c @@ -125,28 +125,29 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c
+ }
+ break;
+ }
}

/* If owner set or ioship mode is enabled return PATH_UP always */
}
/* If owner set or ioship mode is enabled return PATH_UP always */
@@ -238,7 +308,8 @@ libcheck_check (struct checker * c)
done:
switch (ret) {
case PATH_DOWN:
switch (ret) {
case PATH_DOWN:
- MSG(c, MSG_RDAC_DOWN);
+ MSG(c, (inqfail) ? MSG_RDAC_DOWN_TYPE("inquiry failed") :
+ checker_msg_string(&inq));
break;
case PATH_UP:
MSG(c, MSG_RDAC_UP);
break;
case PATH_UP:
MSG(c, MSG_RDAC_UP);
Index: multipath-tools-130222/libmultipath/discovery.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -1116,8 +1116,6 @@ pathinfo (struct path *pp, vector hwtabl
if (!strlen(pp->wwid))
get_uid(pp);
get_prio(pp);
if (!strlen(pp->wwid))
get_uid(pp);
get_prio(pp);
- } else {
- pp->priority = PRIO_UNDEF;
}
}
}
}

12
SOURCES/0070-RHBZ-1036503-blacklist-td-devs.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/blacklist.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/libmultipath/blacklist.c
--- multipath-tools-130222.orig/libmultipath/blacklist.c
+++ multipath-tools-130222/libmultipath/blacklist.c
@@ -163,7 +163,7 @@ setup_default_blist (struct config * con
if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
return 1;

if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
return 1;
- str = STRDUP("^hd[a-z]");
+ str = STRDUP("^(td|hd)[a-z]");
if (!str)
return 1;
if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))
if (!str)
return 1;
if (store_ble(conf->blist_devnode, str, ORIGIN_DEFAULT))

251
SOURCES/0071-RHBZ-1031546-strip-dev.patch

@ -10,9 +10,9 @@ Index: multipath-tools-130222/libmultipath/util.c @@ -10,9 +10,9 @@ Index: multipath-tools-130222/libmultipath/util.c
--- multipath-tools-130222.orig/libmultipath/util.c
+++ multipath-tools-130222/libmultipath/util.c
@@ -236,6 +236,28 @@ skip_proc:
return 0;
return 0;
}

+/* This function returns a pointer inside of the supplied pathname string.
+ * If is_path_device is true, it may also modify the supplied string */
+char *convert_dev(char *name, int is_path_device)
@ -37,7 +37,7 @@ Index: multipath-tools-130222/libmultipath/util.c @@ -37,7 +37,7 @@ Index: multipath-tools-130222/libmultipath/util.c
+
dev_t parse_devt(const char *dev_t)
{
int maj, min;
int maj, min;
Index: multipath-tools-130222/libmultipath/util.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/util.h
@ -47,17 +47,17 @@ Index: multipath-tools-130222/libmultipath/util.h @@ -47,17 +47,17 @@ Index: multipath-tools-130222/libmultipath/util.h
int devt2devname (char *, int, char *);
dev_t parse_devt(const char *dev_t);
+char *convert_dev(char *dev, int is_path_device);

#define safe_sprintf(var, format, args...) \
snprintf(var, sizeof(var), format, ##args) >= sizeof(var)
snprintf(var, sizeof(var), format, ##args) >= sizeof(var)
Index: multipath-tools-130222/multipath/main.c
===================================================================
--- multipath-tools-130222.orig/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -254,16 +254,7 @@ configure (void)
vecs.pathvec = pathvec;
vecs.mpvec = curmp;

vecs.pathvec = pathvec;
vecs.mpvec = curmp;
- /*
- * dev is "/dev/" . "sysfs block dev"
- */
@ -69,13 +69,13 @@ Index: multipath-tools-130222/multipath/main.c @@ -69,13 +69,13 @@ Index: multipath-tools-130222/multipath/main.c
- dev = conf->dev;
- }
+ dev = convert_dev(conf->dev, (conf->dev_type == DEV_DEVNODE));

/*
* if we have a blacklisted device parameter, exit early
/*
* if we have a blacklisted device parameter, exit early
@@ -427,16 +418,6 @@ get_dev_type(char *dev) {
return DEV_DEVMAP;
return DEV_DEVMAP;
}

-static void
-convert_dev(char *dev)
-{
@ -90,158 +90,159 @@ Index: multipath-tools-130222/multipath/main.c @@ -90,158 +90,159 @@ Index: multipath-tools-130222/multipath/main.c
main (int argc, char *argv[])
{
@@ -577,8 +558,6 @@ main (int argc, char *argv[])

strncpy(conf->dev, argv[optind], FILE_NAME_SIZE);
conf->dev_type = get_dev_type(conf->dev);
strncpy(conf->dev, argv[optind], FILE_NAME_SIZE);
conf->dev_type = get_dev_type(conf->dev);
- if (conf->dev_type == DEV_DEVNODE)
- convert_dev(conf->dev);
}
conf->daemon = 0;

}
conf->daemon = 0;
Index: multipath-tools-130222/multipathd/cli_handlers.c
===================================================================
--- multipath-tools-130222.orig/multipathd/cli_handlers.c
+++ multipath-tools-130222/multipathd/cli_handlers.c
@@ -235,6 +235,7 @@ cli_list_map_topology (void * v, char **
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);

struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
+ param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);

get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);
@@ -416,6 +417,7 @@ cli_add_path (void * v, char ** reply, i
struct path *pp;
int r;

struct path *pp;
int r;
+ param = convert_dev(param, 1);
condlog(2, "%s: add path (operator)", param);

if (filter_devnode(conf->blist_devnode, conf->elist_devnode,
condlog(2, "%s: add path (operator)", param);
if (filter_devnode(conf->blist_devnode, conf->elist_devnode,
@@ -459,6 +461,7 @@ cli_del_path (void * v, char ** reply, i
char * param = get_keyparam(v, PATH);
struct path *pp;

char * param = get_keyparam(v, PATH);
struct path *pp;
+ param = convert_dev(param, 1);
condlog(2, "%s: remove path (operator)", param);
pp = find_path_by_dev(vecs->pathvec, param);
if (!pp) {
condlog(2, "%s: remove path (operator)", param);
pp = find_path_by_dev(vecs->pathvec, param);
if (!pp) {
@@ -478,6 +481,7 @@ cli_add_map (void * v, char ** reply, in
char *alias;
int rc;

char *alias;
int rc;
+ param = convert_dev(param, 0);
condlog(2, "%s: add map (operator)", param);

if (filter_wwid(conf->blist_wwid, conf->elist_wwid, param) > 0) {
condlog(2, "%s: add map (operator)", param);
if (filter_wwid(conf->blist_wwid, conf->elist_wwid, param) > 0) {
@@ -518,6 +522,7 @@ cli_del_map (void * v, char ** reply, in
char *alias;
int rc;

char *alias;
int rc;
+ param = convert_dev(param, 0);
condlog(2, "%s: remove map (operator)", param);
minor = dm_get_minor(param);
if (minor < 0) {
condlog(2, "%s: remove map (operator)", param);
minor = dm_get_minor(param);
if (minor < 0) {
@@ -549,6 +554,7 @@ cli_reload(void *v, char **reply, int *l
struct multipath *mpp;
int minor;

struct multipath *mpp;
int minor;
+ mapname = convert_dev(mapname, 0);
condlog(2, "%s: reload map (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
condlog(2, "%s: reload map (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
@@ -591,6 +597,7 @@ cli_resize(void *v, char **reply, int *l
struct pathgroup *pgp;
struct path *pp;

struct pathgroup *pgp;
struct path *pp;
+ mapname = convert_dev(mapname, 0);
condlog(2, "%s: resize map (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
condlog(2, "%s: resize map (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
@@ -665,6 +672,7 @@ cli_restore_queueing(void *v, char **rep
struct multipath *mpp;
int minor;

struct multipath *mpp;
int minor;
+ mapname = convert_dev(mapname, 0);
condlog(2, "%s: restore map queueing (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
condlog(2, "%s: restore map queueing (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
@@ -716,6 +724,7 @@ cli_disable_queueing(void *v, char **rep
struct multipath *mpp;
int minor;

struct multipath *mpp;
int minor;
+ mapname = convert_dev(mapname, 0);
condlog(2, "%s: disable map queueing (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
condlog(2, "%s: disable map queueing (operator)", mapname);
if (sscanf(mapname, "dm-%d", &minor) == 1)
mpp = find_mp_by_minor(vecs->mpvec, minor);
@@ -753,6 +762,7 @@ cli_switch_group(void * v, char ** reply
char * mapname = get_keyparam(v, MAP);
int groupnum = atoi(get_keyparam(v, GROUP));

char * mapname = get_keyparam(v, MAP);
int groupnum = atoi(get_keyparam(v, GROUP));
+ mapname = convert_dev(mapname, 0);
condlog(2, "%s: switch to path group #%i (operator)", mapname, groupnum);

return dm_switchgroup(mapname, groupnum);
condlog(2, "%s: switch to path group #%i (operator)", mapname, groupnum);
return dm_switchgroup(mapname, groupnum);
@@ -775,6 +785,7 @@ cli_suspend(void * v, char ** reply, int
char * param = get_keyparam(v, MAP);
int r = dm_simplecmd_noflush(DM_DEVICE_SUSPEND, param);

char * param = get_keyparam(v, MAP);
int r = dm_simplecmd_noflush(DM_DEVICE_SUSPEND, param);
+ param = convert_dev(param, 0);
condlog(2, "%s: suspend (operator)", param);

if (!r) /* error */
condlog(2, "%s: suspend (operator)", param);
if (!r) /* error */
@@ -796,6 +807,7 @@ cli_resume(void * v, char ** reply, int
char * param = get_keyparam(v, MAP);
int r = dm_simplecmd_noflush(DM_DEVICE_RESUME, param);

char * param = get_keyparam(v, MAP);
int r = dm_simplecmd_noflush(DM_DEVICE_RESUME, param);
+ param = convert_dev(param, 0);
condlog(2, "%s: resume (operator)", param);

if (!r) /* error */
condlog(2, "%s: resume (operator)", param);
if (!r) /* error */
@@ -817,6 +829,7 @@ cli_reinstate(void * v, char ** reply, i
char * param = get_keyparam(v, PATH);
struct path * pp;

char * param = get_keyparam(v, PATH);
struct path * pp;
+ param = convert_dev(param, 1);
pp = find_path_by_dev(vecs->pathvec, param);

if (!pp)
pp = find_path_by_dev(vecs->pathvec, param);
if (!pp)
@@ -837,6 +850,7 @@ cli_reassign (void * v, char ** reply, i
{
char * param = get_keyparam(v, MAP);

char * param = get_keyparam(v, MAP);
+ param = convert_dev(param, 0);
condlog(3, "%s: reset devices (operator)", param);

dm_reassign(param);
condlog(3, "%s: reset devices (operator)", param);
dm_reassign(param);
@@ -851,6 +865,7 @@ cli_fail(void * v, char ** reply, int *
struct path * pp;
int r;

struct path * pp;
int r;
+ param = convert_dev(param, 1);
pp = find_path_by_dev(vecs->pathvec, param);

if (!pp)
pp = find_path_by_dev(vecs->pathvec, param);
if (!pp)
@@ -962,6 +977,7 @@ cli_getprstatus (void * v, char ** reply
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);

struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
+ param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);

get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);
@@ -991,6 +1007,7 @@ cli_setprstatus(void * v, char ** reply,
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);

struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
+ param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);

get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);
@@ -1013,6 +1030,7 @@ cli_unsetprstatus(void * v, char ** repl
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);

struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
+ param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);
get_path_layout(vecs->pathvec, 0);
mpp = find_mp_by_str(vecs->mpvec, param);

26
SOURCES/0072-RHBZ-1039199-check-loop-control.patch

@ -9,7 +9,7 @@ Index: multipath-tools-130222/kpartx/lopart.c @@ -9,7 +9,7 @@ Index: multipath-tools-130222/kpartx/lopart.c
@@ -32,6 +32,10 @@
#include "lopart.h"
#include "xstrncpy.h"

+#ifndef LOOP_CTL_GET_FREE
+#define LOOP_CTL_GET_FREE 0x4C82
+#endif
@ -18,15 +18,15 @@ Index: multipath-tools-130222/kpartx/lopart.c @@ -18,15 +18,15 @@ Index: multipath-tools-130222/kpartx/lopart.c
&& !defined (__s390x__)
#define int2ptr(x) ((void *) ((int) x))
@@ -140,14 +144,24 @@ find_unused_loop_device (void)

char dev[20];
char *loop_formats[] = { "/dev/loop%d", "/dev/loop/%d" };
char dev[20];
char *loop_formats[] = { "/dev/loop%d", "/dev/loop/%d" };
- int i, j, fd, somedev = 0, someloop = 0, loop_known = 0;
+ int i, j, fd, first = 0, somedev = 0, someloop = 0, loop_known = 0;
struct stat statbuf;
struct loop_info loopinfo;
FILE *procdev;

struct stat statbuf;
struct loop_info loopinfo;
FILE *procdev;
+ if (stat("/dev/loop-control", &statbuf) == 0 &&
+ S_ISCHR(statbuf.st_mode)) {
+ fd = open("/dev/loop-control", O_RDWR);
@ -37,10 +37,10 @@ Index: multipath-tools-130222/kpartx/lopart.c @@ -37,10 +37,10 @@ Index: multipath-tools-130222/kpartx/lopart.c
+ if (first < 0)
+ first = 0;
+ }
for (j = 0; j < SIZE(loop_formats); j++) {

for (j = 0; j < SIZE(loop_formats); j++) {
- for(i = 0; i < 256; i++) {
+ for(i = first; i < 256; i++) {
sprintf(dev, loop_formats[j], i);

if (stat (dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) {
sprintf(dev, loop_formats[j], i);
if (stat (dev, &statbuf) == 0 && S_ISBLK(statbuf.st_mode)) {

14
SOURCES/0073-RH-update-build-flags.patch

@ -9,12 +9,12 @@ Index: multipath-tools-130222/Makefile.inc @@ -9,12 +9,12 @@ Index: multipath-tools-130222/Makefile.inc
+++ multipath-tools-130222/Makefile.inc
@@ -39,7 +39,7 @@ GZIP = /bin/gzip -9 -c
INSTALL_PROGRAM = install

ifndef RPM_OPT_FLAGS
- RPM_OPT_FLAGS = -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4
+ RPM_OPT_FLAGS = -O2 -g -pipe -Wformat-security -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4
endif

LDFLAGS += -Wl,-z,relro
Index: multipath-tools-130222/libmultipath/checkers/rdac.c
===================================================================
@ -22,12 +22,12 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c @@ -22,12 +22,12 @@ Index: multipath-tools-130222/libmultipath/checkers/rdac.c
+++ multipath-tools-130222/libmultipath/checkers/rdac.c
@@ -308,8 +308,8 @@ libcheck_check (struct checker * c)
done:
switch (ret) {
case PATH_DOWN:
switch (ret) {
case PATH_DOWN:
- MSG(c, (inqfail) ? MSG_RDAC_DOWN_TYPE("inquiry failed") :
- checker_msg_string(&inq));
+ MSG(c, "%s", (inqfail) ? MSG_RDAC_DOWN_TYPE("inquiry failed") :
+ checker_msg_string(&inq));
break;
case PATH_UP:
MSG(c, MSG_RDAC_UP);
break;
case PATH_UP:
MSG(c, MSG_RDAC_UP);

22
SOURCES/0074-RHBZ-1056976-dm-mpath-rules.patch

@ -47,18 +47,18 @@ Index: multipath-tools-130222/multipath/Makefile @@ -47,18 +47,18 @@ Index: multipath-tools-130222/multipath/Makefile
--- multipath-tools-130222.orig/multipath/Makefile
+++ multipath-tools-130222/multipath/Makefile
@@ -25,6 +25,7 @@ install:
$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)/usr/lib/udev/rules.d
$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/usr/lib/udev/rules.d/62-multipath.rules
$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)/usr/lib/udev/rules.d
$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)/usr/lib/udev/rules.d/62-multipath.rules
+ $(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)/usr/lib/udev/rules.d/11-dm-mpath.rules
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(mandir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
@@ -33,6 +34,7 @@ install:

uninstall:
rm $(DESTDIR)/usr/lib/udev/rules.d/62-multipath.rules
rm $(DESTDIR)/usr/lib/udev/rules.d/62-multipath.rules
+ rm $(DESTDIR)/usr/lib/udev/rules.d/11-dm-mpath.rules
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)$(bindir)/mpathconf
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz
rm $(DESTDIR)$(bindir)/$(EXEC)
rm $(DESTDIR)$(bindir)/mpathconf
rm $(DESTDIR)$(mandir)/$(EXEC).8.gz

198
SOURCES/0075-RHBZ-1056976-reload-flag.patch

@ -14,22 +14,22 @@ Index: multipath-tools-130222/kpartx/devmapper.c @@ -14,22 +14,22 @@ Index: multipath-tools-130222/kpartx/devmapper.c
+++ multipath-tools-130222/kpartx/devmapper.c
@@ -60,7 +60,7 @@ 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, uint16_t udev_flags) {
int r = 0;
int udev_wait_flag = (task == DM_DEVICE_RESUME ||
task == DM_DEVICE_REMOVE);
int r = 0;
int udev_wait_flag = (task == DM_DEVICE_RESUME ||
task == DM_DEVICE_REMOVE);
@@ -78,7 +78,7 @@ dm_simplecmd (int task, const char *name
if (no_flush)
dm_task_no_flush(dmt);

if (no_flush)
dm_task_no_flush(dmt);
- if (udev_wait_flag && !dm_task_set_cookie(dmt, cookie, (udev_sync)? 0 : DM_UDEV_DISABLE_LIBRARY_FALLBACK))
+ if (udev_wait_flag && !dm_task_set_cookie(dmt, cookie, ((udev_sync)? 0 : DM_UDEV_DISABLE_LIBRARY_FALLBACK) | udev_flags))
goto out;
r = dm_task_run(dmt);

goto out;
r = dm_task_run(dmt);
Index: multipath-tools-130222/kpartx/devmapper.h
===================================================================
--- multipath-tools-130222.orig/kpartx/devmapper.h
@ -37,7 +37,7 @@ Index: multipath-tools-130222/kpartx/devmapper.h @@ -37,7 +37,7 @@ Index: multipath-tools-130222/kpartx/devmapper.h
@@ -2,10 +2,16 @@
#define MINOR(dev) ((dev & 0xff) | ((dev >> 12) & 0xfff00))
#define MKDEV(ma,mi) ((mi & 0xff) | (ma << 8) | ((mi & ~0xff) << 12))

+#ifdef DM_SUBSYSTEM_UDEV_FLAG0
+#define MPATH_UDEV_RELOAD_FLAG DM_SUBSYSTEM_UDEV_FLAG0
+#else
@ -45,159 +45,159 @@ Index: multipath-tools-130222/kpartx/devmapper.h @@ -45,159 +45,159 @@ Index: multipath-tools-130222/kpartx/devmapper.h
+#endif
+
extern int udev_sync;

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 *, uint16_t);
int dm_addmap (int, const char *, const char *, const char *, uint64_t,
int, const char *, int, mode_t, uid_t, gid_t, uint32_t *);
int, const char *, int, mode_t, uid_t, gid_t, uint32_t *);
int dm_map_present (char *);
Index: multipath-tools-130222/kpartx/kpartx.c
===================================================================
--- multipath-tools-130222.orig/kpartx/kpartx.c
+++ multipath-tools-130222/kpartx/kpartx.c
@@ -421,7 +421,7 @@ main(int argc, char **argv){
continue;

if (!dm_simplecmd(DM_DEVICE_REMOVE, partname,
continue;
if (!dm_simplecmd(DM_DEVICE_REMOVE, partname,
- 0, &cookie)) {
+ 0, &cookie, 0)) {
r++;
continue;
}
r++;
continue;
}
@@ -473,7 +473,7 @@ main(int argc, char **argv){
}
if (op == DM_DEVICE_RELOAD &&
!dm_simplecmd(DM_DEVICE_RESUME, partname,
}
if (op == DM_DEVICE_RELOAD &&
!dm_simplecmd(DM_DEVICE_RESUME, partname,
- 1, &cookie)) {
+ 1, &cookie, MPATH_UDEV_RELOAD_FLAG)) {
fprintf(stderr, "resume failed on %s\n",
partname);
r++;
fprintf(stderr, "resume failed on %s\n",
partname);
r++;
@@ -505,7 +505,7 @@ main(int argc, char **argv){
continue;

if (!dm_simplecmd(DM_DEVICE_REMOVE,
continue;
if (!dm_simplecmd(DM_DEVICE_REMOVE,
- partname, 1, &cookie)) {
+ partname, 1, &cookie, 0)) {
r++;
continue;
}
r++;
continue;
}
Index: multipath-tools-130222/libmultipath/configure.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -390,13 +390,13 @@ domap (struct multipath * mpp, char * pa
case ACT_RELOAD:
r = dm_addmap_reload(mpp, params);
if (r)
case ACT_RELOAD:
r = dm_addmap_reload(mpp, params);
if (r)
- r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias);
+ r = dm_simplecmd_noflush(DM_DEVICE_RESUME, mpp->alias, MPATH_UDEV_RELOAD_FLAG);
break;

case ACT_RESIZE:
r = dm_addmap_reload(mpp, params);
if (r)
break;
case ACT_RESIZE:
r = dm_addmap_reload(mpp, params);
if (r)
- r = dm_simplecmd_flush(DM_DEVICE_RESUME, mpp->alias, 1);
+ r = dm_simplecmd_flush(DM_DEVICE_RESUME, mpp->alias, 1, 0);
break;

case ACT_RENAME:
break;
case ACT_RENAME:
Index: multipath-tools-130222/libmultipath/devmapper.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -103,7 +103,9 @@ dm_lib_prereq (void)
{
char version[64];
int v[3];
char version[64];
int v[3];
-#ifdef LIBDM_API_COOKIE
+#if defined(DM_SUBSYSTEM_UDEV_FLAG0)
+ int minv[3] = {1, 2, 82};
+#elif defined(LIBDM_API_COOKIE)
int minv[3] = {1, 2, 38};
int minv[3] = {1, 2, 38};
#else
int minv[3] = {1, 2, 8};
int minv[3] = {1, 2, 8};
@@ -200,7 +202,7 @@ dm_prereq (void)
}

static int
-dm_simplecmd (int task, const char *name, int no_flush, int need_sync) {
+dm_simplecmd (int task, const char *name, int no_flush, int need_sync, uint16_t udev_flags) {
int r = 0;
int udev_wait_flag = (need_sync && (task == DM_DEVICE_RESUME ||
task == DM_DEVICE_REMOVE));
int r = 0;
int udev_wait_flag = (need_sync && (task == DM_DEVICE_RESUME ||
task == DM_DEVICE_REMOVE));
@@ -219,7 +221,7 @@ dm_simplecmd (int task, const char *name
dm_task_no_flush(dmt); /* for DM_DEVICE_SUSPEND/RESUME */
dm_task_no_flush(dmt); /* for DM_DEVICE_SUSPEND/RESUME */
#endif

- if (udev_wait_flag && !dm_task_set_cookie(dmt, &conf->cookie, (conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0))
+ if (udev_wait_flag && !dm_task_set_cookie(dmt, &conf->cookie, ((conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0) | udev_flags))
goto out;
r = dm_task_run (dmt);

goto out;
r = dm_task_run (dmt);
@@ -229,13 +231,13 @@ dm_simplecmd (int task, const char *name
}

extern int
-dm_simplecmd_flush (int task, const char *name, int needsync) {
- return dm_simplecmd(task, name, 0, needsync);
+dm_simplecmd_flush (int task, const char *name, int needsync, uint16_t udev_flags) {
+ return dm_simplecmd(task, name, 0, needsync, udev_flags);
}

extern int
-dm_simplecmd_noflush (int task, const char *name) {
- return dm_simplecmd(task, name, 1, 1);
+dm_simplecmd_noflush (int task, const char *name, uint16_t udev_flags) {
+ return dm_simplecmd(task, name, 1, 1, udev_flags);
}

extern int
@@ -670,7 +672,7 @@ _dm_flush_map (const char * mapname, int
return 1;
}

return 1;
}
- r = dm_simplecmd_flush(DM_DEVICE_REMOVE, mapname, need_sync);
+ r = dm_simplecmd_flush(DM_DEVICE_REMOVE, mapname, need_sync, 0);

if (r) {
condlog(4, "multipath map %s removed", mapname);
if (r) {
condlog(4, "multipath map %s removed", mapname);
@@ -703,14 +705,14 @@ dm_suspend_and_flush_map (const char * m
if (s)
queue_if_no_path = 0;
else
if (s)
queue_if_no_path = 0;
else
- s = dm_simplecmd_flush(DM_DEVICE_SUSPEND, mapname, 0);
+ s = dm_simplecmd_flush(DM_DEVICE_SUSPEND, mapname, 0, 0);

if (!dm_flush_map(mapname)) {
condlog(4, "multipath map %s removed", mapname);
return 0;
}
condlog(2, "failed to remove multipath map %s", mapname);
if (!dm_flush_map(mapname)) {
condlog(4, "multipath map %s removed", mapname);
return 0;
}
condlog(2, "failed to remove multipath map %s", mapname);
- dm_simplecmd_noflush(DM_DEVICE_RESUME, mapname);
+ dm_simplecmd_noflush(DM_DEVICE_RESUME, mapname, 0);
if (queue_if_no_path)
s = dm_queue_if_no_path((char *)mapname, 1);
return 1;
if (queue_if_no_path)
s = dm_queue_if_no_path((char *)mapname, 1);
return 1;
@@ -1077,7 +1079,7 @@ dm_remove_partmaps (const char * mapname
condlog(4, "partition map %s removed",
names->name);
dm_simplecmd_flush(DM_DEVICE_REMOVE, names->name,
condlog(4, "partition map %s removed",
names->name);
dm_simplecmd_flush(DM_DEVICE_REMOVE, names->name,
- need_sync);
+ need_sync, 0);
}

next = names->next;
}
next = names->next;
@@ -1305,7 +1307,7 @@ int dm_reassign_table(const char *name,
condlog(3, "%s: failed to reassign targets", name);
goto out_reload;
}
condlog(3, "%s: failed to reassign targets", name);
goto out_reload;
}
- dm_simplecmd_noflush(DM_DEVICE_RESUME, name);
+ dm_simplecmd_noflush(DM_DEVICE_RESUME, name, MPATH_UDEV_RELOAD_FLAG);
}
r = 1;

}
r = 1;
Index: multipath-tools-130222/libmultipath/devmapper.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.h
@ -205,7 +205,7 @@ Index: multipath-tools-130222/libmultipath/devmapper.h @@ -205,7 +205,7 @@ Index: multipath-tools-130222/libmultipath/devmapper.h
@@ -6,11 +6,17 @@
#define TGT_MPATH "multipath"
#define TGT_PART "linear"

+#ifdef DM_SUBSYSTEM_UDEV_FLAG0
+#define MPATH_UDEV_RELOAD_FLAG DM_SUBSYSTEM_UDEV_FLAG0
+#else
@ -228,19 +228,19 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c @@ -228,19 +228,19 @@ Index: multipath-tools-130222/multipathd/cli_handlers.c
+++ multipath-tools-130222/multipathd/cli_handlers.c
@@ -783,7 +783,7 @@ cli_suspend(void * v, char ** reply, int
{
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
- int r = dm_simplecmd_noflush(DM_DEVICE_SUSPEND, param);
+ int r = dm_simplecmd_noflush(DM_DEVICE_SUSPEND, param, 0);

param = convert_dev(param, 0);
condlog(2, "%s: suspend (operator)", param);
param = convert_dev(param, 0);
condlog(2, "%s: suspend (operator)", param);
@@ -805,7 +805,7 @@ cli_resume(void * v, char ** reply, int
{
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, MAP);
- int r = dm_simplecmd_noflush(DM_DEVICE_RESUME, param);
+ int r = dm_simplecmd_noflush(DM_DEVICE_RESUME, param, 0);

param = convert_dev(param, 0);
condlog(2, "%s: resume (operator)", param);
param = convert_dev(param, 0);
condlog(2, "%s: resume (operator)", param);

62
SOURCES/0076-RHBZ-1056686-add-hw_str_match.patch

@ -10,52 +10,52 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -10,52 +10,52 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -431,11 +431,16 @@ restart:
break;
j = n;
vector_foreach_slot_after(hw, hwe2, j) {
break;
j = n;
vector_foreach_slot_after(hw, hwe2, j) {
- if (hwe_regmatch(hwe1, hwe2))
+ if (conf->hw_strmatch) {
+ if (hwe_strmatch(hwe2, hwe1))
+ continue;
+ }
+ else if (hwe_regmatch(hwe1, hwe2))
continue;
/* dup */
merge_hwe(hwe2, hwe1);
continue;
/* dup */
merge_hwe(hwe2, hwe1);
- if (hwe_strmatch(hwe2, hwe1) == 0) {
+ if (conf->hw_strmatch ||
+ hwe_strmatch(hwe2, hwe1) == 0) {
vector_del_slot(hw, i);
free_hwe(hwe1);
n -= 1;
vector_del_slot(hw, i);
free_hwe(hwe1);
n -= 1;
@@ -550,6 +555,7 @@ load_config (char * file, struct udev *u
conf->fast_io_fail = DEFAULT_FAST_IO_FAIL;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
conf->fast_io_fail = DEFAULT_FAST_IO_FAIL;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
+ conf->hw_strmatch = 0;

/*
* preload default hwtable
/*
* preload default hwtable
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -107,6 +107,7 @@ struct config {
int log_checker_err;
int allow_queueing;
int find_multipaths;
int log_checker_err;
int allow_queueing;
int find_multipaths;
+ int hw_strmatch;
uid_t uid;
gid_t gid;
mode_t mode;
uid_t uid;
gid_t gid;
mode_t mode;
Index: multipath-tools-130222/libmultipath/dict.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -693,6 +693,25 @@ def_detect_prio_handler(vector strvec)
return 0;
return 0;
}

+static int
+def_hw_strmatch_handler(vector strvec)
+{
@ -80,7 +80,7 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -80,7 +80,7 @@ Index: multipath-tools-130222/libmultipath/dict.c
*/
@@ -2795,6 +2814,14 @@ snprint_def_detect_prio(char * buff, int
}

static int
+snprint_def_hw_strmatch(char * buff, int len, void * data)
+{
@ -92,15 +92,15 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -92,15 +92,15 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_ble_simple (char * buff, int len, void * data)
{
struct blentry * ble = (struct blentry *)data;
struct blentry * ble = (struct blentry *)data;
@@ -2861,6 +2888,7 @@ init_keywords(void)
install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths);
install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths);
install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
+ install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
Index: multipath-tools-130222/multipath/multipath.conf.5
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.conf.5

8
SOURCES/0077-RHBZ-1054806-mpathconf-always-reload.patch

@ -7,10 +7,10 @@ Index: multipath-tools-130222/multipath/mpathconf @@ -7,10 +7,10 @@ Index: multipath-tools-130222/multipath/mpathconf
--- multipath-tools-130222.orig/multipath/mpathconf
+++ multipath-tools-130222/multipath/mpathconf
@@ -316,6 +316,6 @@ elif [ "$ENABLE" = 0 ]; then
if [ "$HAVE_MULTIPATHD" = 1 ]; then
systemctl stop multipathd.service
fi
if [ "$HAVE_MULTIPATHD" = 1 ]; then
systemctl stop multipathd.service
fi
-elif [ -n "$CHANGED_CONFIG" -a "$HAVE_MULTIPATHD" = 1 ]; then
+elif [ "$HAVE_MULTIPATHD" = 1 ]; then
systemctl reload multipathd.service
systemctl reload multipathd.service
fi

70
SOURCES/0079-RHBZ-1070581-add-wwid-option.patch

@ -9,25 +9,25 @@ Index: multipath-tools-130222/multipath/main.c @@ -9,25 +9,25 @@ Index: multipath-tools-130222/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -85,7 +85,7 @@ usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
- fprintf (stderr, " %s [-c|-w|-W] [-d] [-T tm:val] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
+ fprintf (stderr, " %s [-a|-c|-w|-W] [-d] [-T tm:val] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
@@ -98,6 +98,7 @@ usage (char * progname)
" -ll show multipath topology (maximum info)\n" \
" -f flush a multipath device map\n" \
" -F flush all multipath device maps\n" \
" -ll show multipath topology (maximum info)\n" \
" -f flush a multipath device map\n" \
" -F flush all multipath device maps\n" \
+ " -a add a device wwid to the wwids file\n" \
" -c check if a device should be a path in a multipath device\n" \
" -T tm:val\n" \
" check if tm matches the multipathd timestamp. If so val is\n" \
" -c check if a device should be a path in a multipath device\n" \
" -T tm:val\n" \
" check if tm matches the multipathd timestamp. If so val is\n" \
@@ -292,6 +293,15 @@ configure (void)
}
goto out;
}
}
goto out;
}
+ if (conf->dry_run == 5) {
+ r = remember_wwid(refwwid);
+ if (r == 0)
@ -37,37 +37,37 @@ Index: multipath-tools-130222/multipath/main.c @@ -37,37 +37,37 @@ Index: multipath-tools-130222/multipath/main.c
+ refwwid);
+ goto out;
+ }
condlog(3, "scope limited to %s", refwwid);
if (conf->dry_run == 2) {
if (check_wwids_file(refwwid, 0) == 0){
condlog(3, "scope limited to %s", refwwid);
if (conf->dry_run == 2) {
if (check_wwids_file(refwwid, 0) == 0){
@@ -428,7 +438,7 @@ main (int argc, char *argv[])
int r = 1;
long int timestamp = -1;
int valid = -1;
int r = 1;
long int timestamp = -1;
int valid = -1;
- while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":adchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
switch(arg) {
case 'T':
if (optarg[0] == ':')
switch(arg) {
case 'T':
if (optarg[0] == ':')
@@ -464,7 +474,7 @@ main (int argc, char *argv[])
if (dm_prereq())
exit(1);

if (dm_prereq())
exit(1);
- while ((arg = getopt(argc, argv, ":dchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":adchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
@@ -537,6 +547,9 @@ main (int argc, char *argv[])
case 'W':
conf->dry_run = 4;
break;
case 'W':
conf->dry_run = 4;
break;
+ case 'a':
+ conf->dry_run = 5;
+ break;
case ':':
fprintf(stderr, "Missing option argument\n");
usage(argv[0]);
case ':':
fprintf(stderr, "Missing option argument\n");
usage(argv[0]);
Index: multipath-tools-130222/multipath/multipath.8
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.8

68
SOURCES/0080-RHBZ-1075796-cmdline-wwid.patch

@ -1,9 +1,9 @@ @@ -1,9 +1,9 @@
---
libmultipath/wwids.c | 44 ++++++++++++++++++++++++++++++++++++++++++
libmultipath/wwids.h | 1
libmultipath/wwids.h | 1
multipath/main.c | 12 ++++++++---
multipath/multipath.8 | 5 +++-
multipathd/multipathd.service | 1
multipathd/multipathd.service | 1
5 files changed, 59 insertions(+), 4 deletions(-)

Index: multipath-tools-130222/libmultipath/wwids.c
@ -11,8 +11,8 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -11,8 +11,8 @@ Index: multipath-tools-130222/libmultipath/wwids.c
--- multipath-tools-130222.orig/libmultipath/wwids.c
+++ multipath-tools-130222/libmultipath/wwids.c
@@ -305,3 +305,47 @@ remember_wwid(char *wwid)
condlog(4, "wwid %s already in wwids file", wwid);
return 0;
condlog(4, "wwid %s already in wwids file", wwid);
return 0;
}
+
+int remember_cmdline_wwid(void)
@ -67,7 +67,7 @@ Index: multipath-tools-130222/libmultipath/wwids.h @@ -67,7 +67,7 @@ Index: multipath-tools-130222/libmultipath/wwids.h
int remove_wwid(char *wwid);
int replace_wwids(vector mp);
+int remember_cmdline_wwid(void);

#endif /* _WWIDS_H */
Index: multipath-tools-130222/multipath/main.c
===================================================================
@ -75,51 +75,51 @@ Index: multipath-tools-130222/multipath/main.c @@ -75,51 +75,51 @@ Index: multipath-tools-130222/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -85,7 +85,7 @@ usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
- fprintf (stderr, " %s [-a|-c|-w|-W] [-d] [-T tm:val] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
+ fprintf (stderr, " %s [-a|-A|-c|-w|-W] [-d] [-T tm:val] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
@@ -99,6 +99,8 @@ usage (char * progname)
" -f flush a multipath device map\n" \
" -F flush all multipath device maps\n" \
" -a add a device wwid to the wwids file\n" \
" -f flush a multipath device map\n" \
" -F flush all multipath device maps\n" \
" -a add a device wwid to the wwids file\n" \
+ " -A add devices from kernel command line mpath.wwids\n"
+ " parameters to wwids file\n" \
" -c check if a device should be a path in a multipath device\n" \
" -T tm:val\n" \
" check if tm matches the multipathd timestamp. If so val is\n" \
" -c check if a device should be a path in a multipath device\n" \
" -T tm:val\n" \
" check if tm matches the multipathd timestamp. If so val is\n" \
@@ -438,7 +440,7 @@ main (int argc, char *argv[])
int r = 1;
long int timestamp = -1;
int valid = -1;
int r = 1;
long int timestamp = -1;
int valid = -1;
- while ((arg = getopt(argc, argv, ":adchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":aAdchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
switch(arg) {
case 'T':
if (optarg[0] == ':')
switch(arg) {
case 'T':
if (optarg[0] == ':')
@@ -474,7 +476,7 @@ main (int argc, char *argv[])
if (dm_prereq())
exit(1);

if (dm_prereq())
exit(1);
- while ((arg = getopt(argc, argv, ":adchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":aAdchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
@@ -538,6 +540,10 @@ main (int argc, char *argv[])
goto out;
case 'T':
break;
goto out;
case 'T':
break;
+ case 'A':
+ if (remember_cmdline_wwid() != 0)
+ exit(1);
+ exit(0);
case 'h':
usage(argv[0]);
exit(0);
case 'h':
usage(argv[0]);
exit(0);
Index: multipath-tools-130222/multipathd/multipathd.service
===================================================================
--- multipath-tools-130222.orig/multipathd/multipathd.service

36
SOURCES/0081-RHBZ-1066264-check-prefix-on-rename.patch

@ -7,35 +7,35 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -7,35 +7,35 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -1151,6 +1151,8 @@ dm_rename_partmaps (char * old, char * n
unsigned long long size;
char dev_t[32];
int r = 1;
unsigned long long size;
char dev_t[32];
int r = 1;
+ int offset;
+ char *delim;

if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
return 1;
if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
return 1;
@@ -1171,6 +1173,11 @@ dm_rename_partmaps (char * old, char * n
if (dm_dev_t(old, &dev_t[0], 32))
goto out;

if (dm_dev_t(old, &dev_t[0], 32))
goto out;
+ if (isdigit(new[strlen(new)-1]))
+ delim = "p";
+ else
+ delim = "";
+
do {
if (
/*
do {
if (
/*
@@ -1198,8 +1205,9 @@ dm_rename_partmaps (char * old, char * n
* then it's a kpartx generated partition.
* Rename it.
*/
* then it's a kpartx generated partition.
* Rename it.
*/
- snprintf(buff, PARAMS_SIZE, "%s%s",
- new, names->name + strlen(old));
+ for (offset = strlen(old); names->name[offset] && !(isdigit(names->name[offset])); offset++); /* do nothing */
+ snprintf(buff, PARAMS_SIZE, "%s%s%s",
+ new, delim, names->name + offset);
dm_rename(names->name, buff);
condlog(4, "partition map %s renamed",
names->name);
dm_rename(names->name, buff);
condlog(4, "partition map %s renamed",
names->name);

26
SOURCES/0082-UPBZ-1109995-no-sync-turs-on-pthread_cancel.patch

@ -7,19 +7,19 @@ Index: multipath-tools-130222/libmultipath/checkers/tur.c @@ -7,19 +7,19 @@ Index: multipath-tools-130222/libmultipath/checkers/tur.c
--- multipath-tools-130222.orig/libmultipath/checkers/tur.c
+++ multipath-tools-130222/libmultipath/checkers/tur.c
@@ -409,7 +409,6 @@ libcheck_check (struct checker * c)
ct->running = 0;
MSG(c, MSG_TUR_TIMEOUT);
tur_status = PATH_DOWN;
ct->running = 0;
MSG(c, MSG_TUR_TIMEOUT);
tur_status = PATH_DOWN;
- ct->state = PATH_UNCHECKED;
} else {
condlog(3, "%d:%d: tur checker not finished",
TUR_DEVT(ct));
} else {
condlog(3, "%d:%d: tur checker not finished",
TUR_DEVT(ct));
@@ -426,12 +425,10 @@ libcheck_check (struct checker * c)
pthread_mutex_unlock(&ct->lock);
} else {
if (ct->thread) {
pthread_mutex_unlock(&ct->lock);
} else {
if (ct->thread) {
- /* pthread cancel failed. continue in sync mode */
pthread_mutex_unlock(&ct->lock);
pthread_mutex_unlock(&ct->lock);
- condlog(3, "%d:%d: tur thread not responding, "
- "using sync mode", TUR_DEVT(ct));
- return tur_check(c->fd, c->timeout, c->message,
@ -27,6 +27,6 @@ Index: multipath-tools-130222/libmultipath/checkers/tur.c @@ -27,6 +27,6 @@ Index: multipath-tools-130222/libmultipath/checkers/tur.c
+ condlog(3, "%d:%d: tur thread not responding, ",
+ TUR_DEVT(ct));
+ return PATH_DOWN;
}
/* Start new TUR checker */
ct->state = PATH_UNCHECKED;
}
/* Start new TUR checker */
ct->state = PATH_UNCHECKED;

58
SOURCES/0083-RHBZ-1080055-orphan-paths-on-reload.patch

@ -8,9 +8,9 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c @@ -8,9 +8,9 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c
--- multipath-tools-130222.orig/libmultipath/structs_vec.c
+++ multipath-tools-130222/libmultipath/structs_vec.c
@@ -280,12 +280,38 @@ update_multipath_status (struct multipat
return 0;
return 0;
}

+void sync_paths(struct multipath *mpp, vector pathvec)
+{
+ struct path *pp;
@ -39,47 +39,47 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c @@ -39,47 +39,47 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c
extern int
update_multipath_strings (struct multipath *mpp, vector pathvec)
{
if (!mpp)
return 1;

if (!mpp)
return 1;
+ update_mpp_paths(mpp, pathvec);
condlog(4, "%s: %s", mpp->alias, __FUNCTION__);

free_multipath_attributes(mpp);
condlog(4, "%s: %s", mpp->alias, __FUNCTION__);
free_multipath_attributes(mpp);
@@ -294,6 +320,7 @@ update_multipath_strings (struct multipa

if (update_multipath_table(mpp, pathvec))
return 1;
if (update_multipath_table(mpp, pathvec))
return 1;
+ sync_paths(mpp, pathvec);

if (update_multipath_status(mpp))
return 1;
if (update_multipath_status(mpp))
return 1;
@@ -494,13 +521,9 @@ int update_multipath (struct vectors *ve
return 2;
}

return 2;
}
- free_pgvec(mpp->pg, KEEP_PATHS);
- mpp->pg = NULL;
-
if (__setup_multipath(vecs, mpp, reset))
return 1; /* mpp freed in setup_multipath */

if (__setup_multipath(vecs, mpp, reset))
return 1; /* mpp freed in setup_multipath */
- adopt_paths(vecs->pathvec, mpp, 0);
/*
* compare checkers states with DM states
*/
/*
* compare checkers states with DM states
*/
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -1152,6 +1152,10 @@ check_path (struct vectors * vecs, struc
pp->dev);
pp->dmstate = PSTATE_UNDEF;
}
pp->dev);
pp->dmstate = PSTATE_UNDEF;
}
+ /* if update_multipath_strings orphaned the path, quit early */
+ if (!pp->mpp)
+ return;
+
pp->chkrstate = newstate;
if (newstate != pp->state) {
int oldstate = pp->state;
pp->chkrstate = newstate;
if (newstate != pp->state) {
int oldstate = pp->state;

24
SOURCES/0084-RHBZ-1110000-multipath-man.patch

@ -9,7 +9,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8 @@ -9,7 +9,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8
+++ multipath-tools-130222/multipathd/multipathd.8
@@ -42,6 +42,9 @@ format wildcards.
.B list|show maps|multipaths
Show the multipath devices that the multipathd is monitoring.
Show the multipath devices that the multipathd is monitoring.
.TP
+.B list|show daemon
+Show the current state of the multipathd daemon
@ -23,7 +23,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8 @@ -23,7 +23,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8
.TP
-.B add map $map
+.B add map|multipath $map
Add a multipath device to the list of monitored devices. $map can either be a device-mapper device as listed in /sys/block (e.g. dm-0) or it can be the alias for the multipath device (e.g. mpath1) or the uid of the multipath device (e.g. 36005076303ffc56200000000000010aa).
Add a multipath device to the list of monitored devices. $map can either be a device-mapper device as listed in /sys/block (e.g. dm-0) or it can be the alias for the multipath device (e.g. mpath1) or the uid of the multipath device (e.g. 36005076303ffc56200000000000010aa).
.TP
-.B remove|del map $map
+.B remove|del map|multipath $map
@ -31,7 +31,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8 @@ -31,7 +31,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8
.TP
.B resize map|multipath $map
Resizes map $map to the given size
.TP
.TP
-.B switch|switchgroup map $map group $group
+.B switch|switchgroup map|multipath $map group $group
Force a multipath device to switch to a specific path group. $group is the path group index, starting with 1.
@ -79,7 +79,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8 @@ -79,7 +79,7 @@ Index: multipath-tools-130222/multipathd/multipathd.8
+.TP
+.B shutdown
+Stop multipathd.

.SH "SEE ALSO"
.BR multipath (8)
Index: multipath-tools-130222/libmultipath/prioritizers/alua.c
@ -87,15 +87,15 @@ Index: multipath-tools-130222/libmultipath/prioritizers/alua.c @@ -87,15 +87,15 @@ Index: multipath-tools-130222/libmultipath/prioritizers/alua.c
--- multipath-tools-130222.orig/libmultipath/prioritizers/alua.c
+++ multipath-tools-130222/libmultipath/prioritizers/alua.c
@@ -119,10 +119,10 @@ int getprio (struct path * pp, char * ar
condlog(0, "%s: couldn't get target port group", pp->dev);
break;
case ALUA_PRIO_GETAAS_FAILED:
condlog(0, "%s: couldn't get target port group", pp->dev);
break;
case ALUA_PRIO_GETAAS_FAILED:
- condlog(0, "%s: couln't get asymmetric access state", pp->dev);
+ condlog(0, "%s: couldn't get asymmetric access state", pp->dev);
break;
case ALUA_PRIO_TPGS_FAILED:
break;
case ALUA_PRIO_TPGS_FAILED:
- condlog(3, "%s: couln't get supported alua states", pp->dev);
+ condlog(3, "%s: couldn't get supported alua states", pp->dev);
break;
}
}
break;
}
}

12
SOURCES/0085-UPBZ-1110006-datacore-config.patch

@ -7,9 +7,9 @@ Index: multipath-tools-130222/libmultipath/hwtable.c @@ -7,9 +7,9 @@ Index: multipath-tools-130222/libmultipath/hwtable.c
--- multipath-tools-130222.orig/libmultipath/hwtable.c
+++ multipath-tools-130222/libmultipath/hwtable.c
@@ -1108,6 +1108,19 @@ static struct hwentry default_hw[] = {
.prio_name = PRIO_ALUA,
.prio_args = NULL,
},
.prio_name = PRIO_ALUA,
.prio_args = NULL,
},
+ {
+ .vendor = "DataCore",
+ .product = "Virtual Disk",
@ -23,6 +23,6 @@ Index: multipath-tools-130222/libmultipath/hwtable.c @@ -23,6 +23,6 @@ Index: multipath-tools-130222/libmultipath/hwtable.c
+ .prio_name = PRIO_ALUA,
+ .prio_args = NULL,
+ },
/*
* EOL
*/
/*
* EOL
*/

10
SOURCES/0086-RHBZ-1110007-orphan-path-on-failed-add.patch

@ -7,11 +7,11 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,11 +7,11 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -562,7 +562,7 @@ rescan:
return 0;
}
else
return 0;
}
else
- return 1;
+ goto fail;

fail_map:
remove_map(mpp, vecs, 1);
remove_map(mpp, vecs, 1);

40
SOURCES/0087-RHBZ-1110013-config-error-checking.patch

@ -7,22 +7,22 @@ Index: multipath-tools-130222/libmultipath/parser.c @@ -7,22 +7,22 @@ Index: multipath-tools-130222/libmultipath/parser.c
--- multipath-tools-130222.orig/libmultipath/parser.c
+++ multipath-tools-130222/libmultipath/parser.c
@@ -395,36 +395,57 @@ set_value(vector strvec)
char *alloc = NULL;
char *tmp;

char *alloc = NULL;
char *tmp;
- if (!str)
+ if (!str) {
+ condlog(0, "option '%s' missing value",
+ (char *)VECTOR_SLOT(strvec, 0));
return NULL;
return NULL;
-
+ }
size = strlen(str);
size = strlen(str);
- if (size == 0)
+ if (size == 0) {
+ condlog(0, "option '%s' has empty value",
+ (char *)VECTOR_SLOT(strvec, 0));
return NULL;
return NULL;
-
- if (*str == '"') {
- for (i = 2; i < VECTOR_SIZE(strvec); i++) {
@ -48,8 +48,8 @@ Index: multipath-tools-130222/libmultipath/parser.c @@ -48,8 +48,8 @@ Index: multipath-tools-130222/libmultipath/parser.c
+ }
+ if (*str != '"') {
+ alloc = MALLOC(sizeof (char) * (size + 1));
if (alloc)
memcpy(alloc, str, size);
if (alloc)
memcpy(alloc, str, size);
+ else
+ condlog(0, "can't allocate memeory for option '%s'",
+ (char *)VECTOR_SLOT(strvec, 0));
@ -86,12 +86,12 @@ Index: multipath-tools-130222/libmultipath/parser.c @@ -86,12 +86,12 @@ Index: multipath-tools-130222/libmultipath/parser.c
+ if (*alloc != '\0')
+ strncat(alloc, " ", 1);
+ strncat(alloc, str, strlen(str));
}
return alloc;
}
return alloc;
}
@@ -465,6 +486,74 @@ void free_uniques(vector uniques)
}

int
+is_sublevel_keyword(char *str)
+{
@ -163,18 +163,18 @@ Index: multipath-tools-130222/libmultipath/parser.c @@ -163,18 +163,18 @@ Index: multipath-tools-130222/libmultipath/parser.c
+int
process_stream(vector keywords)
{
int i;
int i;
@@ -494,11 +583,20 @@ process_stream(vector keywords)
if (!strvec)
continue;

if (!strvec)
continue;
+ if (validate_config_strvec(strvec) != 0) {
+ free_strvec(strvec);
+ continue;
+ }
+
str = VECTOR_SLOT(strvec, 0);

str = VECTOR_SLOT(strvec, 0);
- if (!strcmp(str, EOB) && kw_level > 0) {
- free_strvec(strvec);
- break;
@ -185,6 +185,6 @@ Index: multipath-tools-130222/libmultipath/parser.c @@ -185,6 +185,6 @@ Index: multipath-tools-130222/libmultipath/parser.c
+ }
+ condlog(0, "unmatched '%s' at line %d of config file",
+ EOB, line_nr);
}

for (i = 0; i < VECTOR_SIZE(keywords); i++) {
}
for (i = 0; i < VECTOR_SIZE(keywords); i++) {

108
SOURCES/0088-RHBZ-1069811-configurable-prio-timeout.patch

@ -16,9 +16,9 @@ Index: multipath-tools-130222/libmultipath/prio.c @@ -16,9 +16,9 @@ Index: multipath-tools-130222/libmultipath/prio.c
--- multipath-tools-130222.orig/libmultipath/prio.c
+++ multipath-tools-130222/libmultipath/prio.c
@@ -10,6 +10,13 @@

static LIST_HEAD(prioritizers);

+unsigned int get_prio_timeout(unsigned int default_timeout)
+{
+ if (conf->checker_timeout)
@ -28,15 +28,15 @@ Index: multipath-tools-130222/libmultipath/prio.c @@ -28,15 +28,15 @@ Index: multipath-tools-130222/libmultipath/prio.c
+
int init_prio (void)
{
if (!add_prio(DEFAULT_PRIO))
if (!add_prio(DEFAULT_PRIO))
Index: multipath-tools-130222/libmultipath/prio.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/prio.h
+++ multipath-tools-130222/libmultipath/prio.h
@@ -51,6 +51,7 @@ struct prio {
int (*getprio)(struct path *, char *);
int (*getprio)(struct path *, char *);
};

+unsigned int get_prio_timeout(unsigned int default_timeout);
int init_prio (void);
void cleanup_prio (void);
@ -48,103 +48,103 @@ Index: multipath-tools-130222/libmultipath/prioritizers/alua_rtpg.c @@ -48,103 +48,103 @@ Index: multipath-tools-130222/libmultipath/prioritizers/alua_rtpg.c
@@ -21,6 +21,7 @@
#define __user
#include <scsi/sg.h>

+#include "../prio.h"
#include "alua_rtpg.h"

#define SENSE_BUFF_LEN 32
@@ -134,7 +135,7 @@ do_inquiry(int fd, int evpd, unsigned in
hdr.dxfer_len = resplen;
hdr.sbp = sense;
hdr.mx_sb_len = sizeof(sense);
hdr.dxfer_len = resplen;
hdr.sbp = sense;
hdr.mx_sb_len = sizeof(sense);
- hdr.timeout = DEF_TIMEOUT;
+ hdr.timeout = get_prio_timeout(DEF_TIMEOUT);

if (ioctl(fd, SG_IO, &hdr) < 0) {
PRINT_DEBUG("do_inquiry: IOCTL failed!\n");
if (ioctl(fd, SG_IO, &hdr) < 0) {
PRINT_DEBUG("do_inquiry: IOCTL failed!\n");
@@ -253,7 +254,7 @@ do_rtpg(int fd, void* resp, long resplen
hdr.dxfer_len = resplen;
hdr.mx_sb_len = sizeof(sense);
hdr.sbp = sense;
hdr.dxfer_len = resplen;
hdr.mx_sb_len = sizeof(sense);
hdr.sbp = sense;
- hdr.timeout = DEF_TIMEOUT;
+ hdr.timeout = get_prio_timeout(DEF_TIMEOUT);

if (ioctl(fd, SG_IO, &hdr) < 0)
return -RTPG_RTPG_FAILED;
if (ioctl(fd, SG_IO, &hdr) < 0)
return -RTPG_RTPG_FAILED;
Index: multipath-tools-130222/libmultipath/prioritizers/emc.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/emc.c
+++ multipath-tools-130222/libmultipath/prioritizers/emc.c
@@ -31,7 +31,7 @@ int emc_clariion_prio(const char *dev, i
io_hdr.dxferp = sense_buffer;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sb;
io_hdr.dxferp = sense_buffer;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sb;
- io_hdr.timeout = 60000;
+ io_hdr.timeout = get_prio_timeout(60000);
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_emc_log(0, "sending query command failed");
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_emc_log(0, "sending query command failed");
Index: multipath-tools-130222/libmultipath/prioritizers/hds.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/hds.c
+++ multipath-tools-130222/libmultipath/prioritizers/hds.c
@@ -114,7 +114,7 @@ int hds_modular_prio (const char *dev, i
io_hdr.dxferp = inqBuff;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sense_buffer;
io_hdr.dxferp = inqBuff;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sense_buffer;
- io_hdr.timeout = 2000; /* TimeOut = 2 seconds */
+ io_hdr.timeout = get_prio_timeout(2000); /* TimeOut = 2 seconds */

if (ioctl (fd, SG_IO, &io_hdr) < 0) {
pp_hds_log(0, "SG_IO error");
if (ioctl (fd, SG_IO, &io_hdr) < 0) {
pp_hds_log(0, "SG_IO error");
Index: multipath-tools-130222/libmultipath/prioritizers/hp_sw.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/hp_sw.c
+++ multipath-tools-130222/libmultipath/prioritizers/hp_sw.c
@@ -46,7 +46,7 @@ int hp_sw_prio(const char *dev, int fd)
io_hdr.dxfer_direction = SG_DXFER_NONE;
io_hdr.cmdp = turCmdBlk;
io_hdr.sbp = sb;
io_hdr.dxfer_direction = SG_DXFER_NONE;
io_hdr.cmdp = turCmdBlk;
io_hdr.sbp = sb;
- io_hdr.timeout = 60000;
+ io_hdr.timeout = get_prio_timeout(60000);
io_hdr.pack_id = 0;
io_hdr.pack_id = 0;
retry:
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
Index: multipath-tools-130222/libmultipath/prioritizers/ontap.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/ontap.c
+++ multipath-tools-130222/libmultipath/prioritizers/ontap.c
@@ -89,7 +89,7 @@ static int send_gva(const char *dev, int
io_hdr.dxferp = results;
io_hdr.cmdp = cdb;
io_hdr.sbp = sb;
io_hdr.dxferp = results;
io_hdr.cmdp = cdb;
io_hdr.sbp = sb;
- io_hdr.timeout = SG_TIMEOUT;
+ io_hdr.timeout = get_prio_timeout(SG_TIMEOUT);
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_ontap_log(0, "SG_IO ioctl failed, errno=%d", errno);
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_ontap_log(0, "SG_IO ioctl failed, errno=%d", errno);
@@ -141,7 +141,7 @@ static int get_proxy(const char *dev, in
io_hdr.dxferp = results;
io_hdr.cmdp = cdb;
io_hdr.sbp = sb;
io_hdr.dxferp = results;
io_hdr.cmdp = cdb;
io_hdr.sbp = sb;
- io_hdr.timeout = SG_TIMEOUT;
+ io_hdr.timeout = get_prio_timeout(SG_TIMEOUT);
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_ontap_log(0, "ioctl sending inquiry command failed, "
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_ontap_log(0, "ioctl sending inquiry command failed, "
Index: multipath-tools-130222/libmultipath/prioritizers/rdac.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/rdac.c
+++ multipath-tools-130222/libmultipath/prioritizers/rdac.c
@@ -31,7 +31,7 @@ int rdac_prio(const char *dev, int fd)
io_hdr.dxferp = sense_buffer;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sb;
io_hdr.dxferp = sense_buffer;
io_hdr.cmdp = inqCmdBlk;
io_hdr.sbp = sb;
- io_hdr.timeout = 60000;
+ io_hdr.timeout = get_prio_timeout(60000);
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_rdac_log(0, "sending inquiry command failed");
io_hdr.pack_id = 0;
if (ioctl(fd, SG_IO, &io_hdr) < 0) {
pp_rdac_log(0, "sending inquiry command failed");
Index: multipath-tools-130222/multipath.conf.annotated
===================================================================
--- multipath-tools-130222.orig/multipath.conf.annotated

58
SOURCES/0089-RHBZ-1110016-add-noasync-option.patch

@ -12,33 +12,33 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -12,33 +12,33 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -556,6 +556,7 @@ load_config (char * file, struct udev *u
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
conf->hw_strmatch = 0;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
conf->hw_strmatch = 0;
+ conf->force_sync = 0;

/*
* preload default hwtable
/*
* preload default hwtable
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -115,6 +115,7 @@ struct config {
int reassign_maps;
int retain_hwhandler;
int detect_prio;
int reassign_maps;
int retain_hwhandler;
int detect_prio;
+ int force_sync;
unsigned int version[3];

char * dev;
unsigned int version[3];
char * dev;
Index: multipath-tools-130222/libmultipath/dict.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -712,6 +712,29 @@ def_hw_strmatch_handler(vector strvec)
return 0;
return 0;
}

+static int
+def_force_sync_handler(vector strvec)
+{
@ -67,7 +67,7 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -67,7 +67,7 @@ Index: multipath-tools-130222/libmultipath/dict.c
*/
@@ -2822,6 +2845,15 @@ snprint_def_hw_strmatch(char * buff, int
}

static int
+snprint_def_force_sync(char * buff, int len, void * data)
+{
@ -80,23 +80,23 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -80,23 +80,23 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_ble_simple (char * buff, int len, void * data)
{
struct blentry * ble = (struct blentry *)data;
struct blentry * ble = (struct blentry *)data;
@@ -2889,6 +2921,7 @@ init_keywords(void)
install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
install_keyword("retain_attached_hw_handler", &def_retain_hwhandler_handler, &snprint_def_retain_hwhandler_handler);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
+ install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
Index: multipath-tools-130222/libmultipath/discovery.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -952,8 +952,12 @@ get_state (struct path * pp, int daemon)
}
}
checker_clear_message(c);
}
}
checker_clear_message(c);
- if (daemon)
- checker_set_async(c);
+ if (daemon) {
@ -105,9 +105,9 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -105,9 +105,9 @@ Index: multipath-tools-130222/libmultipath/discovery.c
+ else
+ checker_set_sync(c);
+ }
if (!conf->checker_timeout &&
(pp->bus != SYSFS_BUS_SCSI ||
sysfs_get_timeout(pp, &(c->timeout))))
if (!conf->checker_timeout &&
(pp->bus != SYSFS_BUS_SCSI ||
sysfs_get_timeout(pp, &(c->timeout))))
Index: multipath-tools-130222/multipath.conf.annotated
===================================================================
--- multipath-tools-130222.orig/multipath.conf.annotated
@ -134,7 +134,7 @@ Index: multipath-tools-130222/multipath.conf.annotated @@ -134,7 +134,7 @@ Index: multipath-tools-130222/multipath.conf.annotated
+# # default : no
+# force_sync yes
#}
#
#
##
Index: multipath-tools-130222/multipath/multipath.conf.5
===================================================================

41
SOURCES/0090-UPBZ-1080038-reorder-paths-for-round-robin.patch

@ -1,8 +1,8 @@ @@ -1,8 +1,8 @@
---
libmultipath/configure.c | 229 +++++++++++++++++++++++++++++++++++++++++++++++
libmultipath/configure.h | 2
libmultipath/configure.h | 2
libmultipath/discovery.c | 87 +++++++++++++++++
libmultipath/discovery.h | 2
libmultipath/discovery.h | 2
libmultipath/structs.c | 84 +++++++++++++++++
libmultipath/structs.h | 25 ++++-
6 files changed, 427 insertions(+), 2 deletions(-)
@ -14,7 +14,7 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -14,7 +14,7 @@ Index: multipath-tools-130222/libmultipath/configure.c
@@ -39,6 +39,219 @@
#include "uxsock.h"
#include "wwids.h"

+/* group paths in pg by host adapter
+ */
+int group_by_host_adapter(struct pathgroup *pgp, vector adapters)
@ -232,9 +232,9 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -232,9 +232,9 @@ Index: multipath-tools-130222/libmultipath/configure.c
setup_map (struct multipath * mpp, char * params, int params_size)
{
@@ -101,6 +314,22 @@ setup_map (struct multipath * mpp, char
*/
mpp->bestpg = select_path_group(mpp);

*/
mpp->bestpg = select_path_group(mpp);
+ /* re-order paths in all path groups in an optimized way
+ * for round-robin path selectors to get maximum throughput.
+ */
@ -251,9 +251,9 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -251,9 +251,9 @@ Index: multipath-tools-130222/libmultipath/configure.c
+ }
+ }
+
/*
* transform the mp->pg vector of vectors of paths
* into a mp->params strings to feed the device-mapper
/*
* transform the mp->pg vector of vectors of paths
* into a mp->params strings to feed the device-mapper
Index: multipath-tools-130222/libmultipath/configure.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/configure.h
@ -269,9 +269,9 @@ Index: multipath-tools-130222/libmultipath/discovery.c @@ -269,9 +269,9 @@ Index: multipath-tools-130222/libmultipath/discovery.c
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -310,6 +310,93 @@ sysfs_get_tgt_nodename (struct path *pp,
return 1;
return 1;
}

+int sysfs_get_host_adapter_name(struct path *pp, char *adapter_name)
+{
+ int proto_id;
@ -367,12 +367,12 @@ Index: multipath-tools-130222/libmultipath/discovery.h @@ -367,12 +367,12 @@ Index: multipath-tools-130222/libmultipath/discovery.h
--- multipath-tools-130222.orig/libmultipath/discovery.h
+++ multipath-tools-130222/libmultipath/discovery.h
@@ -38,6 +38,8 @@ int store_pathinfo (vector pathvec, vect
struct path **pp_ptr);
struct path **pp_ptr);
int sysfs_set_scsi_tmo (struct multipath *mpp);
int sysfs_get_timeout(struct path *pp, unsigned int *timeout);
+int sysfs_get_host_pci_name(struct path *pp, char *pci_name);
+int sysfs_get_iscsi_ip_address(struct path *pp, char *ip_address);

/*
* discovery bitmask
Index: multipath-tools-130222/libmultipath/structs.c
@ -382,7 +382,7 @@ Index: multipath-tools-130222/libmultipath/structs.c @@ -382,7 +382,7 @@ Index: multipath-tools-130222/libmultipath/structs.c
@@ -18,6 +18,70 @@
#include "blacklist.h"
#include "prio.h"

+struct adapter_group *
+alloc_adaptergroup(void)
+{
@ -451,9 +451,9 @@ Index: multipath-tools-130222/libmultipath/structs.c @@ -451,9 +451,9 @@ Index: multipath-tools-130222/libmultipath/structs.c
alloc_path (void)
{
@@ -242,6 +306,26 @@ store_pathgroup (vector pgvec, struct pa
return 0;
return 0;
}

+int
+store_hostgroup(vector hostgroupvec, struct host_group * hgp)
+{
@ -488,13 +488,13 @@ Index: multipath-tools-130222/libmultipath/structs.h @@ -488,13 +488,13 @@ Index: multipath-tools-130222/libmultipath/structs.h
-
+#define HOST_NAME_LEN 8
+#define SLOT_NAME_SIZE 40

#define SCSI_VENDOR_SIZE 9
#define SCSI_PRODUCT_SIZE 17
@@ -251,6 +252,20 @@ struct pathgroup {
char * selector;
char * selector;
};

+struct adapter_group {
+ char adapter_name[SLOT_NAME_SIZE];
+ struct pathgroup *pgp;
@ -515,7 +515,7 @@ Index: multipath-tools-130222/libmultipath/structs.h @@ -515,7 +515,7 @@ Index: multipath-tools-130222/libmultipath/structs.h
@@ -263,6 +278,14 @@ void free_multipath_attributes (struct m
void drop_multipath (vector mpvec, char * wwid, enum free_path_mode free_paths);
void free_multipathvec (vector mpvec, enum free_path_mode free_paths);

+struct adapter_group * alloc_adaptergroup(void);
+struct host_group * alloc_hostgroup(void);
+void free_adaptergroup(vector adapters);
@ -526,3 +526,4 @@ Index: multipath-tools-130222/libmultipath/structs.h @@ -526,3 +526,4 @@ Index: multipath-tools-130222/libmultipath/structs.h
+
int store_path (vector pathvec, struct path * pp);
int store_pathgroup (vector pgvec, struct pathgroup * pgp);

36
SOURCES/0091-RHBZ-1069584-fix-empty-values-fast-io-fail-and-dev-loss.patch

@ -7,32 +7,32 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -7,32 +7,32 @@ Index: multipath-tools-130222/libmultipath/dict.c
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -43,6 +43,9 @@ def_fast_io_fail_handler(vector strvec)
char * buff;

buff = set_value(strvec);
char * buff;
buff = set_value(strvec);
+ if (!buff)
+ return 1;
+
if (strlen(buff) == 3 && !strcmp(buff, "off"))
conf->fast_io_fail = MP_FAST_IO_FAIL_OFF;
else if (sscanf(buff, "%d", &conf->fast_io_fail) != 1 ||
if (strlen(buff) == 3 && !strcmp(buff, "off"))
conf->fast_io_fail = MP_FAST_IO_FAIL_OFF;
else if (sscanf(buff, "%d", &conf->fast_io_fail) != 1 ||
@@ -1002,6 +1005,9 @@ hw_dev_loss_handler(vector strvec)
char * buff;
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);

char * buff;
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
+ if (!hwe)
+ return 1;
+
buff = set_value(strvec);
if (!buff)
return 1;
buff = set_value(strvec);
if (!buff)
return 1;
@@ -1021,6 +1027,9 @@ hw_pgpolicy_handler(vector strvec)
char * buff;
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);

char * buff;
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
+ if (!hwe)
+ return 1;
+
buff = set_value(strvec);

if (!buff)
buff = set_value(strvec);
if (!buff)

47
SOURCES/0092-UPBZ-1104605-reload-on-rename.patch

@ -9,18 +9,18 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -9,18 +9,18 @@ Index: multipath-tools-130222/libmultipath/configure.c
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -394,6 +394,8 @@ select_action (struct multipath * mpp, v
cmpp->alias, mpp->alias);
strncpy(mpp->alias_old, cmpp->alias, WWID_SIZE);
mpp->action = ACT_RENAME;
cmpp->alias, mpp->alias);
strncpy(mpp->alias_old, cmpp->alias, WWID_SIZE);
mpp->action = ACT_RENAME;
+ if (force_reload)
+ mpp->action = ACT_RENAME2;
return;
}
mpp->action = ACT_CREATE;
return;
}
mpp->action = ACT_CREATE;
@@ -632,6 +634,15 @@ domap (struct multipath * mpp, char * pa
r = dm_rename(mpp->alias_old, mpp->alias);
break;

r = dm_rename(mpp->alias_old, mpp->alias);
break;
+ case ACT_RENAME2:
+ r = dm_rename(mpp->alias_old, mpp->alias);
+ if (r) {
@ -30,33 +30,34 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -30,33 +30,34 @@ Index: multipath-tools-130222/libmultipath/configure.c
+ }
+ break;
+
default:
break;
}
default:
break;
}
Index: multipath-tools-130222/libmultipath/configure.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/configure.h
+++ multipath-tools-130222/libmultipath/configure.h
@@ -18,6 +18,7 @@ enum actions {
ACT_RENAME,
ACT_CREATE,
ACT_RESIZE,
ACT_RENAME,
ACT_CREATE,
ACT_RESIZE,
+ ACT_RENAME2,
};

#define FLUSH_ONE 1
Index: multipath-tools-130222/libmultipath/devmapper.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -565,10 +565,9 @@ dm_dev_t (const char * mapname, char * d
if (!dm_task_run(dmt))
goto out;

if (!dm_task_run(dmt))
goto out;
- if (!dm_task_get_info(dmt, &info))
+ if (!dm_task_get_info(dmt, &info) || !info.exists)
goto out;

goto out;
- r = info.open_count;
if (snprintf(dev_t, len, "%i:%i", info.major, info.minor) > len)
goto out;
if (snprintf(dev_t, len, "%i:%i", info.major, info.minor) > len)
goto out;

80
SOURCES/0093-UPBZ-1086825-user-friendly-name-remap.patch

@ -11,37 +11,37 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -11,37 +11,37 @@ Index: multipath-tools-130222/libmultipath/alias.c
+++ multipath-tools-130222/libmultipath/alias.c
@@ -145,7 +145,7 @@ lookup_binding(FILE *f, char *map_wwid,
}

static int
-rlookup_binding(FILE *f, char *buff, char *map_alias)
+rlookup_binding(FILE *f, char *buff, char *map_alias, char *prefix)
{
char line[LINE_MAX];
unsigned int line_nr = 0;
char line[LINE_MAX];
unsigned int line_nr = 0;
@@ -164,7 +164,7 @@ rlookup_binding(FILE *f, char *buff, cha
alias = strtok(line, " \t");
if (!alias) /* blank line */
continue;
alias = strtok(line, " \t");
if (!alias) /* blank line */
continue;
- curr_id = scan_devname(alias, NULL); /* TBD: Why this call? */
+ curr_id = scan_devname(alias, prefix);
if (curr_id >= id)
id = curr_id + 1;
wwid = strtok(NULL, " \t");
if (curr_id >= id)
id = curr_id + 1;
wwid = strtok(NULL, " \t");
@@ -188,6 +188,11 @@ rlookup_binding(FILE *f, char *buff, cha
}
}
condlog(3, "No matching alias [%s] in bindings file.", map_alias);
}
}
condlog(3, "No matching alias [%s] in bindings file.", map_alias);
+
+ /* Get the theoretical id for this map alias.
+ * Used by use_existing_alias
+ */
+ id = scan_devname(map_alias, prefix);
return id;
return id;
}

@@ -237,6 +242,59 @@ allocate_binding(int fd, char *wwid, int
}

char *
+use_existing_alias (char *wwid, char *file, char *alias_old,
+ char *prefix, int bindings_read_only)
@ -80,7 +80,7 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -80,7 +80,7 @@ Index: multipath-tools-130222/libmultipath/alias.c
+ condlog(0, "alias %s already bound to wwid %s, cannot reuse",
+ alias_old, buff);
+ }
+ goto out;
+ goto out;
+ }
+
+ /* allocate the existing alias in the bindings file */
@ -97,24 +97,24 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -97,24 +97,24 @@ Index: multipath-tools-130222/libmultipath/alias.c
+
+char *
get_user_friendly_alias(char *wwid, char *file, char *prefix,
int bindings_read_only)
int bindings_read_only)
{
@@ -305,7 +363,7 @@ get_user_friendly_wwid(char *alias, char
return -1;
}

return -1;
}
- rlookup_binding(f, buff, alias);
+ rlookup_binding(f, buff, alias, NULL);
if (!strlen(buff)) {
fclose(f);
return -1;
if (!strlen(buff)) {
fclose(f);
return -1;
Index: multipath-tools-130222/libmultipath/alias.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/alias.h
+++ multipath-tools-130222/libmultipath/alias.h
@@ -10,3 +10,5 @@
char *get_user_friendly_alias(char *wwid, char *file, char *prefix,
int bindings_readonly);
int bindings_readonly);
int get_user_friendly_wwid(char *alias, char *buff, char *file);
+char *use_existing_alias (char *wwid, char *file, char *alias_old,
+ char *prefix, int bindings_read_only);
@ -128,7 +128,7 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -128,7 +128,7 @@ Index: multipath-tools-130222/libmultipath/propsel.c
{
- if (mp->mpe && mp->mpe->alias)
+ if (mp->mpe && mp->mpe->alias) {
mp->alias = STRDUP(mp->mpe->alias);
mp->alias = STRDUP(mp->mpe->alias);
- else {
- mp->alias = NULL;
- if (want_user_friendly_names(mp)) {
@ -139,20 +139,20 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -139,20 +139,20 @@ Index: multipath-tools-130222/libmultipath/propsel.c
- if (mp->alias == NULL)
- mp->alias = STRDUP(mp->wwid);
+ goto out;
}

}
+ mp->alias = NULL;
+ if (!want_user_friendly_names(mp))
+ goto out;
+
+ select_alias_prefix(mp);
+
+
+ if (strlen(mp->alias_old) > 0) {
+ mp->alias = use_existing_alias(mp->wwid, conf->bindings_file,
+ mp->alias_old, mp->alias_prefix,
+ conf->bindings_read_only);
+ memset (mp->alias_old, 0, WWID_SIZE);
+ }
+ }
+
+ if (mp->alias == NULL)
+ mp->alias = get_user_friendly_alias(mp->wwid,
@ -161,17 +161,17 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -161,17 +161,17 @@ Index: multipath-tools-130222/libmultipath/propsel.c
+ if (mp->alias == NULL)
+ mp->alias = STRDUP(mp->wwid);
+
return mp->alias ? 0 : 1;
return mp->alias ? 0 : 1;
}

Index: multipath-tools-130222/libmultipath/structs_vec.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/structs_vec.c
+++ multipath-tools-130222/libmultipath/structs_vec.c
@@ -430,6 +430,20 @@ out:
return NULL;
return NULL;
}

+static void
+find_existing_alias (struct multipath * mpp,
+ struct vectors *vecs)
@ -188,12 +188,12 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c @@ -188,12 +188,12 @@ Index: multipath-tools-130222/libmultipath/structs_vec.c
+
extern struct multipath *
add_map_with_path (struct vectors * vecs,
struct path * pp, int add_vec)
struct path * pp, int add_vec)
@@ -443,6 +457,7 @@ add_map_with_path (struct vectors * vecs
mpp->hwe = pp->hwe;

strcpy(mpp->wwid, pp->wwid);
mpp->hwe = pp->hwe;
strcpy(mpp->wwid, pp->wwid);
+ find_existing_alias(mpp, vecs);
if (select_alias(mpp))
goto out;
mpp->size = pp->size;
if (select_alias(mpp))
goto out;
mpp->size = pp->size;

106
SOURCES/0094-RHBZ-1086825-cleanup-remap.patch

@ -9,38 +9,38 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -9,38 +9,38 @@ Index: multipath-tools-130222/libmultipath/alias.c
+++ multipath-tools-130222/libmultipath/alias.c
@@ -149,13 +149,11 @@ rlookup_binding(FILE *f, char *buff, cha
{
char line[LINE_MAX];
unsigned int line_nr = 0;
char line[LINE_MAX];
unsigned int line_nr = 0;
- int id = 0;

buff[0] = '\0';

while (fgets(line, LINE_MAX, f)) {
char *c, *alias, *wwid;
buff[0] = '\0';
while (fgets(line, LINE_MAX, f)) {
char *c, *alias, *wwid;
- int curr_id;

line_nr++;
c = strpbrk(line, "#\n\r");
line_nr++;
c = strpbrk(line, "#\n\r");
@@ -164,9 +162,6 @@ rlookup_binding(FILE *f, char *buff, cha
alias = strtok(line, " \t");
if (!alias) /* blank line */
continue;
alias = strtok(line, " \t");
if (!alias) /* blank line */
continue;
- curr_id = scan_devname(alias, prefix);
- if (curr_id >= id)
- id = curr_id + 1;
wwid = strtok(NULL, " \t");
if (!wwid){
condlog(3,
wwid = strtok(NULL, " \t");
if (!wwid){
condlog(3,
@@ -184,16 +179,12 @@ rlookup_binding(FILE *f, char *buff, cha
"\nSetting wwid to %s", alias, wwid);
strncpy(buff, wwid, WWID_SIZE);
buff[WWID_SIZE - 1] = '\0';
"\nSetting wwid to %s", alias, wwid);
strncpy(buff, wwid, WWID_SIZE);
buff[WWID_SIZE - 1] = '\0';
- return id;
+ return 0;
}
}
condlog(3, "No matching alias [%s] in bindings file.", map_alias);

}
}
condlog(3, "No matching alias [%s] in bindings file.", map_alias);
- /* Get the theoretical id for this map alias.
- * Used by use_existing_alias
- */
@ -48,28 +48,28 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -48,28 +48,28 @@ Index: multipath-tools-130222/libmultipath/alias.c
- return id;
+ return -1;
}

static char *
@@ -264,9 +255,7 @@ use_existing_alias (char *wwid, char *fi
/* lookup the binding. if it exsists, the wwid will be in buff
* either way, id contains the id for the alias
*/
/* lookup the binding. if it exsists, the wwid will be in buff
* either way, id contains the id for the alias
*/
- id = rlookup_binding(f , buff, alias_old, prefix);
- if (id < 0)
- goto out;
+ rlookup_binding(f, buff, alias_old, prefix);

if (strlen(buff) > 0) {
/* if buff is our wwid, it's already
if (strlen(buff) > 0) {
/* if buff is our wwid, it's already
@@ -279,11 +268,21 @@ use_existing_alias (char *wwid, char *fi
condlog(0, "alias %s already bound to wwid %s, cannot reuse",
alias_old, buff);
}
- goto out;
condlog(0, "alias %s already bound to wwid %s, cannot reuse",
alias_old, buff);
}
- goto out;
+ goto out;
}

/* allocate the existing alias in the bindings file */
}
/* allocate the existing alias in the bindings file */
- if (can_write && id && !bindings_read_only) {
+ id = scan_devname(alias_old, prefix);
+ if (id <= 0)
@ -82,26 +82,26 @@ Index: multipath-tools-130222/libmultipath/alias.c @@ -82,26 +82,26 @@ Index: multipath-tools-130222/libmultipath/alias.c
+ }
+
+ if (can_write && !bindings_read_only) {
alias = allocate_binding(fd, wwid, id, prefix);
condlog(0, "Allocated existing binding [%s] for WWID [%s]",
alias, wwid);
alias = allocate_binding(fd, wwid, id, prefix);
condlog(0, "Allocated existing binding [%s] for WWID [%s]",
alias, wwid);
Index: multipath-tools-130222/libmultipath/propsel.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/propsel.c
+++ multipath-tools-130222/libmultipath/propsel.c
@@ -263,13 +263,13 @@ select_alias (struct multipath * mp)
goto out;

select_alias_prefix(mp);
-
goto out;
select_alias_prefix(mp);
-
+
if (strlen(mp->alias_old) > 0) {
mp->alias = use_existing_alias(mp->wwid, conf->bindings_file,
mp->alias_old, mp->alias_prefix,
conf->bindings_read_only);
memset (mp->alias_old, 0, WWID_SIZE);
- }
if (strlen(mp->alias_old) > 0) {
mp->alias = use_existing_alias(mp->wwid, conf->bindings_file,
mp->alias_old, mp->alias_prefix,
conf->bindings_read_only);
memset (mp->alias_old, 0, WWID_SIZE);
- }
+ }

if (mp->alias == NULL)
mp->alias = get_user_friendly_alias(mp->wwid,
if (mp->alias == NULL)
mp->alias = get_user_friendly_alias(mp->wwid,

12
SOURCES/0095-RHBZ-1127944-xtremIO-config.patch

@ -7,9 +7,9 @@ Index: multipath-tools-130222/libmultipath/hwtable.c @@ -7,9 +7,9 @@ Index: multipath-tools-130222/libmultipath/hwtable.c
--- multipath-tools-130222.orig/libmultipath/hwtable.c
+++ multipath-tools-130222/libmultipath/hwtable.c
@@ -1121,6 +1121,19 @@ static struct hwentry default_hw[] = {
.prio_name = PRIO_ALUA,
.prio_args = NULL,
},
.prio_name = PRIO_ALUA,
.prio_args = NULL,
},
+ {
+ .vendor = "XtremIO",
+ .product = "XtremApp",
@ -23,6 +23,6 @@ Index: multipath-tools-130222/libmultipath/hwtable.c @@ -23,6 +23,6 @@ Index: multipath-tools-130222/libmultipath/hwtable.c
+ .prio_name = DEFAULT_PRIO,
+ .prio_args = NULL,
+ },
/*
* EOL
*/
/*
* EOL
*/

17
SOURCES/0096-RHBZ-979474-new-wildcards.patch

@ -11,7 +11,7 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -11,7 +11,7 @@ Index: multipath-tools-130222/libmultipath/print.c
#include <string.h>
#include <errno.h>
+#include <libudev.h>

#include "checkers.h"
#include "vector.h"
@@ -44,7 +45,7 @@
@ -21,11 +21,11 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -21,11 +21,11 @@ Index: multipath-tools-130222/libmultipath/print.c
-snprint_str (char * buff, size_t len, char * str)
+snprint_str (char * buff, size_t len, const char * str)
{
return snprintf(buff, len, "%s", str);
return snprintf(buff, len, "%s", str);
}
@@ -432,6 +433,83 @@ snprint_path_mpp (char * buff, size_t le
}

static int
+snprint_host_attr (char * buff, size_t len, struct path * pp, char *attr)
+{
@ -106,14 +106,15 @@ Index: multipath-tools-130222/libmultipath/print.c @@ -106,14 +106,15 @@ Index: multipath-tools-130222/libmultipath/print.c
+static int
snprint_path_checker (char * buff, size_t len, struct path * pp)
{
struct checker * c = &pp->checker;
struct checker * c = &pp->checker;
@@ -475,6 +553,10 @@ struct path_data pd[] = {
{'S', "size", 0, snprint_path_size},
{'z', "serial", 0, snprint_path_serial},
{'m', "multipath", 0, snprint_path_mpp},
{'S', "size", 0, snprint_path_size},
{'z', "serial", 0, snprint_path_serial},
{'m', "multipath", 0, snprint_path_mpp},
+ {'N', "host WWNN", 0, snprint_host_wwnn},
+ {'n', "target WWNN", 0, snprint_tgt_wwnn},
+ {'R', "host WWPN", 0, snprint_host_wwpn},
+ {'r', "target WWPN", 0, snprint_tgt_wwpn},
{0, NULL, 0 , NULL}
{0, NULL, 0 , NULL}
};

148
SOURCES/0097-RH-fix-coverity-errors.patch

@ -14,145 +14,145 @@ Index: multipath-tools-130222/kpartx/devmapper.c @@ -14,145 +14,145 @@ Index: multipath-tools-130222/kpartx/devmapper.c
--- multipath-tools-130222.orig/kpartx/devmapper.c
+++ multipath-tools-130222/kpartx/devmapper.c
@@ -132,8 +132,9 @@ dm_addmap (int task, const char *name, c
goto addout;
r = dm_task_run (dmt);

goto addout;
r = dm_task_run (dmt);
- addout:
+addout:
dm_task_destroy (dmt);
dm_task_destroy (dmt);
+ free(prefixed_uuid);

return r;
return r;
}
Index: multipath-tools-130222/libmultipath/alias.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/alias.c
+++ multipath-tools-130222/libmultipath/alias.c
@@ -328,6 +328,7 @@ get_user_friendly_alias(char *wwid, char
if (fflush(f) != 0) {
condlog(0, "cannot fflush bindings file stream : %s",
strerror(errno));
if (fflush(f) != 0) {
condlog(0, "cannot fflush bindings file stream : %s",
strerror(errno));
+ free(alias);
fclose(f);
return NULL;
}
fclose(f);
return NULL;
}
Index: multipath-tools-130222/libmultipath/blacklist.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/blacklist.c
+++ multipath-tools-130222/libmultipath/blacklist.c
@@ -79,6 +79,8 @@ set_ble_device (vector blist, char * ven
if (regcomp(&ble->vendor_reg, vendor,
REG_EXTENDED|REG_NOSUB)) {
FREE(vendor);
if (regcomp(&ble->vendor_reg, vendor,
REG_EXTENDED|REG_NOSUB)) {
FREE(vendor);
+ if (product)
+ FREE(product);
return 1;
}
ble->vendor = vendor;
return 1;
}
ble->vendor = vendor;
@@ -87,6 +89,10 @@ set_ble_device (vector blist, char * ven
if (regcomp(&ble->product_reg, product,
REG_EXTENDED|REG_NOSUB)) {
FREE(product);
if (regcomp(&ble->product_reg, product,
REG_EXTENDED|REG_NOSUB)) {
FREE(product);
+ if (vendor) {
+ ble->vendor = NULL;
+ FREE(vendor);
+ }
return 1;
}
ble->product = product;
return 1;
}
ble->product = product;
@@ -189,6 +195,7 @@ setup_default_blist (struct config * con
STRDUP(hwe->bl_product),
ORIGIN_DEFAULT)) {
FREE(ble);
STRDUP(hwe->bl_product),
ORIGIN_DEFAULT)) {
FREE(ble);
+ vector_del_slot(conf->blist_device, VECTOR_SIZE(conf->blist_device) - 1);
return 1;
}
}
return 1;
}
}
Index: multipath-tools-130222/libmultipath/prioritizers/iet.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/iet.c
+++ multipath-tools-130222/libmultipath/prioritizers/iet.c
@@ -109,6 +109,7 @@ int iet_prio(const char *dev, char * arg
ssize_t nchars = readlink(path, buffer, sizeof(buffer)-1);
if (nchars != -1) {
char *device;
ssize_t nchars = readlink(path, buffer, sizeof(buffer)-1);
if (nchars != -1) {
char *device;
+ buffer[nchars] = '\0';
device = find_regex(buffer,"(sd[a-z]+)");
// if device parsed is the right one
if (device!=NULL && strncmp(device, dev, strlen(device)) == 0) {
device = find_regex(buffer,"(sd[a-z]+)");
// if device parsed is the right one
if (device!=NULL && strncmp(device, dev, strlen(device)) == 0) {
@@ -118,6 +119,7 @@ int iet_prio(const char *dev, char * arg
if (ip!=NULL && strncmp(ip, preferredip, strlen(ip)) == 0) {
// high prio
free(ip);
if (ip!=NULL && strncmp(ip, preferredip, strlen(ip)) == 0) {
// high prio
free(ip);
+ free(device);
closedir(dir_p);
return 20;
}
closedir(dir_p);
return 20;
}
Index: multipath-tools-130222/libmultipath/prioritizers/weightedpath.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/prioritizers/weightedpath.c
+++ multipath-tools-130222/libmultipath/prioritizers/weightedpath.c
@@ -61,8 +61,10 @@ int prio_path_weight(struct path *pp, ch
regex = get_next_string(&temp, split_char);

/* Return default priority if the argument is not parseable */
regex = get_next_string(&temp, split_char);
/* Return default priority if the argument is not parseable */
- if (!regex)
+ if (!regex) {
+ FREE(arg);
return priority;
return priority;
+ }

if (!strcmp(regex, HBTL)) {
sprintf(path, "%d:%d:%d:%d", pp->sg_id.host_no,
if (!strcmp(regex, HBTL)) {
sprintf(path, "%d:%d:%d:%d", pp->sg_id.host_no,
@@ -72,6 +74,7 @@ int prio_path_weight(struct path *pp, ch
} else {
condlog(0, "%s: %s - Invalid arguments", pp->dev,
pp->prio.name);
} else {
condlog(0, "%s: %s - Invalid arguments", pp->dev,
pp->prio.name);
+ FREE(arg);
return priority;
}

return priority;
}
Index: multipath-tools-130222/libmultipath/regex.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/regex.c
+++ multipath-tools-130222/libmultipath/regex.c
@@ -3936,8 +3936,11 @@ int eflags;
regs.num_regs = nmatch;
regs.start = TALLOC(nmatch, regoff_t);
regs.end = TALLOC(nmatch, regoff_t);
regs.num_regs = nmatch;
regs.start = TALLOC(nmatch, regoff_t);
regs.end = TALLOC(nmatch, regoff_t);
- if (regs.start == NULL || regs.end == NULL)
+ if (regs.start == NULL || regs.end == NULL) {
+ free(regs.start);
+ free(regs.end);
return (int) REG_NOMATCH;
return (int) REG_NOMATCH;
+ }
}

/* Perform the searching operation. */
}
/* Perform the searching operation. */
Index: multipath-tools-130222/libmultipath/sysfs.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/sysfs.c
+++ multipath-tools-130222/libmultipath/sysfs.c
@@ -88,7 +88,8 @@ ssize_t sysfs_attr_get_value(struct udev
} else if (size == value_len) {
condlog(4, "overflow while reading from %s", devpath);
size = 0;
} else if (size == value_len) {
condlog(4, "overflow while reading from %s", devpath);
size = 0;
- }
+ } else
+ value[size] = '\0';

close(fd);
return size;
close(fd);
return size;
Index: multipath-tools-130222/libmultipath/util.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/util.c
+++ multipath-tools-130222/libmultipath/util.c
@@ -175,7 +175,7 @@ devt2devname (char *devname, int devname
sprintf(block_path,"/sys/dev/block/%u:%u", major, minor);
if (lstat(block_path, &statbuf) == 0) {
if (S_ISLNK(statbuf.st_mode) &&
sprintf(block_path,"/sys/dev/block/%u:%u", major, minor);
if (lstat(block_path, &statbuf) == 0) {
if (S_ISLNK(statbuf.st_mode) &&
- readlink(block_path, dev, FILE_NAME_SIZE) > 0) {
+ readlink(block_path, dev, FILE_NAME_SIZE-1) > 0) {
char *p = strrchr(dev, '/');

if (!p) {
char *p = strrchr(dev, '/');
if (!p) {

324
SOURCES/0098-UPBZ-1067171-mutipath-i.patch

@ -11,9 +11,9 @@ Index: multipath-tools-130222/libmultipath/config.h @@ -11,9 +11,9 @@ Index: multipath-tools-130222/libmultipath/config.h
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -23,6 +23,17 @@ enum devtypes {
DEV_DEVMAP
DEV_DEVMAP
};

+enum mpath_cmds {
+ CMD_CREATE,
+ CMD_DRY_RUN,
@ -26,251 +26,251 @@ Index: multipath-tools-130222/libmultipath/config.h @@ -26,251 +26,251 @@ Index: multipath-tools-130222/libmultipath/config.h
+};
+
struct hwentry {
char * vendor;
char * product;
char * vendor;
char * product;
@@ -79,8 +90,7 @@ struct mpentry {

struct config {
int verbosity;
int verbosity;
- int dry_run;
- int list;
+ enum mpath_cmds cmd;
int pgpolicy_flag;
int pgpolicy;
enum devtypes dev_type;
int pgpolicy_flag;
int pgpolicy;
enum devtypes dev_type;
@@ -98,6 +108,7 @@ struct config {
int max_fds;
int force_reload;
int queue_without_daemon;
int max_fds;
int force_reload;
int queue_without_daemon;
+ int ignore_wwids;
int checker_timeout;
int daemon;
int flush_on_last_del;
int checker_timeout;
int daemon;
int flush_on_last_del;
Index: multipath-tools-130222/multipath/main.c
===================================================================
--- multipath-tools-130222.orig/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -85,7 +85,7 @@ usage (char * progname)
{
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
fprintf (stderr, VERSION_STRING);
fprintf (stderr, "Usage:\n");
- fprintf (stderr, " %s [-a|-A|-c|-w|-W] [-d] [-T tm:val] [-r] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
+ fprintf (stderr, " %s [-a|-A|-c|-w|-W] [-d] [-T tm:val] [-r] [-i] [-v lvl] [-p pol] [-b fil] [-q] [dev]\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
fprintf (stderr, " %s -l|-ll|-f [-v lvl] [-b fil] [dev]\n", progname);
fprintf (stderr, " %s -F [-v lvl]\n", progname);
fprintf (stderr, " %s -t\n", progname);
@@ -109,6 +109,7 @@ usage (char * progname)
" -d dry run, do not create or update devmaps\n" \
" -t dump internal hardware table\n" \
" -r force devmap reload\n" \
" -d dry run, do not create or update devmaps\n" \
" -t dump internal hardware table\n" \
" -r force devmap reload\n" \
+ " -i ignore wwids file\n" \
" -B treat the bindings file as read only\n" \
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
" -b fil bindings file location\n" \
" -B treat the bindings file as read only\n" \
" -p policy failover|multibus|group_by_serial|group_by_prio\n" \
" -b fil bindings file location\n" \
@@ -209,18 +210,19 @@ get_dm_mpvec (vector curmp, vector pathv
* If not in "fast list mode", we need to fetch information
* about them
*/
* If not in "fast list mode", we need to fetch information
* about them
*/
- if (conf->list != 1)
+ if (conf->cmd != CMD_LIST_SHORT)
update_paths(mpp);

update_paths(mpp);
- if (conf->list > 1)
+ if (conf->cmd == CMD_LIST_LONG)
mpp->bestpg = select_path_group(mpp);

disassemble_status(status, mpp);

mpp->bestpg = select_path_group(mpp);
disassemble_status(status, mpp);
- if (conf->list)
+ if (conf->cmd == CMD_LIST_SHORT ||
+ conf->cmd == CMD_LIST_LONG)
print_multipath_topology(mpp, conf->verbosity);

print_multipath_topology(mpp, conf->verbosity);
- if (!conf->dry_run)
+ if (conf->cmd == CMD_CREATE)
reinstate_paths(mpp);
}
return 0;
reinstate_paths(mpp);
}
return 0;
@@ -262,10 +264,11 @@ configure (void)
/*
* if we have a blacklisted device parameter, exit early
*/
/*
* if we have a blacklisted device parameter, exit early
*/
- if (dev && conf->dev_type == DEV_DEVNODE && conf->dry_run != 3 &&
+ if (dev && conf->dev_type == DEV_DEVNODE &&
+ conf->cmd != CMD_REMOVE_WWID &&
(filter_devnode(conf->blist_devnode,
conf->elist_devnode, dev) > 0)) {
(filter_devnode(conf->blist_devnode,
conf->elist_devnode, dev) > 0)) {
- if (conf->dry_run == 2)
+ if (conf->cmd == CMD_VALID_PATH)
printf("%s is not a valid multipath device path\n",
conf->dev);
goto out;
printf("%s is not a valid multipath device path\n",
conf->dev);
goto out;
@@ -278,13 +281,13 @@ configure (void)
int failed = get_refwwid(conf->dev, conf->dev_type, pathvec,
&refwwid);
if (!refwwid) {
int failed = get_refwwid(conf->dev, conf->dev_type, pathvec,
&refwwid);
if (!refwwid) {
- if (failed == 2 && conf->dry_run == 2)
+ if (failed == 2 && conf->cmd == CMD_VALID_PATH)
printf("%s is not a valid multipath device path\n", conf->dev);
else
condlog(3, "scope is nul");
goto out;
}
printf("%s is not a valid multipath device path\n", conf->dev);
else
condlog(3, "scope is nul");
goto out;
}
- if (conf->dry_run == 3) {
+ if (conf->cmd == CMD_REMOVE_WWID) {
r = remove_wwid(refwwid);
if (r == 0)
printf("wwid '%s' removed\n", refwwid);
r = remove_wwid(refwwid);
if (r == 0)
printf("wwid '%s' removed\n", refwwid);
@@ -295,7 +298,7 @@ configure (void)
}
goto out;
}
}
goto out;
}
- if (conf->dry_run == 5) {
+ if (conf->cmd == CMD_ADD_WWID) {
r = remember_wwid(refwwid);
if (r == 0)
printf("wwid '%s' added\n", refwwid);
r = remember_wwid(refwwid);
if (r == 0)
printf("wwid '%s' added\n", refwwid);
@@ -305,13 +308,13 @@ configure (void)
goto out;
}
condlog(3, "scope limited to %s", refwwid);
goto out;
}
condlog(3, "scope limited to %s", refwwid);
- if (conf->dry_run == 2) {
- if (check_wwids_file(refwwid, 0) == 0){
- printf("%s is a valid multipath device path\n", conf->dev);
+ if (conf->cmd == CMD_VALID_PATH) {
+ if (conf->ignore_wwids ||
+ check_wwids_file(refwwid, 0) == 0)
r = 0;
r = 0;
- }
- else
- printf("%s is not a valid multipath device path\n", conf->dev);
+
+ printf("%s %s a valid multipath device path\n",
+ conf->dev, r == 0 ? "is" : "is not");
goto out;
}
}
goto out;
}
}
@@ -319,13 +322,13 @@ configure (void)
/*
* get a path list
*/
/*
* get a path list
*/
- if (conf->dev && !conf->list)
+ if (conf->dev)
di_flag = DI_WWID;

di_flag = DI_WWID;
- if (conf->list > 1)
+ if (conf->cmd == CMD_LIST_LONG)
/* extended path info '-ll' */
di_flag |= DI_SYSFS | DI_CHECKER;
/* extended path info '-ll' */
di_flag |= DI_SYSFS | DI_CHECKER;
- else if (conf->list)
+ else if (conf->cmd == CMD_LIST_SHORT)
/* minimum path info '-l' */
di_flag |= DI_SYSFS;
else
/* minimum path info '-l' */
di_flag |= DI_SYSFS;
else
@@ -345,7 +348,7 @@ configure (void)

filter_pathvec(pathvec, refwwid);

filter_pathvec(pathvec, refwwid);
- if (conf->list) {
+ if (conf->cmd != CMD_CREATE && conf->cmd != CMD_DRY_RUN) {
r = 0;
goto out;
}
r = 0;
goto out;
}
@@ -440,7 +443,7 @@ main (int argc, char *argv[])
int r = 1;
long int timestamp = -1;
int valid = -1;
int r = 1;
long int timestamp = -1;
int valid = -1;
- while ((arg = getopt(argc, argv, ":aAdchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":aAdchl::FfM:v:p:b:BritT:qwW")) != EOF ) {
switch(arg) {
case 'T':
if (optarg[0] == ':')
switch(arg) {
case 'T':
if (optarg[0] == ':')
@@ -476,7 +479,7 @@ main (int argc, char *argv[])
if (dm_prereq())
exit(1);

if (dm_prereq())
exit(1);
- while ((arg = getopt(argc, argv, ":aAdchl::FfM:v:p:b:BrtT:qwW")) != EOF ) {
+ while ((arg = getopt(argc, argv, ":aAdchl::FfM:v:p:b:BritT:qwW")) != EOF ) {
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
switch(arg) {
case 1: printf("optarg : %s\n",optarg);
break;
@@ -499,11 +502,11 @@ main (int argc, char *argv[])
conf->allow_queueing = 1;
break;
case 'c':
conf->allow_queueing = 1;
break;
case 'c':
- conf->dry_run = 2;
+ conf->cmd = CMD_VALID_PATH;
break;
case 'd':
break;
case 'd':
- if (!conf->dry_run)
- conf->dry_run = 1;
+ if (conf->cmd == CMD_CREATE)
+ conf->cmd = CMD_DRY_RUN;
break;
case 'f':
conf->remove = FLUSH_ONE;
break;
case 'f':
conf->remove = FLUSH_ONE;
@@ -512,11 +515,10 @@ main (int argc, char *argv[])
conf->remove = FLUSH_ALL;
break;
case 'l':
conf->remove = FLUSH_ALL;
break;
case 'l':
- conf->list = 1;
- conf->dry_run = 1;
-
if (optarg && !strncmp(optarg, "l", 1))
if (optarg && !strncmp(optarg, "l", 1))
- conf->list++;
+ conf->cmd = CMD_LIST_LONG;
+ else
+ conf->cmd = CMD_LIST_SHORT;

break;
case 'M':
break;
case 'M':
@@ -535,6 +537,9 @@ main (int argc, char *argv[])
case 'r':
conf->force_reload = 1;
break;
case 'r':
conf->force_reload = 1;
break;
+ case 'i':
+ conf->ignore_wwids = 1;
+ break;
case 't':
r = dump_config();
goto out;
case 't':
r = dump_config();
goto out;
@@ -548,13 +553,13 @@ main (int argc, char *argv[])
usage(argv[0]);
exit(0);
case 'w':
usage(argv[0]);
exit(0);
case 'w':
- conf->dry_run = 3;
+ conf->cmd = CMD_REMOVE_WWID;
break;
case 'W':
break;
case 'W':
- conf->dry_run = 4;
+ conf->cmd = CMD_RESET_WWIDS;
break;
case 'a':
break;
case 'a':
- conf->dry_run = 5;
+ conf->cmd = CMD_ADD_WWID;
break;
case ':':
fprintf(stderr, "Missing option argument\n");
break;
case ':':
fprintf(stderr, "Missing option argument\n");
@@ -600,16 +605,16 @@ main (int argc, char *argv[])
}
dm_init();

}
dm_init();
- if (conf->dry_run == 2 &&
+ if (conf->cmd == CMD_VALID_PATH &&
(!conf->dev || conf->dev_type == DEV_DEVMAP)) {
condlog(0, "the -c option requires a path to check");
goto out;
}
(!conf->dev || conf->dev_type == DEV_DEVMAP)) {
condlog(0, "the -c option requires a path to check");
goto out;
}
- if (conf->dry_run == 3 && !conf->dev) {
+ if (conf->cmd == CMD_REMOVE_WWID && !conf->dev) {
condlog(0, "the -w option requires a device");
goto out;
}
condlog(0, "the -w option requires a device");
goto out;
}
- if (conf->dry_run == 4) {
+ if (conf->cmd == CMD_RESET_WWIDS) {
struct multipath * mpp;
int i;
vector curmp;
struct multipath * mpp;
int i;
vector curmp;
Index: multipath-tools-130222/multipath/multipath.8
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.8
@ -299,34 +299,34 @@ Index: multipath-tools-130222/libmultipath/configure.c @@ -299,34 +299,34 @@ Index: multipath-tools-130222/libmultipath/configure.c
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -580,7 +580,7 @@ domap (struct multipath * mpp, char * pa
/*
* last chance to quit before touching the devmaps
*/
/*
* last chance to quit before touching the devmaps
*/
- if (conf->dry_run && mpp->action != ACT_NOTHING) {
+ if (conf->cmd == CMD_DRY_RUN && mpp->action != ACT_NOTHING) {
print_multipath_topology(mpp, conf->verbosity);
return DOMAP_DRY;
}
print_multipath_topology(mpp, conf->verbosity);
return DOMAP_DRY;
}
Index: multipath-tools-130222/libmultipath/discovery.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/discovery.c
+++ multipath-tools-130222/libmultipath/discovery.c
@@ -54,7 +54,8 @@ store_pathinfo (vector pathvec, vector h
}
pp->udev = udev_device_ref(udevice);
err = pathinfo(pp, hwtable,
}
pp->udev = udev_device_ref(udevice);
err = pathinfo(pp, hwtable,
- (conf->dry_run == 3)? flag : (flag | DI_BLACKLIST));
+ (conf->cmd == CMD_REMOVE_WWID)? flag :
+ (flag | DI_BLACKLIST));
if (err)
goto out;

if (err)
goto out;
@@ -1101,7 +1102,7 @@ get_uid (struct path * pp)

memset(pp->wwid, 0, WWID_SIZE);
value = udev_device_get_property_value(pp->udev, pp->uid_attribute);
memset(pp->wwid, 0, WWID_SIZE);
value = udev_device_get_property_value(pp->udev, pp->uid_attribute);
- if ((!value || strlen(value) == 0) && conf->dry_run == 2)
+ if ((!value || strlen(value) == 0) && conf->cmd == CMD_VALID_PATH)
value = getenv(pp->uid_attribute);
if (value && strlen(value)) {
size_t len = WWID_SIZE;
value = getenv(pp->uid_attribute);
if (value && strlen(value)) {
size_t len = WWID_SIZE;

62
SOURCES/0099-RH-add-all-devs.patch

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
---
libmultipath/config.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++-
libmultipath/config.h | 1
libmultipath/config.h | 1
libmultipath/dict.c | 38 +++++++++++++++++++++++++++++
3 files changed, 102 insertions(+), 1 deletion(-)

@ -9,18 +9,18 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -9,18 +9,18 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -113,6 +113,8 @@ find_hwe (vector hwtable, char * vendor,
* continuing to the generic entries
*/
vector_foreach_slot_backwards (hwtable, tmp, i) {
* continuing to the generic entries
*/
vector_foreach_slot_backwards (hwtable, tmp, i) {
+ if (tmp->all_devs == 1)
+ continue;
if (hwe_regmatch(tmp, &hwe))
continue;
ret = tmp;
if (hwe_regmatch(tmp, &hwe))
continue;
ret = tmp;
@@ -348,6 +350,62 @@ merge_hwe (struct hwentry * dst, struct
return 0;
return 0;
}

+#define overwrite_str(s) \
+do { \
+ if (src->s) { \
@ -81,37 +81,37 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -81,37 +81,37 @@ Index: multipath-tools-130222/libmultipath/config.c
store_hwe (vector hwtable, struct hwentry * dhwe)
{
@@ -431,7 +489,11 @@ restart:
break;
j = n;
vector_foreach_slot_after(hw, hwe2, j) {
break;
j = n;
vector_foreach_slot_after(hw, hwe2, j) {
- if (conf->hw_strmatch) {
+ if (hwe2->all_devs == 1) {
+ overwrite_hwe(hwe1, hwe2);
+ continue;
+ }
+ else if (conf->hw_strmatch) {
if (hwe_strmatch(hwe2, hwe1))
continue;
}
if (hwe_strmatch(hwe2, hwe1))
continue;
}
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -47,6 +47,7 @@ struct hwentry {
char * prio_args;
char * alias_prefix;

char * prio_args;
char * alias_prefix;
+ int all_devs;
int pgpolicy;
int pgfailback;
int rr_weight;
int pgpolicy;
int pgfailback;
int rr_weight;
Index: multipath-tools-130222/libmultipath/dict.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -918,6 +918,32 @@ device_handler(vector strvec)
}

static int
+all_devs_handler(vector strvec)
+{
@ -141,10 +141,10 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -141,10 +141,10 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
vendor_handler(vector strvec)
{
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
@@ -2182,6 +2208,17 @@ snprint_hw_dev_loss(char * buff, int len
}

static int
+snprint_hw_all_devs (char *buff, int len, void *data)
+{
@ -159,12 +159,12 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -159,12 +159,12 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_hw_vendor (char * buff, int len, void * data)
{
struct hwentry * hwe = (struct hwentry *)data;
struct hwentry * hwe = (struct hwentry *)data;
@@ -2968,6 +3005,7 @@ init_keywords(void)
install_keyword_root("devices", &devices_handler);
install_keyword_multi("device", &device_handler, NULL);
install_sublevel();
install_keyword_root("devices", &devices_handler);
install_keyword_multi("device", &device_handler, NULL);
install_sublevel();
+ install_keyword("all_devs", &all_devs_handler, &snprint_hw_all_devs);
install_keyword("vendor", &vendor_handler, &snprint_hw_vendor);
install_keyword("product", &product_handler, &snprint_hw_product);
install_keyword("revision", &revision_handler, &snprint_hw_revision);
install_keyword("vendor", &vendor_handler, &snprint_hw_vendor);
install_keyword("product", &product_handler, &snprint_hw_product);
install_keyword("revision", &revision_handler, &snprint_hw_revision);

36
SOURCES/0100-RHBZ-1067171-multipath-i-update.patch

@ -7,19 +7,19 @@ Index: multipath-tools-130222/multipath/main.c @@ -7,19 +7,19 @@ Index: multipath-tools-130222/multipath/main.c
--- multipath-tools-130222.orig/multipath/main.c
+++ multipath-tools-130222/multipath/main.c
@@ -198,6 +198,9 @@ get_dm_mpvec (vector curmp, vector pathv
continue;
}

continue;
}
+ if (conf->cmd == CMD_VALID_PATH)
+ continue;
+
dm_get_map(mpp->alias, &mpp->size, params);
condlog(3, "params = %s", params);
dm_get_status(mpp->alias, status);
dm_get_map(mpp->alias, &mpp->size, params);
condlog(3, "params = %s", params);
dm_get_status(mpp->alias, status);
@@ -308,7 +311,13 @@ configure (void)
goto out;
}
condlog(3, "scope limited to %s", refwwid);
goto out;
}
condlog(3, "scope limited to %s", refwwid);
- if (conf->cmd == CMD_VALID_PATH) {
+ /* If you are ignoring the wwids file and find_multipaths is
+ * set, you need to actually check if there are two available
@ -28,13 +28,13 @@ Index: multipath-tools-130222/multipath/main.c @@ -28,13 +28,13 @@ Index: multipath-tools-130222/multipath/main.c
+ * the paths */
+ if (conf->cmd == CMD_VALID_PATH &&
+ (!conf->find_multipaths || !conf->ignore_wwids)) {
if (conf->ignore_wwids ||
check_wwids_file(refwwid, 0) == 0)
r = 0;
if (conf->ignore_wwids ||
check_wwids_file(refwwid, 0) == 0)
r = 0;
@@ -348,6 +357,20 @@ configure (void)

filter_pathvec(pathvec, refwwid);

filter_pathvec(pathvec, refwwid);
+
+ if (conf->cmd == CMD_VALID_PATH) {
+ /* This only happens if find_multipaths is and
@ -49,6 +49,6 @@ Index: multipath-tools-130222/multipath/main.c @@ -49,6 +49,6 @@ Index: multipath-tools-130222/multipath/main.c
+ goto out;
+ }
+
if (conf->cmd != CMD_CREATE && conf->cmd != CMD_DRY_RUN) {
r = 0;
goto out;
if (conf->cmd != CMD_CREATE && conf->cmd != CMD_DRY_RUN) {
r = 0;
goto out;

44
SOURCES/0101-RH-cleanup-partmaps-code.patch

@ -7,21 +7,21 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -7,21 +7,21 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
--- multipath-tools-130222.orig/libmultipath/devmapper.c
+++ multipath-tools-130222/libmultipath/devmapper.c
@@ -1006,8 +1006,9 @@ bad:
return NULL;
return NULL;
}

-int
-dm_remove_partmaps (const char * mapname, int need_sync)
+static int
+do_foreach_partmaps (const char * mapname, int (*partmap_func)(char *, void *),
+ void *data)
{
struct dm_task *dmt;
struct dm_names *names;
struct dm_task *dmt;
struct dm_names *names;
@@ -1059,26 +1060,8 @@ dm_remove_partmaps (const char * mapname
*/
strstr(params, dev_t)
) {
*/
strstr(params, dev_t)
) {
- /*
- * then it's a kpartx generated partition.
- * remove it.
@ -44,13 +44,13 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -44,13 +44,13 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
- need_sync, 0);
+ if (partmap_func(names->name, data) != 0)
+ goto out;
}

next = names->next;
}
next = names->next;
@@ -1091,6 +1074,35 @@ out:
return r;
return r;
}

+struct remove_data {
+ int need_sync;
+};
@ -84,9 +84,9 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -84,9 +84,9 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
alloc_dminfo (void)
{
@@ -1140,86 +1152,41 @@ out:
return r;
return r;
}

-int
-dm_rename_partmaps (char * old, char * new)
+struct rename_data {
@ -101,17 +101,17 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -101,17 +101,17 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
- struct dm_task *dmt;
- struct dm_names *names;
- unsigned next = 0;
char buff[PARAMS_SIZE];
char buff[PARAMS_SIZE];
- unsigned long long size;
- char dev_t[32];
- int r = 1;
int offset;
int offset;
- char *delim;
-
- if (!(dmt = dm_task_create(DM_DEVICE_LIST)))
- return 1;
+ struct rename_data *rd = (struct rename_data *)data;

- dm_task_no_open_count(dmt);
-
- if (!dm_task_run(dmt))
@ -133,20 +133,20 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -133,20 +133,20 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ condlog(4, "partition map %s renamed", name);
+ return 0;
+}

- if (dm_dev_t(old, &dev_t[0], 32))
- goto out;
+int
+dm_rename_partmaps (char * old, char * new)
+{
+ struct rename_data rd;

+ rd.old = old;
+ rd.new = new;
if (isdigit(new[strlen(new)-1]))
if (isdigit(new[strlen(new)-1]))
- delim = "p";
+ rd.delim = "p";
else
else
- delim = "";
-
- do {
@ -195,5 +195,5 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -195,5 +195,5 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ rd.delim = "";
+ return do_foreach_partmaps(old, rename_partmap, &rd);
}

int

359
SOURCES/0102-RHBZ-631009-deferred-remove.patch

@ -1,16 +1,16 @@ @@ -1,16 +1,16 @@
---
libmultipath/Makefile | 6 +
libmultipath/config.c | 3
libmultipath/config.h | 3
libmultipath/configure.c | 1
libmultipath/defaults.h | 1
libmultipath/config.c | 3
libmultipath/config.h | 3
libmultipath/configure.c | 1
libmultipath/defaults.h | 1
libmultipath/devmapper.c | 142 ++++++++++++++++++++++++++++++++++++++++-----
libmultipath/devmapper.h | 11 ++-
libmultipath/dict.c | 116 ++++++++++++++++++++++++++++++++++++
libmultipath/propsel.c | 28 ++++++++
libmultipath/propsel.h | 1
libmultipath/propsel.h | 1
libmultipath/structs.h | 8 ++
libmultipath/structs_vec.c | 3
libmultipath/structs_vec.c | 3
multipath/multipath.conf.5 | 14 ++++
multipathd/main.c | 23 +++++--
14 files changed, 333 insertions(+), 27 deletions(-)
@ -20,69 +20,69 @@ Index: multipath-tools-130222/libmultipath/config.c @@ -20,69 +20,69 @@ Index: multipath-tools-130222/libmultipath/config.c
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -337,6 +337,7 @@ merge_hwe (struct hwentry * dst, struct
merge_num(user_friendly_names);
merge_num(retain_hwhandler);
merge_num(detect_prio);
merge_num(user_friendly_names);
merge_num(retain_hwhandler);
merge_num(detect_prio);
+ merge_num(deferred_remove);

/*
* Make sure features is consistent with
/*
* Make sure features is consistent with
@@ -394,6 +395,7 @@ overwrite_hwe (struct hwentry * dst, str
overwrite_num(user_friendly_names);
overwrite_num(retain_hwhandler);
overwrite_num(detect_prio);
overwrite_num(user_friendly_names);
overwrite_num(retain_hwhandler);
overwrite_num(detect_prio);
+ overwrite_num(deferred_remove);

/*
* Make sure features is consistent with
/*
* Make sure features is consistent with
@@ -617,6 +619,7 @@ load_config (char * file, struct udev *u
conf->fast_io_fail = DEFAULT_FAST_IO_FAIL;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
conf->fast_io_fail = DEFAULT_FAST_IO_FAIL;
conf->retain_hwhandler = DEFAULT_RETAIN_HWHANDLER;
conf->detect_prio = DEFAULT_DETECT_PRIO;
+ conf->deferred_remove = DEFAULT_DEFERRED_REMOVE;
conf->hw_strmatch = 0;
conf->force_sync = 0;

conf->hw_strmatch = 0;
conf->force_sync = 0;
Index: multipath-tools-130222/libmultipath/config.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -61,6 +61,7 @@ struct hwentry {
int user_friendly_names;
int retain_hwhandler;
int detect_prio;
int user_friendly_names;
int retain_hwhandler;
int detect_prio;
+ int deferred_remove;
char * bl_product;
char * bl_product;
};

@@ -84,6 +85,7 @@ struct mpentry {
int flush_on_last_del;
int attribute_flags;
int user_friendly_names;
int flush_on_last_del;
int attribute_flags;
int user_friendly_names;
+ int deferred_remove;
uid_t uid;
gid_t gid;
mode_t mode;
uid_t uid;
gid_t gid;
mode_t mode;
@@ -128,6 +130,7 @@ struct config {
int retain_hwhandler;
int detect_prio;
int force_sync;
int retain_hwhandler;
int detect_prio;
int force_sync;
+ int deferred_remove;
unsigned int version[3];

char * dev;
unsigned int version[3];
char * dev;
Index: multipath-tools-130222/libmultipath/configure.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -290,6 +290,7 @@ setup_map (struct multipath * mpp, char
select_dev_loss(mpp);
select_reservation_key(mpp);
select_retain_hwhandler(mpp);
select_dev_loss(mpp);
select_reservation_key(mpp);
select_retain_hwhandler(mpp);
+ select_deferred_remove(mpp);

sysfs_set_scsi_tmo(mpp);
/*
sysfs_set_scsi_tmo(mpp);
/*
Index: multipath-tools-130222/libmultipath/defaults.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/defaults.h
@ -92,7 +92,7 @@ Index: multipath-tools-130222/libmultipath/defaults.h @@ -92,7 +92,7 @@ Index: multipath-tools-130222/libmultipath/defaults.h
#define DEFAULT_RETAIN_HWHANDLER RETAIN_HWHANDLER_OFF
#define DEFAULT_DETECT_PRIO DETECT_PRIO_OFF
+#define DEFAULT_DEFERRED_REMOVE DEFERRED_REMOVE_OFF

#define DEFAULT_CHECKINT 5
#define MAX_CHECKINT(a) (a << 2)
Index: multipath-tools-130222/libmultipath/devmapper.c
@ -102,7 +102,7 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -102,7 +102,7 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
@@ -32,6 +32,8 @@
#define UUID_PREFIX "mpath-"
#define UUID_PREFIX_LEN 6

+static int dm_cancel_remove_partmaps(const char * mapname);
+
#ifndef LIBDM_API_COOKIE
@ -110,47 +110,47 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -110,47 +110,47 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
{
@@ -103,7 +105,9 @@ dm_lib_prereq (void)
{
char version[64];
int v[3];
char version[64];
int v[3];
-#if defined(DM_SUBSYSTEM_UDEV_FLAG0)
+#if defined(LIBDM_API_DEFERRED)
+ int minv[3] = {1, 2, 89};
+#elif defined(DM_SUBSYSTEM_UDEV_FLAG0)
int minv[3] = {1, 2, 82};
int minv[3] = {1, 2, 82};
#elif defined(LIBDM_API_COOKIE)
int minv[3] = {1, 2, 38};
int minv[3] = {1, 2, 38};
@@ -201,8 +205,10 @@ dm_prereq (void)
return dm_drv_prereq();
return dm_drv_prereq();
}

+#define do_deferred(x) ((x) == DEFERRED_REMOVE_ON || (x) == DEFERRED_REMOVE_IN_PROGRESS)
+
static int
-dm_simplecmd (int task, const char *name, int no_flush, int need_sync, uint16_t udev_flags) {
+dm_simplecmd (int task, const char *name, int no_flush, int need_sync, uint16_t udev_flags, int deferred_remove) {
int r = 0;
int udev_wait_flag = (need_sync && (task == DM_DEVICE_RESUME ||
task == DM_DEVICE_REMOVE));
int r = 0;
int udev_wait_flag = (need_sync && (task == DM_DEVICE_RESUME ||
task == DM_DEVICE_REMOVE));
@@ -220,7 +226,10 @@ dm_simplecmd (int task, const char *name
if (no_flush)
dm_task_no_flush(dmt); /* for DM_DEVICE_SUSPEND/RESUME */
if (no_flush)
dm_task_no_flush(dmt); /* for DM_DEVICE_SUSPEND/RESUME */
#endif
-
+#ifdef LIBDM_API_DEFERRED
+ if (do_deferred(deferred_remove))
+ dm_task_deferred_remove(dmt);
+#endif
if (udev_wait_flag && !dm_task_set_cookie(dmt, &conf->cookie, ((conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0) | udev_flags))
goto out;
r = dm_task_run (dmt);
if (udev_wait_flag && !dm_task_set_cookie(dmt, &conf->cookie, ((conf->daemon)? DM_UDEV_DISABLE_LIBRARY_FALLBACK : 0) | udev_flags))
goto out;
r = dm_task_run (dmt);
@@ -232,12 +241,18 @@ dm_simplecmd (int task, const char *name

extern int
dm_simplecmd_flush (int task, const char *name, int needsync, uint16_t udev_flags) {
- return dm_simplecmd(task, name, 0, needsync, udev_flags);
+ return dm_simplecmd(task, name, 0, needsync, udev_flags, 0);
}

extern int
dm_simplecmd_noflush (int task, const char *name, uint16_t udev_flags) {
- return dm_simplecmd(task, name, 1, 1, udev_flags);
@ -162,46 +162,46 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -162,46 +162,46 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
+ return dm_simplecmd(DM_DEVICE_REMOVE, name, 0, needsync, 0,
+ deferred_remove);
}

extern int
@@ -653,7 +668,7 @@ out:
}

extern int
-_dm_flush_map (const char * mapname, int need_sync)
+_dm_flush_map (const char * mapname, int need_sync, int deferred_remove)
{
int r;

int r;
@@ -663,23 +678,46 @@ _dm_flush_map (const char * mapname, int
if (dm_type(mapname, TGT_MPATH) <= 0)
return 0; /* nothing to do */

if (dm_type(mapname, TGT_MPATH) <= 0)
return 0; /* nothing to do */
- if (dm_remove_partmaps(mapname, need_sync))
+ if (dm_remove_partmaps(mapname, need_sync, deferred_remove))
return 1;

return 1;
- if (dm_get_opencount(mapname)) {
+ if (!do_deferred(deferred_remove) && dm_get_opencount(mapname)) {
condlog(2, "%s: map in use", mapname);
return 1;
}

condlog(2, "%s: map in use", mapname);
return 1;
}
- r = dm_simplecmd_flush(DM_DEVICE_REMOVE, mapname, need_sync, 0);
+ r = dm_device_remove(mapname, need_sync, deferred_remove);

if (r) {
if (r) {
+ if (do_deferred(deferred_remove) && dm_map_present(mapname)) {
+ condlog(4, "multipath map %s remove deferred",
+ mapname);
+ return 2;
+ }
condlog(4, "multipath map %s removed", mapname);
return 0;
}
return 1;
condlog(4, "multipath map %s removed", mapname);
return 0;
}
return 1;
}

+#ifdef LIBDM_API_DEFERRED
+
+int
@ -224,42 +224,42 @@ Index: multipath-tools-130222/libmultipath/devmapper.c @@ -224,42 +224,42 @@ Index: multipath-tools-130222/libmultipath/devmapper.c
dm_suspend_and_flush_map (const char * mapname)
{
@@ -1076,6 +1114,7 @@ out:

struct remove_data {
int need_sync;
int need_sync;
+ int deferred_remove;
};

static int
@@ -1084,25 +1123,98 @@ remove_partmap(char *name, void *data)
struct remove_data *rd = (struct remove_data *)data;

if (dm_get_opencount(name)) {
struct remove_data *rd = (struct remove_data *)data;
if (dm_get_opencount(name)) {
- dm_remove_partmaps(name, rd->need_sync);
- if (dm_get_opencount(name)) {
+ dm_remove_partmaps(name, rd->need_sync, rd->deferred_remove);
+ if (!do_deferred(rd->deferred_remove) &&
+ dm_get_opencount(name)) {
condlog(2, "%s: map in use", name);
return 1;
}
}
condlog(4, "partition map %s removed", name);
condlog(2, "%s: map in use", name);
return 1;
}
}
condlog(4, "partition map %s removed", name);
- dm_simplecmd_flush(DM_DEVICE_REMOVE, name,
- rd->need_sync, 0);
+ dm_device_remove(name, rd->need_sync, rd->deferred_remove);
return 0;
return 0;
}

int
-dm_remove_partmaps (const char * mapname, int need_sync)
+dm_remove_partmaps (const char * mapname, int need_sync, int deferred_remove)
{
- struct remove_data rd = { need_sync };
+ struct remove_data rd = { need_sync, deferred_remove };
return do_foreach_partmaps(mapname, remove_partmap, &rd);
return do_foreach_partmaps(mapname, remove_partmap, &rd);
}

+#ifdef LIBDM_API_DEFERRED
+
+static int
@ -370,9 +370,9 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -370,9 +370,9 @@ Index: multipath-tools-130222/libmultipath/dict.c
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -738,6 +738,29 @@ def_force_sync_handler(vector strvec)
return 0;
return 0;
}

+static int
+def_deferred_remove_handler(vector strvec)
+{
@ -400,9 +400,9 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -400,9 +400,9 @@ Index: multipath-tools-130222/libmultipath/dict.c
* blacklist block handlers
*/
@@ -1445,6 +1468,33 @@ hw_detect_prio_handler(vector strvec)
return 0;
return 0;
}

+static int
+hw_deferred_remove_handler(vector strvec)
+{
@ -434,9 +434,9 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -434,9 +434,9 @@ Index: multipath-tools-130222/libmultipath/dict.c
* multipaths block handlers
*/
@@ -1920,6 +1970,32 @@ mp_names_handler(vector strvec)
return 0;
return 0;
}

+static int
+mp_deferred_remove_handler(vector strvec)
+{
@ -467,17 +467,17 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -467,17 +467,17 @@ Index: multipath-tools-130222/libmultipath/dict.c
* config file keywords printing
*/
@@ -2165,7 +2241,7 @@ snprint_mp_reservation_key (char * buff,
return snprintf(buff, len, "0x%" PRIx64, prkey);
return snprintf(buff, len, "0x%" PRIx64, prkey);
}

- static int
+static int
snprint_mp_user_friendly_names (char * buff, int len, void * data)
{
struct mpentry * mpe = (struct mpentry *)data;
struct mpentry * mpe = (struct mpentry *)data;
@@ -2179,6 +2255,19 @@ snprint_mp_user_friendly_names (char * b
}

static int
+snprint_mp_deferred_remove (char * buff, int len, void * data)
+{
@ -494,10 +494,10 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -494,10 +494,10 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_hw_fast_io_fail(char * buff, int len, void * data)
{
struct hwentry * hwe = (struct hwentry *)data;
struct hwentry * hwe = (struct hwentry *)data;
@@ -2507,6 +2596,19 @@ snprint_hw_retain_hwhandler_handler(char
}

static int
+snprint_hw_deferred_remove(char * buff, int len, void * data)
+{
@ -514,10 +514,10 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -514,10 +514,10 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_detect_prio(char * buff, int len, void * data)
{
struct hwentry * hwe = (struct hwentry *)data;
struct hwentry * hwe = (struct hwentry *)data;
@@ -2900,6 +3002,15 @@ snprint_def_force_sync(char * buff, int
}

static int
+snprint_def_deferred_remove(char * buff, int len, void * data)
+{
@ -530,29 +530,29 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -530,29 +530,29 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_ble_simple (char * buff, int len, void * data)
{
struct blentry * ble = (struct blentry *)data;
struct blentry * ble = (struct blentry *)data;
@@ -2968,6 +3079,7 @@ init_keywords(void)
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);
install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);
install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);
+ install_keyword("deferred_remove", &def_deferred_remove_handler, &snprint_def_deferred_remove);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
@@ -3032,6 +3144,7 @@ init_keywords(void)
install_keyword("user_friendly_names", &hw_names_handler, &snprint_hw_user_friendly_names);
install_keyword("retain_attached_hw_handler", &hw_retain_hwhandler_handler, &snprint_hw_retain_hwhandler_handler);
install_keyword("detect_prio", &hw_detect_prio_handler, &snprint_detect_prio);
install_keyword("user_friendly_names", &hw_names_handler, &snprint_hw_user_friendly_names);
install_keyword("retain_attached_hw_handler", &hw_retain_hwhandler_handler, &snprint_hw_retain_hwhandler_handler);
install_keyword("detect_prio", &hw_detect_prio_handler, &snprint_detect_prio);
+ install_keyword("deferred_remove", &hw_deferred_remove_handler, &snprint_hw_deferred_remove);
install_sublevel_end();

install_keyword_root("multipaths", &multipaths_handler);
install_sublevel_end();
install_keyword_root("multipaths", &multipaths_handler);
@@ -3056,5 +3169,6 @@ init_keywords(void)
install_keyword("gid", &mp_gid_handler, &snprint_mp_gid);
install_keyword("reservation_key", &mp_reservation_key_handler, &snprint_mp_reservation_key);
install_keyword("user_friendly_names", &mp_names_handler, &snprint_mp_user_friendly_names);
install_keyword("gid", &mp_gid_handler, &snprint_mp_gid);
install_keyword("reservation_key", &mp_reservation_key_handler, &snprint_mp_reservation_key);
install_keyword("user_friendly_names", &mp_names_handler, &snprint_mp_user_friendly_names);
+ install_keyword("deferred_remove", &mp_deferred_remove_handler, &snprint_mp_deferred_remove);
install_sublevel_end();
install_sublevel_end();
}
Index: multipath-tools-130222/libmultipath/propsel.c
===================================================================
@ -560,7 +560,7 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -560,7 +560,7 @@ Index: multipath-tools-130222/libmultipath/propsel.c
+++ multipath-tools-130222/libmultipath/propsel.c
@@ -744,6 +744,34 @@ select_retain_hwhandler (struct multipat
}

extern int
+select_deferred_remove (struct multipath *mp)
+{
@ -592,7 +592,7 @@ Index: multipath-tools-130222/libmultipath/propsel.c @@ -592,7 +592,7 @@ Index: multipath-tools-130222/libmultipath/propsel.c
+extern int
select_detect_prio (struct path * pp)
{
if (pp->hwe && pp->hwe->detect_prio) {
if (pp->hwe && pp->hwe->detect_prio) {
Index: multipath-tools-130222/libmultipath/propsel.h
===================================================================
--- multipath-tools-130222.orig/libmultipath/propsel.h
@ -607,9 +607,9 @@ Index: multipath-tools-130222/libmultipath/structs.h @@ -607,9 +607,9 @@ Index: multipath-tools-130222/libmultipath/structs.h
--- multipath-tools-130222.orig/libmultipath/structs.h
+++ multipath-tools-130222/libmultipath/structs.h
@@ -114,6 +114,13 @@ enum detect_prio_states {
DETECT_PRIO_ON,
DETECT_PRIO_ON,
};

+enum deferred_remove_states {
+ DEFERRED_REMOVE_UNDEF,
+ DEFERRED_REMOVE_OFF,
@ -618,23 +618,23 @@ Index: multipath-tools-130222/libmultipath/structs.h @@ -618,23 +618,23 @@ Index: multipath-tools-130222/libmultipath/structs.h
+};
+
enum scsi_protocol {
SCSI_PROTOCOL_FCP = 0, /* Fibre Channel */
SCSI_PROTOCOL_SPI = 1, /* parallel SCSI */
SCSI_PROTOCOL_FCP = 0, /* Fibre Channel */
SCSI_PROTOCOL_SPI = 1, /* parallel SCSI */
@@ -207,6 +214,7 @@ struct multipath {
int attribute_flags;
int fast_io_fail;
int retain_hwhandler;
int attribute_flags;
int fast_io_fail;
int retain_hwhandler;
+ int deferred_remove;
unsigned int dev_loss;
uid_t uid;
gid_t gid;
unsigned int dev_loss;
uid_t uid;
gid_t gid;
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -214,19 +214,30 @@ sync_maps_state(vector mpvec)
}

static int
-flush_map(struct multipath * mpp, struct vectors * vecs)
+flush_map(struct multipath * mpp, struct vectors * vecs, int nopaths)
@ -645,16 +645,16 @@ Index: multipath-tools-130222/multipathd/main.c @@ -645,16 +645,16 @@ Index: multipath-tools-130222/multipathd/main.c
+ r = dm_flush_map_nopaths(mpp->alias, mpp->deferred_remove);
+ else
+ r = dm_flush_map(mpp->alias);
/*
* clear references to this map before flushing so we can ignore
* the spurious uevent we may generate with the dm_flush_map call below
*/
/*
* clear references to this map before flushing so we can ignore
* the spurious uevent we may generate with the dm_flush_map call below
*/
- if (dm_flush_map(mpp->alias)) {
+ if (r) {
/*
* May not really be an error -- if the map was already flushed
* from the device mapper by dmsetup(8) for instance.
*/
/*
* May not really be an error -- if the map was already flushed
* from the device mapper by dmsetup(8) for instance.
*/
- condlog(0, "%s: can't flush", mpp->alias);
- return 1;
+ if (r == 1)
@ -664,48 +664,48 @@ Index: multipath-tools-130222/multipathd/main.c @@ -664,48 +664,48 @@ Index: multipath-tools-130222/multipathd/main.c
+ mpp->deferred_remove = DEFERRED_REMOVE_IN_PROGRESS;
+ }
+ return r;
}
else {
dm_lib_release();
}
else {
dm_lib_release();
@@ -372,7 +383,7 @@ ev_remove_map (char * devname, char * al
mpp->alias, mpp->dmi->minor, minor);
return 0;
}
mpp->alias, mpp->dmi->minor, minor);
return 0;
}
- return flush_map(mpp, vecs);
+ return flush_map(mpp, vecs, 0);
}

static int
@@ -628,7 +639,7 @@ ev_remove_path (struct path *pp, struct
mpp->flush_on_last_del = FLUSH_IN_PROGRESS;
dm_queue_if_no_path(mpp->alias, 0);
}
mpp->flush_on_last_del = FLUSH_IN_PROGRESS;
dm_queue_if_no_path(mpp->alias, 0);
}
- if (!flush_map(mpp, vecs)) {
+ if (!flush_map(mpp, vecs, 1)) {
condlog(2, "%s: removed map after"
" removing all paths",
alias);
condlog(2, "%s: removed map after"
" removing all paths",
alias);
Index: multipath-tools-130222/libmultipath/structs_vec.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/structs_vec.c
+++ multipath-tools-130222/libmultipath/structs_vec.c
@@ -392,6 +392,8 @@ __setup_multipath (struct vectors * vecs
set_no_path_retry(mpp);
select_pg_timeout(mpp);
select_flush_on_last_del(mpp);
set_no_path_retry(mpp);
select_pg_timeout(mpp);
select_flush_on_last_del(mpp);
+ if (VECTOR_SIZE(mpp->paths) != 0)
+ dm_cancel_deferred_remove(mpp);
}

return 0;
}
return 0;
@@ -565,7 +567,6 @@ int update_multipath (struct vectors *ve
}
}
}
}
}
}
-
return 0;
return 0;
}

Index: multipath-tools-130222/multipath/multipath.conf.5
===================================================================
--- multipath-tools-130222.orig/multipath/multipath.conf.5
@ -750,14 +750,15 @@ Index: multipath-tools-130222/libmultipath/Makefile @@ -750,14 +750,15 @@ Index: multipath-tools-130222/libmultipath/Makefile
--- multipath-tools-130222.orig/libmultipath/Makefile
+++ multipath-tools-130222/libmultipath/Makefile
@@ -36,6 +36,12 @@ ifneq ($(strip $(LIBUDEV_API_RECVBUF)),0
CFLAGS += -DLIBUDEV_API_RECVBUF
CFLAGS += -DLIBUDEV_API_RECVBUF
endif

+LIBDM_API_DEFERRED = $(shell grep -Ecs '^[a-z]*[[:space:]]+dm_task_deferred_remove' /usr/include/libdevmapper.h)
+
+ifneq ($(strip $(LIBDM_API_DEFERRED)),0)
+ CFLAGS += -DLIBDM_API_DEFERRED
+endif
+

all: $(LIBS)

12
SOURCES/0104-RHBZ-1159337-fix-double-free.patch

@ -7,14 +7,14 @@ Index: multipath-tools-130222/multipathd/main.c @@ -7,14 +7,14 @@ Index: multipath-tools-130222/multipathd/main.c
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -669,9 +669,8 @@ ev_remove_path (struct path *pp, struct
/*
* update our state from kernel
*/
/*
* update our state from kernel
*/
- if (setup_multipath(vecs, mpp)) {
- goto fail;
- }
+ if (setup_multipath(vecs, mpp))
+ return 1;
sync_map_state(mpp);

condlog(2, "%s [%s]: path removed from map %s",
sync_map_state(mpp);
condlog(2, "%s [%s]: path removed from map %s",

104
SOURCES/0106-RHBZ-1169935-no-new-devs.patch

@ -14,29 +14,29 @@ Index: multipath-tools-130222/libmultipath/config.h @@ -14,29 +14,29 @@ Index: multipath-tools-130222/libmultipath/config.h
--- multipath-tools-130222.orig/libmultipath/config.h
+++ multipath-tools-130222/libmultipath/config.h
@@ -131,6 +131,7 @@ struct config {
int detect_prio;
int force_sync;
int deferred_remove;
int detect_prio;
int force_sync;
int deferred_remove;
+ int ignore_new_boot_devs;
unsigned int version[3];

char * dev;
unsigned int version[3];
char * dev;
Index: multipath-tools-130222/libmultipath/configure.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/configure.c
+++ multipath-tools-130222/libmultipath/configure.c
@@ -775,9 +775,8 @@ coalesce_paths (struct vectors * vecs, v
if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE))
continue;

if (refwwid && strncmp(pp1->wwid, refwwid, WWID_SIZE))
continue;
- /* If find_multipaths was selected check if the path is valid */
- if (conf->find_multipaths && !refwwid &&
- !should_multipath(pp1, pathvec)) {
+ /* check if the path is valid */
+ if (!refwwid && !should_multipath(pp1, pathvec)) {
orphan_path(pp1);
continue;
}
orphan_path(pp1);
continue;
}
Index: multipath-tools-130222/libmultipath/wwids.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/wwids.c
@ -46,19 +46,19 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -46,19 +46,19 @@ Index: multipath-tools-130222/libmultipath/wwids.c
#include "defaults.h"
#include "config.h"
+#include "util.h"

/*
* Copyright (c) 2010 Benjamin Marzinski, Redhat
@@ -268,15 +269,21 @@ should_multipath(struct path *pp1, vecto
{
int i;
struct path *pp2;
int i;
struct path *pp2;
+ int ignore_new_devs = (conf->ignore_new_boot_devs && in_initrd());
+
+ if (!conf->find_multipaths && !ignore_new_devs)
+ return 1;

condlog(4, "checking if %s should be multipathed", pp1->dev);
condlog(4, "checking if %s should be multipathed", pp1->dev);
- vector_foreach_slot(pathvec, pp2, i) {
- if (pp1->dev == pp2->dev)
- continue;
@ -75,53 +75,53 @@ Index: multipath-tools-130222/libmultipath/wwids.c @@ -75,53 +75,53 @@ Index: multipath-tools-130222/libmultipath/wwids.c
+ "multipathing %s", pp1->wwid, pp1->dev);
+ return 1;
+ }
}
}
if (check_wwids_file(pp1->wwid, 0) < 0) {
}
}
if (check_wwids_file(pp1->wwid, 0) < 0) {
Index: multipath-tools-130222/multipathd/main.c
===================================================================
--- multipath-tools-130222.orig/multipathd/main.c
+++ multipath-tools-130222/multipathd/main.c
@@ -503,8 +503,7 @@ rescan:
return 1;
}

return 1;
}
- if (conf->find_multipaths &&
- !should_multipath(pp, vecs->pathvec)) {
+ if (!should_multipath(pp, vecs->pathvec)) {
orphan_path(pp);
return 0;
}
orphan_path(pp);
return 0;
}
Index: multipath-tools-130222/libmultipath/config.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/config.c
+++ multipath-tools-130222/libmultipath/config.c
@@ -622,6 +622,7 @@ load_config (char * file, struct udev *u
conf->deferred_remove = DEFAULT_DEFERRED_REMOVE;
conf->hw_strmatch = 0;
conf->force_sync = 0;
conf->deferred_remove = DEFAULT_DEFERRED_REMOVE;
conf->hw_strmatch = 0;
conf->force_sync = 0;
+ conf->ignore_new_boot_devs = 0;

/*
* preload default hwtable
/*
* preload default hwtable
@@ -732,6 +733,9 @@ load_config (char * file, struct udev *u
!conf->wwids_file)
goto out;

!conf->wwids_file)
goto out;
+ if (conf->ignore_new_boot_devs)
+ in_initrd();
+
return 0;
return 0;
out:
free_config(conf);
free_config(conf);
Index: multipath-tools-130222/libmultipath/dict.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/dict.c
+++ multipath-tools-130222/libmultipath/dict.c
@@ -761,6 +761,29 @@ def_deferred_remove_handler(vector strve
return 0;
return 0;
}

+static int
+def_ignore_new_boot_devs_handler(vector strvec)
+{
@ -150,7 +150,7 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -150,7 +150,7 @@ Index: multipath-tools-130222/libmultipath/dict.c
*/
@@ -3011,6 +3034,15 @@ snprint_def_deferred_remove(char * buff,
}

static int
+snprint_def_ignore_new_boot_devs(char * buff, int len, void * data)
+{
@ -163,15 +163,15 @@ Index: multipath-tools-130222/libmultipath/dict.c @@ -163,15 +163,15 @@ Index: multipath-tools-130222/libmultipath/dict.c
+static int
snprint_ble_simple (char * buff, int len, void * data)
{
struct blentry * ble = (struct blentry *)data;
struct blentry * ble = (struct blentry *)data;
@@ -3080,6 +3112,7 @@ init_keywords(void)
install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);
install_keyword("deferred_remove", &def_deferred_remove_handler, &snprint_def_deferred_remove);
install_keyword("hw_str_match", &def_hw_strmatch_handler, &snprint_def_hw_strmatch);
install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);
install_keyword("deferred_remove", &def_deferred_remove_handler, &snprint_def_deferred_remove);
+ install_keyword("ignore_new_boot_devs", &def_ignore_new_boot_devs_handler, &snprint_def_ignore_new_boot_devs);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
__deprecated install_keyword("default_selector", &def_selector_handler, NULL);
__deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);
__deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);
Index: multipath-tools-130222/libmultipath/util.c
===================================================================
--- multipath-tools-130222.orig/libmultipath/util.c
@ -182,12 +182,12 @@ Index: multipath-tools-130222/libmultipath/util.c @@ -182,12 +182,12 @@ Index: multipath-tools-130222/libmultipath/util.c
#include <unistd.h>
+#include <sys/vfs.h>
+#include <linux/magic.h>

#include "debug.h"
#include "memory.h"
@@ -267,3 +269,31 @@ dev_t parse_devt(const char *dev_t)

return makedev(maj, min);
return makedev(maj, min);
}
+
+/* This define was taken from systemd. src/shared/macro.h */
@ -226,6 +226,6 @@ Index: multipath-tools-130222/libmultipath/util.h @@ -226,6 +226,6 @@ Index: multipath-tools-130222/libmultipath/util.h
dev_t parse_devt(const char *dev_t);
char *convert_dev(char *dev, int is_path_device);
+int in_initrd(void);

#define safe_sprintf(var, format, args...) \
snprintf(var, sizeof(var), format, ##args) >= sizeof(var)
snprintf(var, sizeof(var), format, ##args) >= sizeof(var)

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save