diff --git a/libmultipath/wwids.c b/libmultipath/wwids.c index 28a2150..fab6fc8 100644 --- a/libmultipath/wwids.c +++ b/libmultipath/wwids.c @@ -454,3 +454,47 @@ int op ## _wwid(const char *wwid) \ declare_failed_wwid_op(is_failed, false) declare_failed_wwid_op(mark_failed, true) declare_failed_wwid_op(unmark_failed, true) + +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; +} diff --git a/libmultipath/wwids.h b/libmultipath/wwids.h index 0c6ee54..e32a0b0 100644 --- a/libmultipath/wwids.h +++ b/libmultipath/wwids.h @@ -17,6 +17,7 @@ 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); enum { WWID_IS_NOT_FAILED = 0, diff --git a/multipath/main.c b/multipath/main.c index cf9d2a2..78822ee 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -138,7 +138,7 @@ usage (char * progname) fprintf (stderr, " %s [-v level] [-R retries] -F\n", progname); fprintf (stderr, " %s [-v level] [-l|-ll] [device]\n", progname); fprintf (stderr, " %s [-v level] [-a|-w] device\n", progname); - fprintf (stderr, " %s [-v level] -W\n", progname); + fprintf (stderr, " %s [-v level] [-A|-W]\n", progname); fprintf (stderr, " %s [-v level] [-i] [-c|-C] device\n", progname); fprintf (stderr, " %s [-v level] [-i] [-u|-U]\n", progname); fprintf (stderr, " %s [-h|-t|-T]\n", progname); @@ -151,6 +151,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" " -C check if a multipath device has usable paths\n" " -q allow queue_if_no_path when multipathd is not running\n" @@ -907,7 +909,7 @@ main (int argc, char *argv[]) multipath_conf = conf; conf->retrigger_tries = 0; conf->force_sync = 1; - while ((arg = getopt(argc, argv, ":adcChl::FfM:v:p:b:BrR:itTquUwW")) != EOF ) { + while ((arg = getopt(argc, argv, ":aAdcChl::FfM:v:p:b:BrR:itTquUwW")) != EOF ) { switch(arg) { case 1: printf("optarg : %s\n",optarg); break; @@ -977,6 +979,10 @@ main (int argc, char *argv[]) case 'T': cmd = CMD_DUMP_CONFIG; break; + case 'A': + if (remember_cmdline_wwid() != 0) + exit(RTVL_FAIL); + exit(RTVL_OK); case 'h': usage(argv[0]); exit(RTVL_OK); diff --git a/multipath/multipath.8 b/multipath/multipath.8 index 9cdd05a..8befc45 100644 --- a/multipath/multipath.8 +++ b/multipath/multipath.8 @@ -63,7 +63,7 @@ multipath \- Device mapper target autoconfig. .B multipath .RB [\| \-v\ \c .IR level \|] -.B -W +.RB [\| \-A | \-W \|] . .LP .B multipath @@ -145,6 +145,11 @@ device mapper, path checkers ...). Add the WWID for the specified device to the WWIDs file. . .TP +.B \-A +Add the WWIDs from any kernel command line \fImpath.wwid\fR parameters to the +WWIDs file. +. +.TP .B \-w Remove the WWID for the specified device from the WWIDs file. . diff --git a/multipathd/multipathd.service b/multipathd/multipathd.service index 17434ce..0fbcc46 100644 --- a/multipathd/multipathd.service +++ b/multipathd/multipathd.service @@ -15,6 +15,7 @@ Type=notify NotifyAccess=main LimitCORE=infinity ExecStartPre=-/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath +ExecStartPre=-/sbin/multipath -A ExecStart=/sbin/multipathd -d -s ExecReload=/sbin/multipathd reconfigure TasksMax=infinity