]> git.ipfire.org Git - people/pmueller/ipfire-3.x.git/blobdiff - multipath-tools/patches/0080-RHBZ-1075796-cmdline-wwid.patch
multipath-tools: Update to snapshot from 2013-02-22
[people/pmueller/ipfire-3.x.git] / multipath-tools / patches / 0080-RHBZ-1075796-cmdline-wwid.patch
diff --git a/multipath-tools/patches/0080-RHBZ-1075796-cmdline-wwid.patch b/multipath-tools/patches/0080-RHBZ-1075796-cmdline-wwid.patch
new file mode 100644 (file)
index 0000000..f943aa3
--- /dev/null
@@ -0,0 +1,157 @@
+---
+ libmultipath/wwids.c          |   44 ++++++++++++++++++++++++++++++++++++++++++
+ libmultipath/wwids.h          |    1 
+ multipath/main.c              |   12 ++++++++---
+ multipath/multipath.8         |    5 +++-
+ multipathd/multipathd.service |    1 
+ 5 files changed, 59 insertions(+), 4 deletions(-)
+
+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;
+ }
++
++int remember_cmdline_wwid(void)
++{
++      FILE *f = NULL;
++      char buf[LINE_MAX], *next, *ptr;
++      int ret = 0;
++
++      f = fopen("/proc/cmdline", "re");
++      if (!f) {
++              condlog(0, "can't open /proc/cmdline : %s", strerror(errno));
++              return -1;
++      }
++
++      if (!fgets(buf, sizeof(buf), f)) {
++              if (ferror(f))
++                      condlog(0, "read of /proc/cmdline failed : %s",
++                              strerror(errno));
++              else
++                      condlog(0, "couldn't read /proc/cmdline");
++              fclose(f);
++              return -1;
++      }
++      fclose(f);
++      next = buf;
++      while((ptr = strstr(next, "mpath.wwid="))) {
++              ptr += 11;
++              next = strpbrk(ptr, " \t\n");
++              if (next) {
++                      *next = '\0';
++                      next++;
++              }
++              if (strlen(ptr)) {
++                      if (remember_wwid(ptr) != 0)
++                              ret = -1;
++              }
++              else {
++                      condlog(0, "empty mpath.wwid kernel command line option");
++                      ret = -1;
++              }
++              if (!next)
++                      break;
++      }
++      return ret;
++}
+Index: multipath-tools-130222/libmultipath/wwids.h
+===================================================================
+--- multipath-tools-130222.orig/libmultipath/wwids.h
++++ multipath-tools-130222/libmultipath/wwids.h
+@@ -17,5 +17,6 @@ int remember_wwid(char *wwid);
+ int check_wwids_file(char *wwid, int write_wwid);
+ 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
+===================================================================
+--- 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, "  %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);
+@@ -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" \
++              "  -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" \
+@@ -438,7 +440,7 @@ main (int argc, char *argv[])
+       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] == ':')
+@@ -474,7 +476,7 @@ main (int argc, char *argv[])
+       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;
+@@ -538,6 +540,10 @@ main (int argc, char *argv[])
+                       goto out;
+               case 'T':
+                       break;
++              case 'A':
++                      if (remember_cmdline_wwid() != 0)
++                              exit(1);
++                      exit(0);
+               case 'h':
+                       usage(argv[0]);
+                       exit(0);
+Index: multipath-tools-130222/multipathd/multipathd.service
+===================================================================
+--- multipath-tools-130222.orig/multipathd/multipathd.service
++++ multipath-tools-130222/multipathd/multipathd.service
+@@ -11,6 +11,7 @@ Conflicts=shutdown.target
+ Type=forking
+ PIDFile=/var/run/multipathd/multipathd.pid
+ ExecStartPre=/sbin/modprobe dm-multipath
++ExecStartPre=-/sbin/multipath -A
+ ExecStart=/sbin/multipathd
+ ExecReload=/sbin/multipathd reconfigure
+ #ExecStop=/path/to/scrip delete-me if not necessary
+Index: multipath-tools-130222/multipath/multipath.8
+===================================================================
+--- multipath-tools-130222.orig/multipath/multipath.8
++++ multipath-tools-130222/multipath/multipath.8
+@@ -8,7 +8,7 @@ multipath \- Device mapper target autoco
+ .RB [\| \-b\ \c
+ .IR bindings_file \|]
+ .RB [\| \-d \|]
+-.RB [\| \-h | \-l | \-ll | \-f | \-t | \-F | \-B | \-c | \-q | \|-r | \-a | \-w | \-W \|]
++.RB [\| \-h | \-l | \-ll | \-f | \-t | \-F | \-B | \-c | \-q | \|-r | \-a | \-A | \-w | \-W \|]
+ .RB [\| \-p\ \c
+ .BR failover | multibus | group_by_serial | group_by_prio | group_by_node_name \|]
+ .RB [\| device \|]
+@@ -71,6 +71,9 @@ allow device tables with queue_if_no_pat
+ .B \-a
+ add the wwid for the specified device to the wwids file
+ .TP
++.B \-A
++add wwids from any kernel command line mpath.wwid parameters to the wwids file
++.TP
+ .B \-w
+ remove the wwid for the specified device from the wwids file
+ .TP