|
|
|
---
|
|
|
|
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
|