From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Benjamin Marzinski Date: Fri, 17 Oct 2014 11:20:34 -0500 Subject: [PATCH] RH: add wwids from kernel cmdline mpath.wwids with -A This patch adds another option to multipath, "-A", which reads /proc/cmdline for mpath.wwid= options, and adds any wwids it finds to /etc/multipath/wwids. While this isn't usually important during normal operation, since these wwids should already be added, it can be helpful during installation, to make sure that multipath can claim devices as its own, before LVM or something else makes use of them. The patch also execs "/sbin/multipath -A" before running multipathd in multipathd.service Signed-off-by: Benjamin Marzinski --- multipath/main.c | 54 +++++++++++++++++++++++++++++++++-- multipath/multipath.8 | 7 ++++- multipathd/multipathd.service | 1 + 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/multipath/main.c b/multipath/main.c index 33377147..85e4481d 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -122,7 +122,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); @@ -136,6 +136,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" @@ -455,6 +457,50 @@ static void cleanup_vecs(void) free_pathvec(vecs.pathvec, FREE_PATHS); } +static 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; +} + static int configure (struct config *conf, enum mpath_cmds cmd, enum devtypes dev_type, char *devpath) @@ -833,7 +879,7 @@ main (int argc, char *argv[]) conf->retrigger_tries = 0; conf->force_sync = 1; atexit(cleanup_vecs); - while ((arg = getopt(argc, argv, ":adDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { + while ((arg = getopt(argc, argv, ":aAdDcChl::eFfM:v:p:b:BrR:itTquUwW")) != EOF ) { switch(arg) { case 1: printf("optarg : %s\n",optarg); break; @@ -910,6 +956,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 17df59f5..5ca75359 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 6d57c7e8..dfc1e962 100644 --- a/multipathd/multipathd.service +++ b/multipathd/multipathd.service @@ -16,6 +16,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