1*4882a593SmuzhiyunFrom 0f54b3120ca06ff3168cdbf901a27b68c4638398 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Changqing Li <changqing.li@windriver.com>
3*4882a593SmuzhiyunDate: Thu, 26 Sep 2019 16:29:48 +0800
4*4882a593SmuzhiyunSubject: [PATCH] From 0000000000000000000000000000000000000000 Mon Sep
5*4882a593Smuzhiyun17
6*4882a593Smuzhiyun 00:00:00 2001 From: Benjamin Marzinski <bmarzins@redhat.com> Date: Fri,
7*4882a593Smuzhiyun17
8*4882a593Smuzhiyun Oct 2014 11:20:34 -0500 Subject: [PATCH] RH: add wwids from kernel
9*4882a593Smuzhiyuncmdline
10*4882a593Smuzhiyun mpath.wwids with -A
11*4882a593Smuzhiyun
12*4882a593SmuzhiyunThis patch adds another option to multipath, "-A", which reads
13*4882a593Smuzhiyun/proc/cmdline for mpath.wwid=<WWID> options, and adds any wwids it finds
14*4882a593Smuzhiyunto /etc/multipath/wwids.  While this isn't usually important during
15*4882a593Smuzhiyunnormal operation, since these wwids should already be added, it can be
16*4882a593Smuzhiyunhelpful during installation, to make sure that multipath can claim
17*4882a593Smuzhiyundevices as its own, before LVM or something else makes use of them.  The
18*4882a593Smuzhiyunpatch also execs "/sbin/multipath -A" before running multipathd in
19*4882a593Smuzhiyunmultipathd.service
20*4882a593Smuzhiyun
21*4882a593SmuzhiyunSigned-off-by: Benjamin Marzinski <bmarzins@redhat.com>
22*4882a593Smuzhiyun
23*4882a593SmuzhiyunUpstream-Status: Pending
24*4882a593Smuzhiyun
25*4882a593SmuzhiyunUpdate this patch to new version 0.8.2
26*4882a593Smuzhiyun
27*4882a593SmuzhiyunSigned-off-by: Changqing Li <changqing.li@windriver.com>
28*4882a593Smuzhiyun---
29*4882a593Smuzhiyun libmultipath/wwids.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
30*4882a593Smuzhiyun libmultipath/wwids.h |  1 +
31*4882a593Smuzhiyun 2 files changed, 45 insertions(+)
32*4882a593Smuzhiyun
33*4882a593Smuzhiyundiff --git a/libmultipath/wwids.c b/libmultipath/wwids.c
34*4882a593Smuzhiyunindex 28a2150d..a0bfa851 100644
35*4882a593Smuzhiyun--- a/libmultipath/wwids.c
36*4882a593Smuzhiyun+++ b/libmultipath/wwids.c
37*4882a593Smuzhiyun@@ -454,3 +454,47 @@ int op ## _wwid(const char *wwid) \
38*4882a593Smuzhiyun declare_failed_wwid_op(is_failed, false)
39*4882a593Smuzhiyun declare_failed_wwid_op(mark_failed, true)
40*4882a593Smuzhiyun declare_failed_wwid_op(unmark_failed, true)
41*4882a593Smuzhiyun+
42*4882a593Smuzhiyun+int remember_cmdline_wwid(void)
43*4882a593Smuzhiyun+{
44*4882a593Smuzhiyun+       FILE *f = NULL;
45*4882a593Smuzhiyun+       char buf[LINE_MAX], *next, *ptr;
46*4882a593Smuzhiyun+       int ret = 0;
47*4882a593Smuzhiyun+
48*4882a593Smuzhiyun+       f = fopen("/proc/cmdline", "re");
49*4882a593Smuzhiyun+       if (!f) {
50*4882a593Smuzhiyun+               condlog(0, "can't open /proc/cmdline : %s", strerror(errno));
51*4882a593Smuzhiyun+               return -1;
52*4882a593Smuzhiyun+       }
53*4882a593Smuzhiyun+
54*4882a593Smuzhiyun+       if (!fgets(buf, sizeof(buf), f)) {
55*4882a593Smuzhiyun+               if (ferror(f))
56*4882a593Smuzhiyun+                       condlog(0, "read of /proc/cmdline failed : %s",
57*4882a593Smuzhiyun+                               strerror(errno));
58*4882a593Smuzhiyun+               else
59*4882a593Smuzhiyun+                       condlog(0, "couldn't read /proc/cmdline");
60*4882a593Smuzhiyun+               fclose(f);
61*4882a593Smuzhiyun+               return -1;
62*4882a593Smuzhiyun+       }
63*4882a593Smuzhiyun+       fclose(f);
64*4882a593Smuzhiyun+       next = buf;
65*4882a593Smuzhiyun+       while((ptr = strstr(next, "mpath.wwid="))) {
66*4882a593Smuzhiyun+               ptr += 11;
67*4882a593Smuzhiyun+               next = strpbrk(ptr, " \t\n");
68*4882a593Smuzhiyun+               if (next) {
69*4882a593Smuzhiyun+                       *next = '\0';
70*4882a593Smuzhiyun+                       next++;
71*4882a593Smuzhiyun+               }
72*4882a593Smuzhiyun+               if (strlen(ptr)) {
73*4882a593Smuzhiyun+                       if (remember_wwid(ptr) != 0)
74*4882a593Smuzhiyun+                               ret = -1;
75*4882a593Smuzhiyun+               }
76*4882a593Smuzhiyun+               else {
77*4882a593Smuzhiyun+                       condlog(0, "empty mpath.wwid kernel command line option");
78*4882a593Smuzhiyun+                       ret = -1;
79*4882a593Smuzhiyun+               }
80*4882a593Smuzhiyun+               if (!next)
81*4882a593Smuzhiyun+                       break;
82*4882a593Smuzhiyun+       }
83*4882a593Smuzhiyun+       return ret;
84*4882a593Smuzhiyun+}
85*4882a593Smuzhiyundiff --git a/libmultipath/wwids.h b/libmultipath/wwids.h
86*4882a593Smuzhiyunindex 0c6ee54d..e32a0b0e 100644
87*4882a593Smuzhiyun--- a/libmultipath/wwids.h
88*4882a593Smuzhiyun+++ b/libmultipath/wwids.h
89*4882a593Smuzhiyun@@ -17,6 +17,7 @@ int remember_wwid(char *wwid);
90*4882a593Smuzhiyun int check_wwids_file(char *wwid, int write_wwid);
91*4882a593Smuzhiyun int remove_wwid(char *wwid);
92*4882a593Smuzhiyun int replace_wwids(vector mp);
93*4882a593Smuzhiyun+int remember_cmdline_wwid(void);
94*4882a593Smuzhiyun
95*4882a593Smuzhiyun enum {
96*4882a593Smuzhiyun 	WWID_IS_NOT_FAILED = 0,
97*4882a593Smuzhiyun--
98*4882a593Smuzhiyun2.17.1
99*4882a593Smuzhiyun
100