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