From f93248d8e3598ccdc42b6d639107917c9cda268c Mon Sep 17 00:00:00 2001 From: Changqing Li Date: Thu, 26 Sep 2019 16:29:48 +0800 Subject: [PATCH 06/12] 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 Upstream-Status: Pending [OP: Rebase to 0.9.3] Signed-off-by: Ovidiu Panait Rebase to 0.9.8 Signed-off-by: Changqing Li --- libmultipath/wwids.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ libmultipath/wwids.h | 1 + 2 files changed, 45 insertions(+) diff --git a/libmultipath/wwids.c b/libmultipath/wwids.c index 591cd09b..b01f1b85 100644 --- a/libmultipath/wwids.c +++ b/libmultipath/wwids.c @@ -439,3 +439,47 @@ int unmark_failed_wwid(const char *wwid) print_failed_wwid_result("unmark_failed", wwid, r); return r; } + +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 0c6ee54d..e32a0b0e 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, -- 2.25.1