upgrade version to 0.9.5

This commit is contained in:
wangzhiqiang 2024-02-05 16:52:45 +08:00
parent 372be44064
commit 9d648dceaf
24 changed files with 206 additions and 2553 deletions

Binary file not shown.

BIN
0.9.5.tar.gz Normal file

Binary file not shown.

View File

@ -1,7 +1,7 @@
From d025415810a5792c333e99bd2f77a902c235ea09 Mon Sep 17 00:00:00 2001
From dc58ea0d1f812c81b8dba9c327272a90b84d2005 Mon Sep 17 00:00:00 2001
From: Benjamin Marzinski <bmarzins@redhat.com>
Date: Fri, 15 May 2015 18:14:09 -0500
Subject: [PATCH 01/15] change order of multipath.rules
Subject: [PATCH 1/2] change order of multipath.rules
At least for RedHat, the rule that calls scsi_id is
60-persistent-storage.rules, so the multipath rule needs to come
@ -13,27 +13,27 @@ Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/multipath/Makefile b/multipath/Makefile
index 0828a8f..b9bbb3c 100644
index 73db991..b3c2cc8 100644
--- a/multipath/Makefile
+++ b/multipath/Makefile
@@ -24,7 +24,7 @@ install:
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
- $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules
+ $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man8dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
@@ -33,7 +33,7 @@ install:
uninstall:
$(RM) $(DESTDIR)$(bindir)/$(EXEC)
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
- $(RM) $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules
+ $(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
$(Q)$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
$(Q)$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
- $(Q)$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)$(udevrulesdir)/56-multipath.rules
+ $(Q)$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)$(udevrulesdir)/62-multipath.rules
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(modulesloaddir)
$(Q)$(INSTALL_PROGRAM) -m 644 modules-load.conf $(DESTDIR)$(modulesloaddir)/multipath.conf
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(tmpfilesdir)
@@ -44,7 +44,7 @@ uninstall:
$(Q)$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
- $(Q)$(RM) $(DESTDIR)$(libudevdir)/rules.d/56-multipath.rules
+ $(Q)$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
$(Q)$(RM) $(DESTDIR)$(mandir)/man8/$(EXEC).8
$(Q)$(RM) $(DESTDIR)$(mandir)/man5/$(EXEC).conf.5
--
1.8.3.1
2.33.0

View File

@ -1,7 +1,7 @@
From 1d3c03c1b5136be68aad4f98763537eb56735f0c Mon Sep 17 00:00:00 2001
From 0ae0e8054ed01ae15c10637c9c646da2259b0ed1 Mon Sep 17 00:00:00 2001
From: Benjamin Marzinski <bmarzins@redhat.com>
Date: Thu, 16 Oct 2014 15:49:01 -0500
Subject: [PATCH 02/15] RH: add mpathconf
Subject: [PATCH 2/2] RH: add mpathconf
mpathconf is a program (largely based on lvmcomf) to help users
configure /etc/multipath.conf and enable or disable multipathing. It
@ -17,47 +17,44 @@ Changed-by: hy-euler <eulersotragemt@huawei.com>
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
Signed-off-by: hy-euler<eulersotragemt@huawei.com>
---
multipath/Makefile | 5 +
multipath/mpathconf | 464 ++++++++++++++++++++++++++++++++++++++++++++++++++
multipath/mpathconf.8 | 119 +++++++++++++
3 files changed, 588 insertions(+)
multipath/Makefile | 4 +
multipath/mpathconf | 464 ++++++++++++++++++++++++++++++++++++++++++
multipath/mpathconf.8 | 119 +++++++++++
3 files changed, 587 insertions(+)
create mode 100644 multipath/mpathconf
create mode 100644 multipath/mpathconf.8
diff --git a/multipath/Makefile b/multipath/Makefile
index b9bbb3c..e720c7f 100644
index b3c2cc8..b9e04b2 100644
--- a/multipath/Makefile
+++ b/multipath/Makefile
@@ -18,10 +18,12 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) $(LIBDEPS)
$(GZIP) $(EXEC).8 > $(EXEC).8.gz
$(GZIP) $(EXEC).conf.5 > $(EXEC).conf.5.gz
+ $(GZIP) mpathconf.8 > mpathconf.8.gz
@@ -22,6 +22,7 @@ $(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
install:
$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
+ $(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
@@ -29,13 +31,16 @@ install:
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5.gz $(DESTDIR)$(man5dir)
+ $(INSTALL_PROGRAM) -m 644 mpathconf.8.gz $(DESTDIR)$(man8dir)
uninstall:
$(RM) $(DESTDIR)$(bindir)/$(EXEC)
$(RM) $(DESTDIR)$(udevrulesdir)/11-dm-mpath.rules
$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
+ $(RM) $(DESTDIR)$(bindir)/mpathconf
$(RM) $(DESTDIR)$(man8dir)/$(EXEC).8.gz
$(RM) $(DESTDIR)$(man5dir)/$(EXEC).conf.5.gz
+ $(RM) $(DESTDIR)$(man8dir)/mpathconf.8.gz
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(bindir)
$(Q)$(INSTALL_PROGRAM) -m 755 $(EXEC) $(DESTDIR)$(bindir)/
+ $(Q)$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
$(Q)$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
$(Q)$(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)$(udevrulesdir)/62-multipath.rules
@@ -33,6 +34,7 @@ install:
$(Q)$(INSTALL_PROGRAM) -m 644 $(EXEC).8 $(DESTDIR)$(mandir)/man8
$(Q)$(INSTALL_PROGRAM) -d $(DESTDIR)$(mandir)/man5
$(Q)$(INSTALL_PROGRAM) -m 644 $(EXEC).conf.5 $(DESTDIR)$(mandir)/man5
+ $(Q)$(INSTALL_PROGRAM) -m 644 mpathconf.8 $(DESTDIR)$(mandir)/man8
ifneq ($(SCSI_DH_MODULES_PRELOAD),)
$(Q)$(INSTALL_PROGRAM) -m 644 scsi_dh.conf $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
$(Q)for _x in $(SCSI_DH_MODULES_PRELOAD); do echo "$$_x"; done \
@@ -45,8 +47,10 @@ uninstall:
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/multipath.conf
$(Q)$(RM) $(DESTDIR)$(modulesloaddir)/scsi_dh.conf
$(Q)$(RM) $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
+ $(Q)$(RM) $(DESTDIR)$(bindir)/mpathconf
$(Q)$(RM) $(DESTDIR)$(mandir)/man8/$(EXEC).8
$(Q)$(RM) $(DESTDIR)$(mandir)/man5/$(EXEC).conf.5
+ $(Q)$(RM) $(DESTDIR)$(mandir)/man8/mpathconf.8
clean: dep_clean
$(RM) core *.o $(EXEC) *.gz
$(Q)$(RM) core *.o $(EXEC) multipath.rules tmpfiles.conf
diff --git a/multipath/mpathconf b/multipath/mpathconf
new file mode 100644
index 0000000..e839134
@ -654,5 +651,5 @@ index 0000000..5b7ae0c
+.SH AUTHOR
+Benjamin Marzinski <bmarzins@redhat.com>
--
1.8.3.1
2.33.0

View File

@ -1,25 +1,26 @@
From 4e43314afe869f70f96d58dc978d81e104acb650 Mon Sep 17 00:00:00 2001
From 42fb8e13857b773a34aa386ccfc38dd4456a089b Mon Sep 17 00:00:00 2001
From: wangjufeng <wangjufeng@huawei.com>
Date: Fri, 1 Nov 2019 16:48:49 +0800
Subject: [PATCH 04/15] fix syntax error
Subject: [PATCH] fix syntax error
---
Makefile.inc | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
create-config.mk | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Makefile.inc b/Makefile.inc
index d0ec9b4..9944aa1 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -43,7 +43,7 @@ ifndef SYSTEMD
else
ifeq ($(shell systemctl --version >/dev/null 2>&1 && echo 1), 1)
SYSTEMD = $(shell systemctl --version 2> /dev/null | \
- sed -n 's/systemd \([0-9]*\).*/\1/p')
+ sed -n 's/systemd\([0-9]*\).*/\1/p' | awk '{print $$1}')
endif
endif
diff --git a/create-config.mk b/create-config.mk
index f128375..81e9081 100644
--- a/create-config.mk
+++ b/create-config.mk
@@ -124,7 +124,8 @@ ifeq ($(ENABLE_DMEVENTS_POLL),0)
endif
SYSTEMD := $(strip $(or $(shell $(PKGCONFIG) --modversion libsystemd 2>/dev/null | awk '{print $$1}'), \
- $(shell systemctl --version 2>/dev/null | sed -n 's/systemd \([0-9]*\).*/\1/p')))
+ $(shell systemctl --version 2>/dev/null | sed -n 's/systemd\([0-9]*\).*/\1/p' | \
+ awk '{print $$1}')))
# $(call TEST_CC_OPTION,option,fallback)
--
1.8.3.1
2.33.0

View File

@ -1,18 +1,18 @@
From f3c11af226bcbb36da7c2802774c6128dd88b5b4 Mon Sep 17 00:00:00 2001
From 8e3c6debb3ed286f94af230f59a0fb9f6a449687 Mon Sep 17 00:00:00 2001
From: Lixiaokeng <lixiaokeng@huawei.com>
Date: Tue, 23 Nov 2021 20:14:23 +0800
Subject: [PATCH 05/15] fix multipathd resize when not all paths size are equal
Subject: [PATCH] fix multipathd resize when not all paths size are equal
---
multipathd/cli_handlers.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 6d3a0ae..aeb2be5 100644
index 44bf43d..8b59d88 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -866,9 +866,10 @@ cli_resize(void *v, char **reply, int *len, void *data)
char * mapname = get_keyparam(v, MAP);
@@ -845,9 +845,10 @@ cli_resize(void *v, struct strbuf *reply, void *data)
char * mapname = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
int minor;
- unsigned long long size;
@ -23,7 +23,7 @@ index 6d3a0ae..aeb2be5 100644
mapname = convert_dev(mapname, 0);
condlog(2, "%s: resize map (operator)", mapname);
@@ -906,6 +907,22 @@ cli_resize(void *v, char **reply, int *len, void *data)
@@ -885,6 +886,22 @@ cli_resize(void *v, struct strbuf *reply, void *data)
mapname);
return 1;
}
@ -47,5 +47,5 @@ index 6d3a0ae..aeb2be5 100644
condlog(0, "%s: map is still the same size (%llu)", mapname,
mpp->size);
--
1.8.3.1
2.33.0

View File

@ -1,7 +1,7 @@
From 1b330f511a8b73b56b282c9aa613faccdb9a72f7 Mon Sep 17 00:00:00 2001
From 1b4ed55ada1f5bcbb676363f44dc3828ce71ce89 Mon Sep 17 00:00:00 2001
From: sunguoshuai <sunguoshuai@huawei.com>
Date: Tue, 22 Jan 2019 22:00:35 -0500
Subject: [PATCH 06/15] avoid handling paths repeatedly in coalesce paths
Subject: [PATCH] avoid handling paths repeatedly in coalesce paths
reason:fix lun expansion failure when there is offline path
---
@ -12,10 +12,10 @@ reason:fix lun expansion failure when there is offline path
4 files changed, 14 insertions(+)
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index 7edb355..fdf8005 100644
index 4a1c28b..4956d32 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -1150,6 +1150,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
@@ -1106,6 +1106,7 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
goto out;
}
@ -23,8 +23,8 @@ index 7edb355..fdf8005 100644
/* skip this path for some reason */
/* 1. if path has no unique id or wwid blacklisted */
@@ -1186,6 +1187,12 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
orphan_path(pp1, "only one path");
@@ -1150,6 +1151,12 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
orphan_path(pp1, "nvme:tcp path not allowed with request queue_mode multipath device");
continue;
}
+ /* if path is handled before */
@ -33,10 +33,10 @@ index 7edb355..fdf8005 100644
+ continue;
+ }
+
/*
* at this point, we know we really got a new mp
@@ -1204,6 +1211,10 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
*/
@@ -1167,6 +1174,10 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
for (i = k + 1; i < VECTOR_SIZE(pathvec); i++) {
pp2 = VECTOR_SLOT(pathvec, i);
@ -48,10 +48,10 @@ index 7edb355..fdf8005 100644
if (strcmp(pp1->wwid, pp2->wwid))
continue;
diff --git a/libmultipath/structs.c b/libmultipath/structs.c
index 6e5a103..557657c 100644
index 87e84d5..2e44566 100644
--- a/libmultipath/structs.c
+++ b/libmultipath/structs.c
@@ -101,6 +101,7 @@ alloc_path (void)
@@ -126,6 +126,7 @@ alloc_path (void)
pp->fd = -1;
pp->tpgs = TPGS_UNDEF;
pp->priority = PRIO_UNDEF;
@ -60,22 +60,22 @@ index 6e5a103..557657c 100644
checker_clear(&pp->checker);
dm_path_to_gen(pp)->ops = &dm_gen_path_ops;
diff --git a/libmultipath/structs.h b/libmultipath/structs.h
index 399540e..ec12660 100644
index a120875..67ba572 100644
--- a/libmultipath/structs.h
+++ b/libmultipath/structs.h
@@ -310,6 +310,7 @@ struct path {
@@ -349,6 +349,7 @@ struct path {
struct checker checker;
struct multipath * mpp;
int fd;
+ int handled;
int initialized;
int retriggers;
unsigned int path_failures;
int partial_retrigger_delay;
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index 85d97ac..8170150 100644
index f3fdc5a..61001aa 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -718,6 +718,7 @@ int verify_paths(struct multipath *mpp)
@@ -738,6 +738,7 @@ int verify_paths(struct multipath *mpp)
return 0;
vector_foreach_slot (mpp->paths, pp, i) {
@ -84,5 +84,5 @@ index 85d97ac..8170150 100644
* see if path is in sysfs
*/
--
1.8.3.1
2.33.0

View File

@ -1,7 +1,7 @@
From 1c49c790c50452564b7319b2a427462ad266793f Mon Sep 17 00:00:00 2001
From 9fab4f0956292141a72f7144f1d4157d353c0299 Mon Sep 17 00:00:00 2001
From: renmingshuai <renmingshuai@huawei.com>
Date: Thu, 28 Jan 2021 22:26:58 +0800
Subject: [PATCH 07/15] fix lun expansion failure when there is offline path
Subject: [PATCH] fix lun expansion failure when there is offline path
---
libmultipath/configure.c | 10 ++++++++++
@ -9,11 +9,11 @@ Subject: [PATCH 07/15] fix lun expansion failure when there is offline path
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/libmultipath/configure.c b/libmultipath/configure.c
index fdf8005..84a246b 100644
index 4956d32..ce5bd8b 100644
--- a/libmultipath/configure.c
+++ b/libmultipath/configure.c
@@ -1187,6 +1187,13 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
orphan_path(pp1, "only one path");
@@ -1151,6 +1151,13 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
orphan_path(pp1, "nvme:tcp path not allowed with request queue_mode multipath device");
continue;
}
+
@ -26,7 +26,7 @@ index fdf8005..84a246b 100644
/* if path is handled before */
if (pp1->handled) {
condlog(3, "%s: skip handled path.", pp1->dev_t);
@@ -1219,6 +1226,9 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
@@ -1182,6 +1189,9 @@ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid,
if (strcmp(pp1->wwid, pp2->wwid))
continue;
@ -37,10 +37,10 @@ index fdf8005..84a246b 100644
mpp->size = pp2->size;
diff --git a/libmultipath/structs_vec.c b/libmultipath/structs_vec.c
index 8170150..adc034b 100644
index 61001aa..317d172 100644
--- a/libmultipath/structs_vec.c
+++ b/libmultipath/structs_vec.c
@@ -722,8 +722,9 @@ int verify_paths(struct multipath *mpp)
@@ -742,8 +742,9 @@ int verify_paths(struct multipath *mpp)
/*
* see if path is in sysfs
*/
@ -53,5 +53,5 @@ index 8170150..adc034b 100644
condlog(1, "%s: removing valid path %s in state %d",
mpp->alias, pp->dev, pp->state);
--
1.8.3.1
2.33.0

View File

@ -1,18 +1,18 @@
From 1564c9c5f94dc23959f46e3061c33146a98523d2 Mon Sep 17 00:00:00 2001
From a7e2e9405183dc9066b62a03a333c23a4af2f410 Mon Sep 17 00:00:00 2001
From: sunguoshuai <sunguoshuai@huawei.com>
Date: Wed, 23 Jan 2019 02:21:31 -0500
Subject: [PATCH 09/15] fix change reservation key to uint8 for memcmp
Subject: [PATCH] fix change reservation key to uint8 for memcmp
reason:fix change reservation key to uint8 for memcmp
---
libmpathpersist/mpath_persist.c | 13 +++++++++++--
libmpathpersist/mpath_persist_int.c | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/libmpathpersist/mpath_persist.c b/libmpathpersist/mpath_persist.c
index 803a2a2..a062920 100644
--- a/libmpathpersist/mpath_persist.c
+++ b/libmpathpersist/mpath_persist.c
@@ -275,6 +275,9 @@ static int do_mpath_persistent_reserve_out(vector curmp, vector pathvec, int fd,
diff --git a/libmpathpersist/mpath_persist_int.c b/libmpathpersist/mpath_persist_int.c
index 178c2f5..d88499a 100644
--- a/libmpathpersist/mpath_persist_int.c
+++ b/libmpathpersist/mpath_persist_int.c
@@ -657,6 +657,9 @@ int do_mpath_persistent_reserve_out(vector curmp, vector pathvec, int fd,
int ret;
uint64_t prkey;
struct config *conf;
@ -22,7 +22,7 @@ index 803a2a2..a062920 100644
ret = mpath_get_map(curmp, pathvec, fd, &alias, &mpp);
if (ret != MPATH_PR_SUCCESS)
@@ -301,8 +304,14 @@ static int do_mpath_persistent_reserve_out(vector curmp, vector pathvec, int fd,
@@ -683,8 +686,14 @@ int do_mpath_persistent_reserve_out(vector curmp, vector pathvec, int fd,
}
}
@ -40,5 +40,5 @@ index 803a2a2..a062920 100644
condlog(0, "%s: configured reservation key doesn't match: 0x%" PRIx64, alias, get_be64(mpp->reservation_key));
ret = MPATH_PR_SYNTAX_ERROR;
--
1.8.3.1
2.33.0

View File

@ -1,17 +1,17 @@
From 822769cf9509ebca9968ebd29a983271b24b1625 Mon Sep 17 00:00:00 2001
From e8320323aea97e9bfddd8cd5f4b31ec525370eb3 Mon Sep 17 00:00:00 2001
From: Lixiaokeng <lixiaokeng@huawei.com>
Date: Tue, 23 Nov 2021 21:16:19 +0800
Subject: [PATCH 10/15] bugfix flush and sync before reboot
Subject: [PATCH] bugfix flush and sync before reboot
---
libmultipath/util.c | 7 +++++++
libmpathutil/util.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/libmultipath/util.c b/libmultipath/util.c
index ea85840..dd32803 100644
--- a/libmultipath/util.c
+++ b/libmultipath/util.c
@@ -368,6 +368,13 @@ int safe_write(int fd, const void *buf, size_t count)
diff --git a/libmpathutil/util.c b/libmpathutil/util.c
index 92f25a5..a89f0b4 100644
--- a/libmpathutil/util.c
+++ b/libmpathutil/util.c
@@ -318,6 +318,13 @@ int safe_write(int fd, const void *buf, size_t count)
count -= r;
buf = (const char *)buf + r;
}
@ -26,5 +26,5 @@ index ea85840..dd32803 100644
}
--
1.8.3.1
2.33.0

View File

@ -1,7 +1,7 @@
From 021d7687e208d0e01feec945bbde5ff0a5557463 Mon Sep 17 00:00:00 2001
From 686e2fcd742037d3c5a9830fc89638b5e862242a Mon Sep 17 00:00:00 2001
From: wangjufeng <wangjufeng@huawei.com>
Date: Fri, 10 Jan 2020 11:57:08 +0800
Subject: [PATCH 13/15] kpartx: change kpartx file and default bindir
Subject: [PATCH] kpartx: change kpartx file and default bindir
Change default bindir of multipath to /usr/sbin. Don't
set device name-partition number delimiter in kpartx rules.
@ -13,23 +13,23 @@ Signed-off-by: wangjufeng <wangjufeng@huawei.com>
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Makefile.inc b/Makefile.inc
index 9944aa1..9913e7a 100644
index 2e25d2e..f17fa63 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -53,7 +53,7 @@ ifndef SYSTEMDPATH
endif
prefix =
-exec_prefix = $(prefix)
+exec_prefix = $(prefix)/usr
usr_prefix = $(prefix)
bindir = $(exec_prefix)/sbin
libudevdir = $(prefix)/$(SYSTEMDPATH)/udev
@@ -34,7 +34,7 @@ endif
# Paths. All these can be overridden on the "make" command line.
prefix :=
# Prefix for binaries
-exec_prefix := $(prefix)
+exec_prefix := $(prefix)/usr
# Prefix for non-essential libraries (libdmmp)
usr_prefix := $(prefix)
# Where to install systemd-related files. systemd is usually installed under /usr
diff --git a/kpartx/kpartx.rules b/kpartx/kpartx.rules
index d7527d7..0e0d70d 100644
index 1969dee..d2b2823 100644
--- a/kpartx/kpartx.rules
+++ b/kpartx/kpartx.rules
@@ -36,6 +36,6 @@ LABEL="mpath_kpartx_end"
@@ -39,6 +39,6 @@ LABEL="mpath_kpartx_end"
GOTO="kpartx_end"
LABEL="run_kpartx"
@ -38,5 +38,5 @@ index d7527d7..0e0d70d 100644
LABEL="kpartx_end"
--
1.8.3.1
2.33.0

View File

@ -1,4 +1,4 @@
From 2051a9f6ea12dc90c9c5b90912b79984d9064d0d Mon Sep 17 00:00:00 2001
From 2ba871e4f8cf132e60b03794413a35441df5abdb Mon Sep 17 00:00:00 2001
From: chenminhua <chenminhua1@huawei.com>
Date: Mon, 2 Apr 2018 04:01:04 -0400
Subject: [PATCH] remove local disk from pathvec
@ -10,19 +10,19 @@ on fc or iscsi devices.
[Changelog]:add upgrade path
[Author]:chenminhua
---
libmultipath/discovery.c | 137 ++++++++++++++++++++++++++++++++++++--
libmultipath/discovery.c | 137 ++++++++++++++++++++++++++++--
libmultipath/discovery.h | 1 +
libmultipath/libmultipath.version | 1 +
multipathd/main.c | 4 ++
multipathd/main.c | 4 +
4 files changed, 137 insertions(+), 6 deletions(-)
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index f25fe9e..c9ebd49 100644
index 6865cd9..83c8ee6 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -37,6 +37,112 @@
#include "print.h"
#include "strbuf.h"
#define VPD_BUFLEN 4096
+const char *conf_file = "/etc/multipath_private.conf";
+static int conf_file_parsed = 0;
@ -81,7 +81,7 @@ index f25fe9e..c9ebd49 100644
+static int
+transport(int type, int h)
+{
+ char buff[PATH_SIZE];
+ char buff[PATH_MAX];
+ int len, off;
+ struct stat a_stat;
+
@ -93,17 +93,17 @@ index f25fe9e..c9ebd49 100644
+ strcpy(buff, "/sys");
+ strcat(buff, "/class/fc_host/");
+ len = strlen(buff);
+ snprintf(buff + len, PATH_SIZE - len, "host%d", h);
+ snprintf(buff + len, PATH_MAX - len, "host%d", h);
+ if ((stat(buff, &a_stat) >= 0) && S_ISDIR(a_stat.st_mode)) {
+ return 0;
+ }
+ memset(buff, 0, PATH_SIZE);
+ memset(buff, 0, PATH_MAX);
+
+ /* iSCSI device */
+ strcpy(buff, "/sys");
+ strcat(buff, "/class/iscsi_host/");
+ off = strlen(buff);
+ snprintf(buff + off, PATH_SIZE - off, "host%d", h);
+ snprintf(buff + off, PATH_MAX - off, "host%d", h);
+ if ((stat(buff, &a_stat) >= 0) && S_ISDIR(a_stat.st_mode)) {
+ return 0;
+ }
@ -175,7 +175,7 @@ index f25fe9e..c9ebd49 100644
}
static void cleanup_udev_enumerate_ptr(void *arg)
@@ -2284,6 +2403,12 @@ int pathinfo(struct path *pp, struct config *conf, int mask)
@@ -2350,6 +2469,12 @@ int pathinfo(struct path *pp, struct config *conf, int mask)
if (rc != PATHINFO_OK)
return rc;
@ -189,10 +189,10 @@ index f25fe9e..c9ebd49 100644
pp->sg_id.proto_id == SCSI_PROTOCOL_USB &&
!conf->allow_usb_devices) {
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index a5446b4..26b6db1 100644
index acd5179..d8284be 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -58,6 +58,7 @@ bool has_uid_fallback(struct path *pp);
@@ -57,6 +57,7 @@ bool has_uid_fallback(struct path *pp);
int get_uid(struct path * pp, int path_state, struct udev_device *udev,
int allow_fallback);
bool is_vpd_page_supported(int fd, int pg);
@ -201,24 +201,24 @@ index a5446b4..26b6db1 100644
/*
* discovery bitmask
diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version
index eb5b5b5..bccf3f3 100644
index aba1a30..ebf1482 100644
--- a/libmultipath/libmultipath.version
+++ b/libmultipath/libmultipath.version
@@ -142,6 +142,7 @@ global:
recv_packet_from_client;
@@ -147,6 +147,7 @@ global:
_print_multipath_topology;
reinstate_paths;
remember_wwid;
+ remove_local_path;
remove_map;
remove_map_by_alias;
remove_maps;
remove_map_callback;
diff --git a/multipathd/main.c b/multipathd/main.c
index 02f368a..47ca1b5 100644
index ebec203..2b6636d 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1035,6 +1035,10 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
int start_waiter = 0;
int ret;
@@ -1202,6 +1202,10 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
int ro;
unsigned char prflag = PRFLAG_UNSET;
+ /* if pp is local path,remove it and return 0. */
+ if (!remove_local_path(vecs->pathvec, pp))
@ -228,5 +228,5 @@ index 02f368a..47ca1b5 100644
* need path UID to go any further
*/
--
2.14.3 (Apple Git-98)
2.33.0

View File

@ -1,8 +1,8 @@
From c6530acb0a5ed3acb8ad930ef9e54a27c17d1521 Mon Sep 17 00:00:00 2001
From aaf527afed109ae647948d466fe76594f48b1e1d Mon Sep 17 00:00:00 2001
From: root <root@localhost.localdomain>
Date: Fri, 22 Mar 2019 19:48:35 +0800
Subject: [PATCH 15/15] clear mpp path reference when path is freed, otherwise
double free may occur in verify_paths.
Subject: [PATCH] clear mpp path reference when path is freed, otherwise double
free may occur in verify_paths.
call stack:
vecs=vecs@entry=0x557b01d62140, rpvec=rpvec@entry=0x0) at structs_vec.c:521
@ -17,10 +17,10 @@ call stack:
3 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/libmultipath/discovery.c b/libmultipath/discovery.c
index 72982ac..2144447 100644
index 83c8ee6..9e10b41 100644
--- a/libmultipath/discovery.c
+++ b/libmultipath/discovery.c
@@ -115,7 +115,7 @@ transport (int h)
@@ -124,7 +124,7 @@ transport(int type, int h)
}
int
@ -29,7 +29,7 @@ index 72982ac..2144447 100644
{
int i = -1;
@@ -130,7 +130,9 @@ remove_local_path (vector pathvec, struct path *pp)
@@ -139,7 +139,9 @@ remove_local_path (vector pathvec, struct path *pp)
if ((i = find_slot(pathvec, (void *)pp)) != -1) {
vector_del_slot(pathvec, i);
}
@ -40,7 +40,7 @@ index 72982ac..2144447 100644
return 0;
}
@@ -238,7 +240,7 @@ path_discover (vector pathvec, struct config * conf,
@@ -247,7 +249,7 @@ path_discover (vector pathvec, struct config * conf,
if (err == 1)
return 1;
if (err == 0)
@ -49,7 +49,7 @@ index 72982ac..2144447 100644
return 0;
}
else {
@@ -251,7 +253,7 @@ path_discover (vector pathvec, struct config * conf,
@@ -260,7 +262,7 @@ path_discover (vector pathvec, struct config * conf,
if (err)
return err;
@ -59,10 +59,10 @@ index 72982ac..2144447 100644
}
}
diff --git a/libmultipath/discovery.h b/libmultipath/discovery.h
index 26b6db1..d51bc0e 100644
index d8284be..fce5faa 100644
--- a/libmultipath/discovery.h
+++ b/libmultipath/discovery.h
@@ -58,7 +58,7 @@ bool has_uid_fallback(struct path *pp);
@@ -57,7 +57,7 @@ bool has_uid_fallback(struct path *pp);
int get_uid(struct path * pp, int path_state, struct udev_device *udev,
int allow_fallback);
bool is_vpd_page_supported(int fd, int pg);
@ -72,10 +72,10 @@ index 26b6db1..d51bc0e 100644
/*
* discovery bitmask
diff --git a/multipathd/main.c b/multipathd/main.c
index 47ca1b5..118dadd 100644
index 2b6636d..aa5d1ae 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -884,6 +884,21 @@ check_path_wwid_change(struct path *pp)
@@ -1015,6 +1015,21 @@ check_path_wwid_change(struct path *pp)
return false;
}
@ -94,10 +94,10 @@ index 47ca1b5..118dadd 100644
+ }
+}
+
static int
uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
{
@@ -975,6 +990,7 @@ uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
/*
* uev_add_path can call uev_update_path, and uev_update_path can call
* uev_add_path
@@ -1116,6 +1131,7 @@ uev_add_path (struct uevent *uev, struct vectors * vecs, int need_do_map)
i = find_slot(vecs->pathvec, (void *)pp);
if (i != -1)
vector_del_slot(vecs->pathvec, i);
@ -105,8 +105,8 @@ index 47ca1b5..118dadd 100644
free_path(pp);
} else {
condlog(0, "%s: failed to reinitialize path",
@@ -1036,8 +1052,11 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
int ret;
@@ -1203,8 +1219,11 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
unsigned char prflag = PRFLAG_UNSET;
/* if pp is local path,remove it and return 0. */
- if (!remove_local_path(vecs->pathvec, pp))
@ -118,7 +118,7 @@ index 47ca1b5..118dadd 100644
/*
* need path UID to go any further
@@ -1052,6 +1071,7 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
@@ -1219,6 +1238,7 @@ ev_add_path (struct path * pp, struct vectors * vecs, int need_do_map)
int i = find_slot(vecs->pathvec, (void *)pp);
if (i != -1)
vector_del_slot(vecs->pathvec, i);
@ -126,7 +126,7 @@ index 47ca1b5..118dadd 100644
free_path(pp);
return 1;
}
@@ -1305,6 +1325,8 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
@@ -1460,6 +1480,8 @@ ev_remove_path (struct path *pp, struct vectors * vecs, int need_do_map)
/* mpp == NULL */
if ((i = find_slot(vecs->pathvec, (void *)pp)) != -1)
vector_del_slot(vecs->pathvec, i);
@ -136,5 +136,5 @@ index 47ca1b5..118dadd 100644
}
out:
--
1.8.3.1
2.33.0

View File

@ -1,37 +0,0 @@
From a7c13c340eb76c1b20580663e7ea2ad99b37022f Mon Sep 17 00:00:00 2001
From: Benjamin Marzinski <bmarzins@redhat.com>
Date: Wed, 30 Mar 2022 15:14:56 -0500
Subject: [PATCH] multipath: return failure on an invalid remove command
When "multipath -f" is run on a device that doesn't exist or isn't a
multipath device, the command will not remove any device, but it will
still return success. Multiple functions rely on _dm_flush_map()
returning success when called with name that doesn't match any
multipath device. So before calling _dm_flush_map(), call dm_is_mpath(),
to check if the device exists and is a multipath device, and return
failure if it's not.
Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipath/main.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/multipath/main.c b/multipath/main.c
index 65ece83..743f3e0 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -1060,6 +1060,11 @@ main (int argc, char *argv[])
if (retries < 0)
retries = conf->remove_retries;
if (cmd == CMD_FLUSH_ONE) {
+ if (dm_is_mpath(dev) != 1) {
+ condlog(0, "%s is not a multipath device", dev);
+ r = RTVL_FAIL;
+ goto out;
+ }
r = dm_suspend_and_flush_map(dev, retries) ?
RTVL_FAIL : RTVL_OK;
goto out;
--
2.33.0

View File

@ -1,4 +1,4 @@
From eff53df4b1cdd74643f54568a327ae7b824337bb Mon Sep 17 00:00:00 2001
From 2bc298d4e3a7c609b441914cfcae7e8bb9d54c92 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Wed, 27 Sep 2023 12:34:08 +0200
Subject: [PATCH] libmultipath: io_err_stat: don't free aio memory before
@ -21,10 +21,10 @@ Cc: Guan Junxiong <guanjunxiong@huawei.com>
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/libmultipath/io_err_stat.c b/libmultipath/io_err_stat.c
index d8d91f6..480034b 100644
index dc1c252..c474c34 100644
--- a/libmultipath/io_err_stat.c
+++ b/libmultipath/io_err_stat.c
@@ -112,10 +112,14 @@ static int init_each_dio_ctx(struct dio_ctx *ct, int blksize,
@@ -111,10 +111,14 @@ static int init_each_dio_ctx(struct dio_ctx *ct, int blksize,
return 0;
}
@ -55,11 +55,11 @@ index d8d91f6..480034b 100644
for (i = 0; i < CONCUR_NR_EVENT; i++)
- deinit_each_dio_ctx(p->dio_ctx_array + i);
- FREE(p->dio_ctx_array);
- free(p->dio_ctx_array);
+ inflight += deinit_each_dio_ctx(p->dio_ctx_array + i);
+
+ if (!inflight)
+ FREE(p->dio_ctx_array);
+ free(p->dio_ctx_array);
+ else
+ io_err_stat_log(2, "%s: can't free aio space of %s, %d IOs in flight",
+ __func__, p->devname, inflight);

View File

@ -1,28 +0,0 @@
From c9c063b6cef7c922fb5b509bd59c597fa1f673d6 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Fri, 22 Oct 2021 12:58:11 +0200
Subject: [PATCH] multipath: fix exit status of multipath -T
We must set the return value in configure().
Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipath/main.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/multipath/main.c b/multipath/main.c
index 743f3e0..e964792 100644
--- a/multipath/main.c
+++ b/multipath/main.c
@@ -560,6 +560,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
dump_config(conf, hwes, curmp);
vector_free(hwes);
+ r = RTVL_OK;
goto out;
}
--
2.33.0

View File

@ -1,131 +0,0 @@
From 0b6ed498ec133a1ddb4afbb8614c25f52835ba3a Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Thu, 1 Sep 2022 19:21:30 +0200
Subject: [PATCH] multipath-tools: use /run instead of /dev/shm
/dev/shm may have unsafe permissions. Use /run instead.
Use systemd's tmpfiles.d mechanism to create /run/multipath
early during boot.
For backward compatibilty, make the runtime directory configurable
via the "runtimedir" make variable.
Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
Makefile.inc | 3 +++
libmultipath/defaults.h | 2 +-
multipath/Makefile | 11 ++++++++---
multipath/{multipath.rules => multipath.rules.in} | 4 ++--
multipath/tmpfiles.conf.in | 1 +
5 files changed, 15 insertions(+), 6 deletions(-)
rename multipath/{multipath.rules => multipath.rules.in} (95%)
create mode 100644 multipath/tmpfiles.conf.in
diff --git a/Makefile.inc b/Makefile.inc
index 9913e7a..1a7f9a8 100644
--- a/Makefile.inc
+++ b/Makefile.inc
@@ -57,6 +57,7 @@ exec_prefix = $(prefix)/usr
usr_prefix = $(prefix)
bindir = $(exec_prefix)/sbin
libudevdir = $(prefix)/$(SYSTEMDPATH)/udev
+tmpfilesdir = $(prefix)/$(SYSTEMDPATH)/tmpfiles.d
udevrulesdir = $(libudevdir)/rules.d
multipathdir = $(TOPDIR)/libmultipath
man8dir = $(prefix)/usr/share/man/man8
@@ -74,6 +75,7 @@ libdmmpdir = $(TOPDIR)/libdmmp
nvmedir = $(TOPDIR)/libmultipath/nvme
includedir = $(prefix)/usr/include
pkgconfdir = $(usrlibdir)/pkgconfig
+runtimedir := /$(RUN)
GZIP = gzip -9 -c
RM = rm -f
@@ -104,6 +106,7 @@ WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implici
CPPFLAGS := -Wp,-D_FORTIFY_SOURCE=2
CFLAGS := --std=gnu99 $(CFLAGS) $(OPTFLAGS) $(WARNFLAGS) -pipe \
-DBIN_DIR=\"$(bindir)\" -DLIB_STRING=\"${LIB}\" -DRUN_DIR=\"${RUN}\" \
+ -DRUNTIME_DIR=\"$(runtimedir)\" \
-MMD -MP
BIN_CFLAGS = -fPIE -DPIE
LIB_CFLAGS = -fPIC
diff --git a/libmultipath/defaults.h b/libmultipath/defaults.h
index e0dd32a..cec82f0 100644
--- a/libmultipath/defaults.h
+++ b/libmultipath/defaults.h
@@ -69,7 +69,7 @@
#define DEFAULT_WWIDS_FILE "/etc/multipath/wwids"
#define DEFAULT_PRKEYS_FILE "/etc/multipath/prkeys"
#define DEFAULT_CONFIG_DIR "/etc/multipath/conf.d"
-#define MULTIPATH_SHM_BASE "/dev/shm/multipath/"
+#define MULTIPATH_SHM_BASE RUNTIME_DIR "/multipath/"
static inline char *set_default(char *str)
diff --git a/multipath/Makefile b/multipath/Makefile
index e720c7f..199a47a 100644
--- a/multipath/Makefile
+++ b/multipath/Makefile
@@ -12,7 +12,7 @@ EXEC = multipath
OBJS = main.o
-all: $(EXEC)
+all: $(EXEC) multipath.rules tmpfiles.conf
$(EXEC): $(OBJS) $(multipathdir)/libmultipath.so $(mpathcmddir)/libmpathcmd.so
$(CC) $(CFLAGS) $(OBJS) -o $(EXEC) $(LDFLAGS) $(LIBDEPS)
@@ -26,7 +26,9 @@ install:
$(INSTALL_PROGRAM) -m 755 mpathconf $(DESTDIR)$(bindir)/
$(INSTALL_PROGRAM) -d $(DESTDIR)$(udevrulesdir)
$(INSTALL_PROGRAM) -m 644 11-dm-mpath.rules $(DESTDIR)$(udevrulesdir)
- $(INSTALL_PROGRAM) -m 644 $(EXEC).rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
+ $(INSTALL_PROGRAM) -m 644 multipath.rules $(DESTDIR)$(libudevdir)/rules.d/62-multipath.rules
+ $(INSTALL_PROGRAM) -d $(DESTDIR)$(tmpfilesdir)
+ $(INSTALL_PROGRAM) -m 644 tmpfiles.conf $(DESTDIR)$(tmpfilesdir)/multipath.conf
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man8dir)
$(INSTALL_PROGRAM) -m 644 $(EXEC).8.gz $(DESTDIR)$(man8dir)
$(INSTALL_PROGRAM) -d $(DESTDIR)$(man5dir)
@@ -43,9 +45,12 @@ uninstall:
$(RM) $(DESTDIR)$(man8dir)/mpathconf.8.gz
clean: dep_clean
- $(RM) core *.o $(EXEC) *.gz
+ $(RM) core *.o $(EXEC) *.gz multipath.rules tmpfiles.conf
include $(wildcard $(OBJS:.o=.d))
dep_clean:
$(RM) $(OBJS:.o=.d)
+
+%: %.in
+ sed 's,@RUNTIME_DIR@,$(runtimedir),' $< >$@
diff --git a/multipath/multipath.rules b/multipath/multipath.rules.in
similarity index 95%
rename from multipath/multipath.rules
rename to multipath/multipath.rules.in
index 9df11a9..be401c8 100644
--- a/multipath/multipath.rules
+++ b/multipath/multipath.rules.in
@@ -1,8 +1,8 @@
# Set DM_MULTIPATH_DEVICE_PATH if the device should be handled by multipath
SUBSYSTEM!="block", GOTO="end_mpath"
KERNEL!="sd*|dasd*|nvme*", GOTO="end_mpath"
-ACTION=="remove", TEST=="/dev/shm/multipath/find_multipaths/$major:$minor", \
- RUN+="/usr/bin/rm -f /dev/shm/multipath/find_multipaths/$major:$minor"
+ACTION=="remove", TEST=="@RUNTIME_DIR@/multipath/find_multipaths/$major:$minor", \
+ RUN+="/usr/bin/rm -f @RUNTIME_DIR@/multipath/find_multipaths/$major:$minor"
ACTION!="add|change", GOTO="end_mpath"
IMPORT{cmdline}="nompath"
diff --git a/multipath/tmpfiles.conf.in b/multipath/tmpfiles.conf.in
new file mode 100644
index 0000000..21be438
--- /dev/null
+++ b/multipath/tmpfiles.conf.in
@@ -0,0 +1 @@
+d @RUNTIME_DIR@/multipath 0700 root root -
--
2.27.0

View File

@ -1,181 +0,0 @@
From db77d1b3cdb14ca0e32132ff7ad360e3d48f62ee Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Tue, 7 Sep 2021 22:41:46 +0200
Subject: [PATCH] multipathd: add and set cli_handlers in a single step
Modify set_handler_callback() such that a missing slot is created
if no matching slot is found. This way, we can skip the initialization
with NULL handlers on startup. Assigning the same handler multiple
times would be a bug which is tested with assert().
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipathd/cli.c | 96 ++++++++----------------------------------------
multipathd/cli.h | 7 ++--
2 files changed, 20 insertions(+), 83 deletions(-)
diff --git a/multipathd/cli.c b/multipathd/cli.c
index 4d6c37c..ddeb5fc 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -4,6 +4,7 @@
#include <sys/time.h>
#include <errno.h>
#include <pthread.h>
+#include <assert.h>
#include "memory.h"
#include "vector.h"
#include "structs.h"
@@ -64,26 +65,27 @@ out:
return 1;
}
-int
-add_handler (uint64_t fp, int (*fn)(void *, char **, int *, void *))
+
+static struct handler *add_handler (uint64_t fp, int (*fn)(void *, char **, int *, void *), bool locked)
{
struct handler * h;
h = alloc_handler();
- if (!h)
- return 1;
+ if (h == NULL)
+ return NULL;
if (!vector_alloc_slot(handlers)) {
FREE(h);
- return 1;
+ return NULL;
}
vector_set_slot(handlers, h);
h->fingerprint = fp;
h->fn = fn;
+ h->locked = locked;
- return 0;
+ return h;
}
static struct handler *
@@ -100,26 +102,17 @@ find_handler (uint64_t fp)
}
int
-set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *))
+__set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *), bool locked)
{
- struct handler * h = find_handler(fp);
-
- if (!h)
- return 1;
- h->fn = fn;
- h->locked = 1;
- return 0;
-}
-
-int
-set_unlocked_handler_callback (uint64_t fp,int (*fn)(void *, char **, int *, void *))
-{
- struct handler * h = find_handler(fp);
+ struct handler *h;
- if (!h)
+ assert(find_handler(fp) == NULL);
+ h = add_handler(fp, fn, locked);
+ if (!h) {
+ condlog(0, "%s: failed to set handler for code %"PRIu64,
+ __func__, fp);
return 1;
- h->fn = fn;
- h->locked = 0;
+ }
return 0;
}
@@ -513,63 +506,6 @@ cli_init (void) {
if (alloc_handlers())
return 1;
- add_handler(LIST+PATHS, NULL);
- add_handler(LIST+PATHS+FMT, NULL);
- add_handler(LIST+PATHS+RAW+FMT, NULL);
- add_handler(LIST+PATH, NULL);
- add_handler(LIST+STATUS, NULL);
- add_handler(LIST+DAEMON, NULL);
- add_handler(LIST+MAPS, NULL);
- add_handler(LIST+MAPS+STATUS, NULL);
- add_handler(LIST+MAPS+STATS, NULL);
- add_handler(LIST+MAPS+FMT, NULL);
- add_handler(LIST+MAPS+RAW+FMT, NULL);
- add_handler(LIST+MAPS+TOPOLOGY, NULL);
- add_handler(LIST+MAPS+JSON, NULL);
- add_handler(LIST+TOPOLOGY, NULL);
- add_handler(LIST+MAP+TOPOLOGY, NULL);
- add_handler(LIST+MAP+JSON, NULL);
- add_handler(LIST+MAP+FMT, NULL);
- add_handler(LIST+MAP+RAW+FMT, NULL);
- add_handler(LIST+CONFIG, NULL);
- add_handler(LIST+CONFIG+LOCAL, NULL);
- add_handler(LIST+BLACKLIST, NULL);
- add_handler(LIST+DEVICES, NULL);
- add_handler(LIST+WILDCARDS, NULL);
- add_handler(RESET+MAPS+STATS, NULL);
- add_handler(RESET+MAP+STATS, NULL);
- add_handler(ADD+PATH, NULL);
- add_handler(DEL+PATH, NULL);
- add_handler(ADD+MAP, NULL);
- add_handler(DEL+MAP, NULL);
- add_handler(DEL+MAPS, NULL);
- add_handler(SWITCH+MAP+GROUP, NULL);
- add_handler(RECONFIGURE, NULL);
- add_handler(SUSPEND+MAP, NULL);
- add_handler(RESUME+MAP, NULL);
- add_handler(RESIZE+MAP, NULL);
- add_handler(RESET+MAP, NULL);
- add_handler(RELOAD+MAP, NULL);
- add_handler(DISABLEQ+MAP, NULL);
- add_handler(RESTOREQ+MAP, NULL);
- add_handler(DISABLEQ+MAPS, NULL);
- add_handler(RESTOREQ+MAPS, NULL);
- add_handler(REINSTATE+PATH, NULL);
- add_handler(FAIL+PATH, NULL);
- add_handler(QUIT, NULL);
- add_handler(SHUTDOWN, NULL);
- add_handler(GETPRSTATUS+MAP, NULL);
- add_handler(SETPRSTATUS+MAP, NULL);
- add_handler(UNSETPRSTATUS+MAP, NULL);
- add_handler(GETPRKEY+MAP, NULL);
- add_handler(SETPRKEY+MAP+KEY, NULL);
- add_handler(UNSETPRKEY+MAP, NULL);
- add_handler(FORCEQ+DAEMON, NULL);
- add_handler(RESTOREQ+DAEMON, NULL);
- add_handler(SETMARGINAL+PATH, NULL);
- add_handler(UNSETMARGINAL+PATH, NULL);
- add_handler(UNSETMARGINAL+MAP, NULL);
-
return 0;
}
diff --git a/multipathd/cli.h b/multipathd/cli.h
index fdfb9ae..a6704b1 100644
--- a/multipathd/cli.h
+++ b/multipathd/cli.h
@@ -131,9 +131,10 @@ struct handler {
};
int alloc_handlers (void);
-int add_handler (uint64_t fp, int (*fn)(void *, char **, int *, void *));
-int set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *));
-int set_unlocked_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *));
+int __set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *), bool locked);
+#define set_handler_callback(fp, fn) __set_handler_callback(fp, fn, true)
+#define set_unlocked_handler_callback(fp, fn) __set_handler_callback(fp, fn, false)
+
int parse_cmd (char * cmd, char ** reply, int * len, void *, int);
int load_keys (void);
char * get_keyparam (vector v, uint64_t code);
--
2.33.0

View File

@ -1,842 +0,0 @@
From f515b8e552412d01f3b01c5c7129452a82d8714d Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Tue, 7 Sep 2021 22:32:46 +0200
Subject: [PATCH] multipathd: make all cli_handlers static
The cli_handler functions are only called from the handler table and
need not be exported.
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipathd/cli_handlers.c | 214 ++++++++++++++++++++++----------------
multipathd/cli_handlers.h | 61 ++---------
multipathd/main.c | 58 +----------
3 files changed, 134 insertions(+), 199 deletions(-)
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index aeb2be5..f75e176 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -39,7 +39,7 @@
*(__len) = *(__rep) ? sizeof(string_literal) : 0; \
} while (0)
-int
+static int
show_paths (char ** r, int * len, struct vectors * vecs, char * style,
int pretty)
{
@@ -70,7 +70,7 @@ show_paths (char ** r, int * len, struct vectors * vecs, char * style,
return 0;
}
-int
+static int
show_path (char ** r, int * len, struct vectors * vecs, struct path *pp,
char * style)
{
@@ -85,7 +85,7 @@ show_path (char ** r, int * len, struct vectors * vecs, struct path *pp,
return 0;
}
-int
+static int
show_map_topology (char ** r, int * len, struct multipath * mpp,
struct vectors * vecs)
{
@@ -102,7 +102,7 @@ show_map_topology (char ** r, int * len, struct multipath * mpp,
return 0;
}
-int
+static int
show_maps_topology (char ** r, int * len, struct vectors * vecs)
{
STRBUF_ON_STACK(reply);
@@ -128,7 +128,7 @@ show_maps_topology (char ** r, int * len, struct vectors * vecs)
return 0;
}
-int
+static int
show_maps_json (char ** r, int * len, struct vectors * vecs)
{
STRBUF_ON_STACK(reply);
@@ -149,7 +149,7 @@ show_maps_json (char ** r, int * len, struct vectors * vecs)
return 0;
}
-int
+static int
show_map_json (char ** r, int * len, struct multipath * mpp,
struct vectors * vecs)
{
@@ -194,7 +194,7 @@ reset_stats(struct multipath * mpp)
mpp->stat_map_failures = 0;
}
-int
+static int
cli_list_config (void * v, char ** reply, int * len, void * data)
{
condlog(3, "list config (operator)");
@@ -207,7 +207,7 @@ static void v_free(void *x)
vector_free(x);
}
-int
+static int
cli_list_config_local (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -223,7 +223,7 @@ cli_list_config_local (void * v, char ** reply, int * len, void * data)
return ret;
}
-int
+static int
cli_list_paths (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -233,7 +233,7 @@ cli_list_paths (void * v, char ** reply, int * len, void * data)
return show_paths(reply, len, vecs, PRINT_PATH_CHECKER, 1);
}
-int
+static int
cli_list_paths_fmt (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -244,7 +244,7 @@ cli_list_paths_fmt (void * v, char ** reply, int * len, void * data)
return show_paths(reply, len, vecs, fmt, 1);
}
-int
+static int
cli_list_paths_raw (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -255,7 +255,7 @@ cli_list_paths_raw (void * v, char ** reply, int * len, void * data)
return show_paths(reply, len, vecs, fmt, 0);
}
-int
+static int
cli_list_path (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -272,7 +272,7 @@ cli_list_path (void * v, char ** reply, int * len, void * data)
return show_path(reply, len, vecs, pp, "%o");
}
-int
+static int
cli_list_map_topology (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -291,7 +291,7 @@ cli_list_map_topology (void * v, char ** reply, int * len, void * data)
return show_map_topology(reply, len, mpp, vecs);
}
-int
+static int
cli_list_maps_topology (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -301,7 +301,7 @@ cli_list_maps_topology (void * v, char ** reply, int * len, void * data)
return show_maps_topology(reply, len, vecs);
}
-int
+static int
cli_list_map_json (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -320,7 +320,7 @@ cli_list_map_json (void * v, char ** reply, int * len, void * data)
return show_map_json(reply, len, mpp, vecs);
}
-int
+static int
cli_list_maps_json (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -330,7 +330,7 @@ cli_list_maps_json (void * v, char ** reply, int * len, void * data)
return show_maps_json(reply, len, vecs);
}
-int
+static int
cli_list_wildcards (void * v, char ** reply, int * len, void * data)
{
STRBUF_ON_STACK(buf);
@@ -343,7 +343,7 @@ cli_list_wildcards (void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
show_status (char ** r, int *len, struct vectors * vecs)
{
STRBUF_ON_STACK(reply);
@@ -356,7 +356,7 @@ show_status (char ** r, int *len, struct vectors * vecs)
return 0;
}
-int
+static int
show_daemon (char ** r, int *len)
{
STRBUF_ON_STACK(reply);
@@ -370,7 +370,7 @@ show_daemon (char ** r, int *len)
return 0;
}
-int
+static int
show_map (char ** r, int *len, struct multipath * mpp, char * style,
int pretty)
{
@@ -384,7 +384,7 @@ show_map (char ** r, int *len, struct multipath * mpp, char * style,
return 0;
}
-int
+static int
show_maps (char ** r, int *len, struct vectors * vecs, char * style,
int pretty)
{
@@ -419,7 +419,7 @@ show_maps (char ** r, int *len, struct vectors * vecs, char * style,
return 0;
}
-int
+static int
cli_list_maps_fmt (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -430,7 +430,7 @@ cli_list_maps_fmt (void * v, char ** reply, int * len, void * data)
return show_maps(reply, len, vecs, fmt, 1);
}
-int
+static int
cli_list_maps_raw (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -441,7 +441,7 @@ cli_list_maps_raw (void * v, char ** reply, int * len, void * data)
return show_maps(reply, len, vecs, fmt, 0);
}
-int
+static int
cli_list_map_fmt (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -461,27 +461,7 @@ cli_list_map_fmt (void * v, char ** reply, int * len, void * data)
return show_map(reply, len, mpp, fmt, 1);
}
-int
-cli_list_map_raw (void * v, char ** reply, int * len, void * data)
-{
- struct multipath * mpp;
- struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
- char * fmt = get_keyparam(v, FMT);
-
- param = convert_dev(param, 0);
- get_path_layout(vecs->pathvec, 0);
- get_multipath_layout(vecs->mpvec, 1);
- mpp = find_mp_by_str(vecs->mpvec, param);
- if (!mpp)
- return 1;
-
- condlog(3, "list map %s fmt %s (operator)", param, fmt);
-
- return show_map(reply, len, mpp, fmt, 0);
-}
-
-int
+static int
cli_list_maps (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -491,7 +471,7 @@ cli_list_maps (void * v, char ** reply, int * len, void * data)
return show_maps(reply, len, vecs, PRINT_MAP_NAMES, 1);
}
-int
+static int
cli_list_status (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -501,7 +481,7 @@ cli_list_status (void * v, char ** reply, int * len, void * data)
return show_status(reply, len, vecs);
}
-int
+static int
cli_list_maps_status (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -511,7 +491,7 @@ cli_list_maps_status (void * v, char ** reply, int * len, void * data)
return show_maps(reply, len, vecs, PRINT_MAP_STATUS, 1);
}
-int
+static int
cli_list_maps_stats (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -521,7 +501,7 @@ cli_list_maps_stats (void * v, char ** reply, int * len, void * data)
return show_maps(reply, len, vecs, PRINT_MAP_STATS, 1);
}
-int
+static int
cli_list_daemon (void * v, char ** reply, int * len, void * data)
{
condlog(3, "list daemon (operator)");
@@ -529,7 +509,7 @@ cli_list_daemon (void * v, char ** reply, int * len, void * data)
return show_daemon(reply, len);
}
-int
+static int
cli_reset_maps_stats (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -544,7 +524,7 @@ cli_reset_maps_stats (void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_reset_map_stats (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -562,7 +542,7 @@ cli_reset_map_stats (void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_add_path (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -678,7 +658,7 @@ blacklisted:
return 0;
}
-int
+static int
cli_del_path (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -701,7 +681,7 @@ cli_del_path (void * v, char ** reply, int * len, void * data)
return (ret == REMOVE_PATH_FAILURE);
}
-int
+static int
cli_add_map (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -761,7 +741,7 @@ cli_add_map (void * v, char ** reply, int * len, void * data)
return rc;
}
-int
+static int
cli_del_map (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -787,7 +767,7 @@ cli_del_map (void * v, char ** reply, int * len, void * data)
return rc;
}
-int
+static int
cli_del_maps (void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -806,7 +786,7 @@ cli_del_maps (void *v, char **reply, int *len, void *data)
return ret;
}
-int
+static int
cli_reload(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -834,7 +814,7 @@ cli_reload(void *v, char **reply, int *len, void *data)
return reload_and_sync_map(mpp, vecs, 0);
}
-int resize_map(struct multipath *mpp, unsigned long long size,
+static int resize_map(struct multipath *mpp, unsigned long long size,
struct vectors * vecs)
{
char *params __attribute__((cleanup(cleanup_charp))) = NULL;
@@ -859,7 +839,7 @@ int resize_map(struct multipath *mpp, unsigned long long size,
return 0;
}
-int
+static int
cli_resize(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -941,7 +921,7 @@ cli_resize(void *v, char **reply, int *len, void *data)
return 0;
}
-int
+static int
cli_force_no_daemon_q(void * v, char ** reply, int * len, void * data)
{
struct config *conf;
@@ -954,7 +934,7 @@ cli_force_no_daemon_q(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_restore_no_daemon_q(void * v, char ** reply, int * len, void * data)
{
struct config *conf;
@@ -967,7 +947,7 @@ cli_restore_no_daemon_q(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_restore_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1008,7 +988,7 @@ cli_restore_queueing(void *v, char **reply, int *len, void *data)
return 0;
}
-int
+static int
cli_restore_all_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1030,7 +1010,7 @@ cli_restore_all_queueing(void *v, char **reply, int *len, void *data)
return 0;
}
-int
+static int
cli_disable_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1059,7 +1039,7 @@ cli_disable_queueing(void *v, char **reply, int *len, void *data)
return 0;
}
-int
+static int
cli_disable_all_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1078,7 +1058,7 @@ cli_disable_all_queueing(void *v, char **reply, int *len, void *data)
return 0;
}
-int
+static int
cli_switch_group(void * v, char ** reply, int * len, void * data)
{
char * mapname = get_keyparam(v, MAP);
@@ -1090,7 +1070,7 @@ cli_switch_group(void * v, char ** reply, int * len, void * data)
return dm_switchgroup(mapname, groupnum);
}
-int
+static int
cli_reconfigure(void * v, char ** reply, int * len, void * data)
{
int rc;
@@ -1107,7 +1087,7 @@ cli_reconfigure(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_suspend(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1137,7 +1117,7 @@ cli_suspend(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_resume(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1169,7 +1149,7 @@ cli_resume(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_reinstate(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1192,7 +1172,7 @@ cli_reinstate(void * v, char ** reply, int * len, void * data)
return dm_reinstate_path(pp->mpp->alias, pp->dev_t);
}
-int
+static int
cli_reassign (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1216,7 +1196,7 @@ cli_reassign (void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_fail(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1245,7 +1225,7 @@ cli_fail(void * v, char ** reply, int * len, void * data)
return r;
}
-int
+static int
show_blacklist (char ** r, int * len)
{
STRBUF_ON_STACK(reply);
@@ -1265,7 +1245,7 @@ show_blacklist (char ** r, int * len)
return 0;
}
-int
+static int
cli_list_blacklist (void * v, char ** reply, int * len, void * data)
{
condlog(3, "list blacklist (operator)");
@@ -1273,7 +1253,7 @@ cli_list_blacklist (void * v, char ** reply, int * len, void * data)
return show_blacklist(reply, len);
}
-int
+static int
show_devices (char ** r, int * len, struct vectors *vecs)
{
STRBUF_ON_STACK(reply);
@@ -1294,7 +1274,7 @@ show_devices (char ** r, int * len, struct vectors *vecs)
return 0;
}
-int
+static int
cli_list_devices (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
@@ -1304,13 +1284,13 @@ cli_list_devices (void * v, char ** reply, int * len, void * data)
return show_devices(reply, len, vecs);
}
-int
+static int
cli_quit (void * v, char ** reply, int * len, void * data)
{
return 0;
}
-int
+static int
cli_shutdown (void * v, char ** reply, int * len, void * data)
{
condlog(3, "shutdown (operator)");
@@ -1318,7 +1298,7 @@ cli_shutdown (void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_getprstatus (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -1343,7 +1323,7 @@ cli_getprstatus (void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_setprstatus(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -1366,7 +1346,7 @@ cli_setprstatus(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_unsetprstatus(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -1388,7 +1368,7 @@ cli_unsetprstatus(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_getprkey(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -1420,7 +1400,7 @@ cli_getprkey(void * v, char ** reply, int * len, void * data)
return 0;
}
-int
+static int
cli_unsetprkey(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -1444,7 +1424,7 @@ cli_unsetprkey(void * v, char ** reply, int * len, void * data)
return ret;
}
-int
+static int
cli_setprkey(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
@@ -1476,7 +1456,7 @@ cli_setprkey(void * v, char ** reply, int * len, void * data)
return ret;
}
-int cli_set_marginal(void * v, char ** reply, int * len, void * data)
+static int cli_set_marginal(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, PATH);
@@ -1503,7 +1483,7 @@ int cli_set_marginal(void * v, char ** reply, int * len, void * data)
return reload_and_sync_map(pp->mpp, vecs, 0);
}
-int cli_unset_marginal(void * v, char ** reply, int * len, void * data)
+static int cli_unset_marginal(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
char * param = get_keyparam(v, PATH);
@@ -1530,7 +1510,7 @@ int cli_unset_marginal(void * v, char ** reply, int * len, void * data)
return reload_and_sync_map(pp->mpp, vecs, 0);
}
-int cli_unset_all_marginal(void * v, char ** reply, int * len, void * data)
+static int cli_unset_all_marginal(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
char * mapname = get_keyparam(v, MAP);
@@ -1566,3 +1546,63 @@ int cli_unset_all_marginal(void * v, char ** reply, int * len, void * data)
return reload_and_sync_map(mpp, vecs, 0);
}
+
+void init_handler_callbacks(void)
+{
+ set_handler_callback(LIST+PATHS, cli_list_paths);
+ set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
+ set_handler_callback(LIST+PATHS+RAW+FMT, cli_list_paths_raw);
+ set_handler_callback(LIST+PATH, cli_list_path);
+ set_handler_callback(LIST+MAPS, cli_list_maps);
+ set_handler_callback(LIST+STATUS, cli_list_status);
+ set_unlocked_handler_callback(LIST+DAEMON, cli_list_daemon);
+ set_handler_callback(LIST+MAPS+STATUS, cli_list_maps_status);
+ set_handler_callback(LIST+MAPS+STATS, cli_list_maps_stats);
+ set_handler_callback(LIST+MAPS+FMT, cli_list_maps_fmt);
+ set_handler_callback(LIST+MAPS+RAW+FMT, cli_list_maps_raw);
+ set_handler_callback(LIST+MAPS+TOPOLOGY, cli_list_maps_topology);
+ set_handler_callback(LIST+TOPOLOGY, cli_list_maps_topology);
+ set_handler_callback(LIST+MAPS+JSON, cli_list_maps_json);
+ set_handler_callback(LIST+MAP+TOPOLOGY, cli_list_map_topology);
+ set_handler_callback(LIST+MAP+FMT, cli_list_map_fmt);
+ set_handler_callback(LIST+MAP+RAW+FMT, cli_list_map_fmt);
+ set_handler_callback(LIST+MAP+JSON, cli_list_map_json);
+ set_handler_callback(LIST+CONFIG+LOCAL, cli_list_config_local);
+ set_handler_callback(LIST+CONFIG, cli_list_config);
+ set_handler_callback(LIST+BLACKLIST, cli_list_blacklist);
+ set_handler_callback(LIST+DEVICES, cli_list_devices);
+ set_handler_callback(LIST+WILDCARDS, cli_list_wildcards);
+ set_handler_callback(RESET+MAPS+STATS, cli_reset_maps_stats);
+ set_handler_callback(RESET+MAP+STATS, cli_reset_map_stats);
+ set_handler_callback(ADD+PATH, cli_add_path);
+ set_handler_callback(DEL+PATH, cli_del_path);
+ set_handler_callback(ADD+MAP, cli_add_map);
+ set_handler_callback(DEL+MAP, cli_del_map);
+ set_handler_callback(DEL+MAPS, cli_del_maps);
+ set_handler_callback(SWITCH+MAP+GROUP, cli_switch_group);
+ set_unlocked_handler_callback(RECONFIGURE, cli_reconfigure);
+ set_handler_callback(SUSPEND+MAP, cli_suspend);
+ set_handler_callback(RESUME+MAP, cli_resume);
+ set_handler_callback(RESIZE+MAP, cli_resize);
+ set_handler_callback(RELOAD+MAP, cli_reload);
+ set_handler_callback(RESET+MAP, cli_reassign);
+ set_handler_callback(REINSTATE+PATH, cli_reinstate);
+ set_handler_callback(FAIL+PATH, cli_fail);
+ set_handler_callback(DISABLEQ+MAP, cli_disable_queueing);
+ set_handler_callback(RESTOREQ+MAP, cli_restore_queueing);
+ set_handler_callback(DISABLEQ+MAPS, cli_disable_all_queueing);
+ set_handler_callback(RESTOREQ+MAPS, cli_restore_all_queueing);
+ set_unlocked_handler_callback(QUIT, cli_quit);
+ set_unlocked_handler_callback(SHUTDOWN, cli_shutdown);
+ set_handler_callback(GETPRSTATUS+MAP, cli_getprstatus);
+ set_handler_callback(SETPRSTATUS+MAP, cli_setprstatus);
+ set_handler_callback(UNSETPRSTATUS+MAP, cli_unsetprstatus);
+ set_handler_callback(FORCEQ+DAEMON, cli_force_no_daemon_q);
+ set_handler_callback(RESTOREQ+DAEMON, cli_restore_no_daemon_q);
+ set_handler_callback(GETPRKEY+MAP, cli_getprkey);
+ set_handler_callback(SETPRKEY+MAP+KEY, cli_setprkey);
+ set_handler_callback(UNSETPRKEY+MAP, cli_unsetprkey);
+ set_handler_callback(SETMARGINAL+PATH, cli_set_marginal);
+ set_handler_callback(UNSETMARGINAL+PATH, cli_unset_marginal);
+ set_handler_callback(UNSETMARGINAL+MAP, cli_unset_all_marginal);
+}
diff --git a/multipathd/cli_handlers.h b/multipathd/cli_handlers.h
index 6f57b42..7eaf847 100644
--- a/multipathd/cli_handlers.h
+++ b/multipathd/cli_handlers.h
@@ -1,55 +1,6 @@
-int cli_list_paths (void * v, char ** reply, int * len, void * data);
-int cli_list_paths_fmt (void * v, char ** reply, int * len, void * data);
-int cli_list_paths_raw (void * v, char ** reply, int * len, void * data);
-int cli_list_path (void * v, char ** reply, int * len, void * data);
-int cli_list_status (void * v, char ** reply, int * len, void * data);
-int cli_list_daemon (void * v, char ** reply, int * len, void * data);
-int cli_list_maps (void * v, char ** reply, int * len, void * data);
-int cli_list_maps_fmt (void * v, char ** reply, int * len, void * data);
-int cli_list_maps_raw (void * v, char ** reply, int * len, void * data);
-int cli_list_map_fmt (void * v, char ** reply, int * len, void * data);
-int cli_list_map_raw (void * v, char ** reply, int * len, void * data);
-int cli_list_maps_status (void * v, char ** reply, int * len, void * data);
-int cli_list_maps_stats (void * v, char ** reply, int * len, void * data);
-int cli_list_map_topology (void * v, char ** reply, int * len, void * data);
-int cli_list_maps_topology (void * v, char ** reply, int * len, void * data);
-int cli_list_map_json (void * v, char ** reply, int * len, void * data);
-int cli_list_maps_json (void * v, char ** reply, int * len, void * data);
-int cli_list_config (void * v, char ** reply, int * len, void * data);
-int cli_list_config_local (void * v, char ** reply, int * len, void * data);
-int cli_list_blacklist (void * v, char ** reply, int * len, void * data);
-int cli_list_devices (void * v, char ** reply, int * len, void * data);
-int cli_list_wildcards (void * v, char ** reply, int * len, void * data);
-int cli_reset_maps_stats (void * v, char ** reply, int * len, void * data);
-int cli_reset_map_stats (void * v, char ** reply, int * len, void * data);
-int cli_add_path (void * v, char ** reply, int * len, void * data);
-int cli_del_path (void * v, char ** reply, int * len, void * data);
-int cli_add_map (void * v, char ** reply, int * len, void * data);
-int cli_del_map (void * v, char ** reply, int * len, void * data);
-int cli_del_maps (void * v, char ** reply, int * len, void * data);
-int cli_switch_group(void * v, char ** reply, int * len, void * data);
-int cli_reconfigure(void * v, char ** reply, int * len, void * data);
-int cli_resize(void * v, char ** reply, int * len, void * data);
-int cli_reload(void * v, char ** reply, int * len, void * data);
-int cli_disable_queueing(void * v, char ** reply, int * len, void * data);
-int cli_disable_all_queueing(void * v, char ** reply, int * len, void * data);
-int cli_restore_queueing(void * v, char ** reply, int * len, void * data);
-int cli_restore_all_queueing(void * v, char ** reply, int * len, void * data);
-int cli_suspend(void * v, char ** reply, int * len, void * data);
-int cli_resume(void * v, char ** reply, int * len, void * data);
-int cli_reinstate(void * v, char ** reply, int * len, void * data);
-int cli_fail(void * v, char ** reply, int * len, void * data);
-int cli_force_no_daemon_q(void * v, char ** reply, int * len, void * data);
-int cli_restore_no_daemon_q(void * v, char ** reply, int * len, void * data);
-int cli_quit(void * v, char ** reply, int * len, void * data);
-int cli_shutdown(void * v, char ** reply, int * len, void * data);
-int cli_reassign (void * v, char ** reply, int * len, void * data);
-int cli_getprstatus(void * v, char ** reply, int * len, void * data);
-int cli_setprstatus(void * v, char ** reply, int * len, void * data);
-int cli_unsetprstatus(void * v, char ** reply, int * len, void * data);
-int cli_getprkey(void * v, char ** reply, int * len, void * data);
-int cli_setprkey(void * v, char ** reply, int * len, void * data);
-int cli_unsetprkey(void * v, char ** reply, int * len, void * data);
-int cli_set_marginal(void * v, char ** reply, int * len, void * data);
-int cli_unset_marginal(void * v, char ** reply, int * len, void * data);
-int cli_unset_all_marginal(void * v, char ** reply, int * len, void * data);
+#ifndef _CLI_HANDLERS_H
+#define _CLI_HANDLERS_H
+
+void init_handler_callbacks(void);
+
+#endif
diff --git a/multipathd/main.c b/multipathd/main.c
index 118dadd..08fb992 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1669,63 +1669,7 @@ uxlsnrloop (void * ap)
/* Tell main thread that thread has started */
post_config_state(DAEMON_CONFIGURE);
- set_handler_callback(LIST+PATHS, cli_list_paths);
- set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
- set_handler_callback(LIST+PATHS+RAW+FMT, cli_list_paths_raw);
- set_handler_callback(LIST+PATH, cli_list_path);
- set_handler_callback(LIST+MAPS, cli_list_maps);
- set_handler_callback(LIST+STATUS, cli_list_status);
- set_unlocked_handler_callback(LIST+DAEMON, cli_list_daemon);
- set_handler_callback(LIST+MAPS+STATUS, cli_list_maps_status);
- set_handler_callback(LIST+MAPS+STATS, cli_list_maps_stats);
- set_handler_callback(LIST+MAPS+FMT, cli_list_maps_fmt);
- set_handler_callback(LIST+MAPS+RAW+FMT, cli_list_maps_raw);
- set_handler_callback(LIST+MAPS+TOPOLOGY, cli_list_maps_topology);
- set_handler_callback(LIST+TOPOLOGY, cli_list_maps_topology);
- set_handler_callback(LIST+MAPS+JSON, cli_list_maps_json);
- set_handler_callback(LIST+MAP+TOPOLOGY, cli_list_map_topology);
- set_handler_callback(LIST+MAP+FMT, cli_list_map_fmt);
- set_handler_callback(LIST+MAP+RAW+FMT, cli_list_map_fmt);
- set_handler_callback(LIST+MAP+JSON, cli_list_map_json);
- set_handler_callback(LIST+CONFIG+LOCAL, cli_list_config_local);
- set_handler_callback(LIST+CONFIG, cli_list_config);
- set_handler_callback(LIST+BLACKLIST, cli_list_blacklist);
- set_handler_callback(LIST+DEVICES, cli_list_devices);
- set_handler_callback(LIST+WILDCARDS, cli_list_wildcards);
- set_handler_callback(RESET+MAPS+STATS, cli_reset_maps_stats);
- set_handler_callback(RESET+MAP+STATS, cli_reset_map_stats);
- set_handler_callback(ADD+PATH, cli_add_path);
- set_handler_callback(DEL+PATH, cli_del_path);
- set_handler_callback(ADD+MAP, cli_add_map);
- set_handler_callback(DEL+MAP, cli_del_map);
- set_handler_callback(DEL+MAPS, cli_del_maps);
- set_handler_callback(SWITCH+MAP+GROUP, cli_switch_group);
- set_unlocked_handler_callback(RECONFIGURE, cli_reconfigure);
- set_handler_callback(SUSPEND+MAP, cli_suspend);
- set_handler_callback(RESUME+MAP, cli_resume);
- set_handler_callback(RESIZE+MAP, cli_resize);
- set_handler_callback(RELOAD+MAP, cli_reload);
- set_handler_callback(RESET+MAP, cli_reassign);
- set_handler_callback(REINSTATE+PATH, cli_reinstate);
- set_handler_callback(FAIL+PATH, cli_fail);
- set_handler_callback(DISABLEQ+MAP, cli_disable_queueing);
- set_handler_callback(RESTOREQ+MAP, cli_restore_queueing);
- set_handler_callback(DISABLEQ+MAPS, cli_disable_all_queueing);
- set_handler_callback(RESTOREQ+MAPS, cli_restore_all_queueing);
- set_unlocked_handler_callback(QUIT, cli_quit);
- set_unlocked_handler_callback(SHUTDOWN, cli_shutdown);
- set_handler_callback(GETPRSTATUS+MAP, cli_getprstatus);
- set_handler_callback(SETPRSTATUS+MAP, cli_setprstatus);
- set_handler_callback(UNSETPRSTATUS+MAP, cli_unsetprstatus);
- set_handler_callback(FORCEQ+DAEMON, cli_force_no_daemon_q);
- set_handler_callback(RESTOREQ+DAEMON, cli_restore_no_daemon_q);
- set_handler_callback(GETPRKEY+MAP, cli_getprkey);
- set_handler_callback(SETPRKEY+MAP+KEY, cli_setprkey);
- set_handler_callback(UNSETPRKEY+MAP, cli_unsetprkey);
- set_handler_callback(SETMARGINAL+PATH, cli_set_marginal);
- set_handler_callback(UNSETMARGINAL+PATH, cli_unset_marginal);
- set_handler_callback(UNSETMARGINAL+MAP, cli_unset_all_marginal);
-
+ init_handler_callbacks();
umask(077);
uxsock_listen(&uxsock_trigger, ux_sock, ap);
--
2.33.0

View File

@ -1,192 +0,0 @@
From 88b55127e70ab18974a00b7285e2b9ee36846dc8 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Wed, 24 Aug 2022 22:39:44 +0200
Subject: [PATCH] multipathd: Fix command completion in interactive mode
The command completion never worked, because the handlers
array wasn't initialized in client mode.
The handlers array is now also required in multipathc,
but it doesn't need the actual handler functions. To keep
multipathc as small as possible, we just add a handler table
with NULL handler functions.
Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipathd/callbacks.c | 59 +++++++++++++++++++++++++++++++++++++
multipathd/cli.c | 2 ++
multipathd/cli_handlers.c | 61 ++-------------------------------------
multipathd/main.c | 1 -
4 files changed, 63 insertions(+), 60 deletions(-)
create mode 100644 multipathd/callbacks.c
diff --git a/multipathd/callbacks.c b/multipathd/callbacks.c
new file mode 100644
index 0000000..11edc5c
--- /dev/null
+++ b/multipathd/callbacks.c
@@ -0,0 +1,59 @@
+void init_handler_callbacks(void)
+{
+ set_handler_callback(LIST+PATHS, HANDLER(cli_list_paths));
+ set_handler_callback(LIST+PATHS+FMT, HANDLER(cli_list_paths_fmt));
+ set_handler_callback(LIST+PATHS+RAW+FMT, HANDLER(cli_list_paths_raw));
+ set_handler_callback(LIST+PATH, HANDLER(cli_list_path));
+ set_handler_callback(LIST+MAPS, HANDLER(cli_list_maps));
+ set_handler_callback(LIST+STATUS, HANDLER(cli_list_status));
+ set_unlocked_handler_callback(LIST+DAEMON, HANDLER(cli_list_daemon));
+ set_handler_callback(LIST+MAPS+STATUS, HANDLER(cli_list_maps_status));
+ set_handler_callback(LIST+MAPS+STATS, HANDLER(cli_list_maps_stats));
+ set_handler_callback(LIST+MAPS+FMT, HANDLER(cli_list_maps_fmt));
+ set_handler_callback(LIST+MAPS+RAW+FMT, HANDLER(cli_list_maps_raw));
+ set_handler_callback(LIST+MAPS+TOPOLOGY, HANDLER(cli_list_maps_topology));
+ set_handler_callback(LIST+TOPOLOGY, HANDLER(cli_list_maps_topology));
+ set_handler_callback(LIST+MAPS+JSON, HANDLER(cli_list_maps_json));
+ set_handler_callback(LIST+MAP+TOPOLOGY, HANDLER(cli_list_map_topology));
+ set_handler_callback(LIST+MAP+FMT, HANDLER(cli_list_map_fmt));
+ set_handler_callback(LIST+MAP+RAW+FMT, HANDLER(cli_list_map_fmt));
+ set_handler_callback(LIST+MAP+JSON, HANDLER(cli_list_map_json));
+ set_handler_callback(LIST+CONFIG+LOCAL, HANDLER(cli_list_config_local));
+ set_handler_callback(LIST+CONFIG, HANDLER(cli_list_config));
+ set_handler_callback(LIST+BLACKLIST, HANDLER(cli_list_blacklist));
+ set_handler_callback(LIST+DEVICES, HANDLER(cli_list_devices));
+ set_handler_callback(LIST+WILDCARDS, HANDLER(cli_list_wildcards));
+ set_handler_callback(RESET+MAPS+STATS, HANDLER(cli_reset_maps_stats));
+ set_handler_callback(RESET+MAP+STATS, HANDLER(cli_reset_map_stats));
+ set_handler_callback(ADD+PATH, HANDLER(cli_add_path));
+ set_handler_callback(DEL+PATH, HANDLER(cli_del_path));
+ set_handler_callback(ADD+MAP, HANDLER(cli_add_map));
+ set_handler_callback(DEL+MAP, HANDLER(cli_del_map));
+ set_handler_callback(DEL+MAPS, HANDLER(cli_del_maps));
+ set_handler_callback(SWITCH+MAP+GROUP, HANDLER(cli_switch_group));
+ set_unlocked_handler_callback(RECONFIGURE, HANDLER(cli_reconfigure));
+ set_handler_callback(SUSPEND+MAP, HANDLER(cli_suspend));
+ set_handler_callback(RESUME+MAP, HANDLER(cli_resume));
+ set_handler_callback(RESIZE+MAP, HANDLER(cli_resize));
+ set_handler_callback(RELOAD+MAP, HANDLER(cli_reload));
+ set_handler_callback(RESET+MAP, HANDLER(cli_reassign));
+ set_handler_callback(REINSTATE+PATH, HANDLER(cli_reinstate));
+ set_handler_callback(FAIL+PATH, HANDLER(cli_fail));
+ set_handler_callback(DISABLEQ+MAP, HANDLER(cli_disable_queueing));
+ set_handler_callback(RESTOREQ+MAP, HANDLER(cli_restore_queueing));
+ set_handler_callback(DISABLEQ+MAPS, HANDLER(cli_disable_all_queueing));
+ set_handler_callback(RESTOREQ+MAPS, HANDLER(cli_restore_all_queueing));
+ set_unlocked_handler_callback(QUIT, HANDLER(cli_quit));
+ set_unlocked_handler_callback(SHUTDOWN, HANDLER(cli_shutdown));
+ set_handler_callback(GETPRSTATUS+MAP, HANDLER(cli_getprstatus));
+ set_handler_callback(SETPRSTATUS+MAP, HANDLER(cli_setprstatus));
+ set_handler_callback(UNSETPRSTATUS+MAP, HANDLER(cli_unsetprstatus));
+ set_handler_callback(FORCEQ+DAEMON, HANDLER(cli_force_no_daemon_q));
+ set_handler_callback(RESTOREQ+DAEMON, HANDLER(cli_restore_no_daemon_q));
+ set_handler_callback(GETPRKEY+MAP, HANDLER(cli_getprkey));
+ set_handler_callback(SETPRKEY+MAP+KEY, HANDLER(cli_setprkey));
+ set_handler_callback(UNSETPRKEY+MAP, HANDLER(cli_unsetprkey));
+ set_handler_callback(SETMARGINAL+PATH, HANDLER(cli_set_marginal));
+ set_handler_callback(UNSETMARGINAL+PATH, HANDLER(cli_unset_marginal));
+ set_handler_callback(UNSETMARGINAL+MAP, HANDLER(cli_unset_all_marginal));
+}
diff --git a/multipathd/cli.c b/multipathd/cli.c
index 1facf89..8033db0 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -16,6 +16,7 @@
#include "mpath_cmd.h"
#include "cli.h"
+#include "cli_handlers.h"
#include "debug.h"
#include "strbuf.h"
@@ -506,6 +507,7 @@ cli_init (void) {
if (alloc_handlers())
return 1;
+ init_handler_callbacks();
return 0;
}
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index f75e176..7d4f267 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -1547,62 +1547,5 @@ static int cli_unset_all_marginal(void * v, char ** reply, int * len, void * dat
return reload_and_sync_map(mpp, vecs, 0);
}
-void init_handler_callbacks(void)
-{
- set_handler_callback(LIST+PATHS, cli_list_paths);
- set_handler_callback(LIST+PATHS+FMT, cli_list_paths_fmt);
- set_handler_callback(LIST+PATHS+RAW+FMT, cli_list_paths_raw);
- set_handler_callback(LIST+PATH, cli_list_path);
- set_handler_callback(LIST+MAPS, cli_list_maps);
- set_handler_callback(LIST+STATUS, cli_list_status);
- set_unlocked_handler_callback(LIST+DAEMON, cli_list_daemon);
- set_handler_callback(LIST+MAPS+STATUS, cli_list_maps_status);
- set_handler_callback(LIST+MAPS+STATS, cli_list_maps_stats);
- set_handler_callback(LIST+MAPS+FMT, cli_list_maps_fmt);
- set_handler_callback(LIST+MAPS+RAW+FMT, cli_list_maps_raw);
- set_handler_callback(LIST+MAPS+TOPOLOGY, cli_list_maps_topology);
- set_handler_callback(LIST+TOPOLOGY, cli_list_maps_topology);
- set_handler_callback(LIST+MAPS+JSON, cli_list_maps_json);
- set_handler_callback(LIST+MAP+TOPOLOGY, cli_list_map_topology);
- set_handler_callback(LIST+MAP+FMT, cli_list_map_fmt);
- set_handler_callback(LIST+MAP+RAW+FMT, cli_list_map_fmt);
- set_handler_callback(LIST+MAP+JSON, cli_list_map_json);
- set_handler_callback(LIST+CONFIG+LOCAL, cli_list_config_local);
- set_handler_callback(LIST+CONFIG, cli_list_config);
- set_handler_callback(LIST+BLACKLIST, cli_list_blacklist);
- set_handler_callback(LIST+DEVICES, cli_list_devices);
- set_handler_callback(LIST+WILDCARDS, cli_list_wildcards);
- set_handler_callback(RESET+MAPS+STATS, cli_reset_maps_stats);
- set_handler_callback(RESET+MAP+STATS, cli_reset_map_stats);
- set_handler_callback(ADD+PATH, cli_add_path);
- set_handler_callback(DEL+PATH, cli_del_path);
- set_handler_callback(ADD+MAP, cli_add_map);
- set_handler_callback(DEL+MAP, cli_del_map);
- set_handler_callback(DEL+MAPS, cli_del_maps);
- set_handler_callback(SWITCH+MAP+GROUP, cli_switch_group);
- set_unlocked_handler_callback(RECONFIGURE, cli_reconfigure);
- set_handler_callback(SUSPEND+MAP, cli_suspend);
- set_handler_callback(RESUME+MAP, cli_resume);
- set_handler_callback(RESIZE+MAP, cli_resize);
- set_handler_callback(RELOAD+MAP, cli_reload);
- set_handler_callback(RESET+MAP, cli_reassign);
- set_handler_callback(REINSTATE+PATH, cli_reinstate);
- set_handler_callback(FAIL+PATH, cli_fail);
- set_handler_callback(DISABLEQ+MAP, cli_disable_queueing);
- set_handler_callback(RESTOREQ+MAP, cli_restore_queueing);
- set_handler_callback(DISABLEQ+MAPS, cli_disable_all_queueing);
- set_handler_callback(RESTOREQ+MAPS, cli_restore_all_queueing);
- set_unlocked_handler_callback(QUIT, cli_quit);
- set_unlocked_handler_callback(SHUTDOWN, cli_shutdown);
- set_handler_callback(GETPRSTATUS+MAP, cli_getprstatus);
- set_handler_callback(SETPRSTATUS+MAP, cli_setprstatus);
- set_handler_callback(UNSETPRSTATUS+MAP, cli_unsetprstatus);
- set_handler_callback(FORCEQ+DAEMON, cli_force_no_daemon_q);
- set_handler_callback(RESTOREQ+DAEMON, cli_restore_no_daemon_q);
- set_handler_callback(GETPRKEY+MAP, cli_getprkey);
- set_handler_callback(SETPRKEY+MAP+KEY, cli_setprkey);
- set_handler_callback(UNSETPRKEY+MAP, cli_unsetprkey);
- set_handler_callback(SETMARGINAL+PATH, cli_set_marginal);
- set_handler_callback(UNSETMARGINAL+PATH, cli_unset_marginal);
- set_handler_callback(UNSETMARGINAL+MAP, cli_unset_all_marginal);
-}
+#define HANDLER(x) x
+#include "callbacks.c"
diff --git a/multipathd/main.c b/multipathd/main.c
index 08fb992..be7ae60 100644
--- a/multipathd/main.c
+++ b/multipathd/main.c
@@ -1669,7 +1669,6 @@ uxlsnrloop (void * ap)
/* Tell main thread that thread has started */
post_config_state(DAEMON_CONFIGURE);
- init_handler_callbacks();
umask(077);
uxsock_listen(&uxsock_trigger, ux_sock, ap);
--
2.33.0

View File

@ -1,939 +0,0 @@
From 1e59870eead6af91c6499a4d4ca8ca554a73d6b1 Mon Sep 17 00:00:00 2001
From: Martin Wilck <mwilck@suse.com>
Date: Wed, 24 Aug 2022 19:05:08 +0200
Subject: [PATCH] multipathd: more robust command parsing
The current parser allows commands like "path sda show" or "list list
add path sda", because it doesn't enforce ordering of the keywords
and simply adds rather than or-s the values of the keys.
Rework this by using a separate byte for the "verb" and the allowed
qualifiers in the different positions of the command. No command
needs more than 3 qualifiers, so we disallow command vectors with
more than 4 elements, and change the type of the fingerprint to
uint32_t.
init_callbacks() is now required in both multipathc and multipathd
to initialize the table of handlers and fingerprints. But as m
ultipathc never calls any handler, we need not link the
entire handlers code into it.
Signed-off-by: Martin Wilck <mwilck@suse.com>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
---
multipathd/callbacks.c | 123 +++++++++++++------------
multipathd/cli.c | 168 ++++++++++++++++++----------------
multipathd/cli.h | 184 +++++++++++++++++++-------------------
multipathd/cli_handlers.c | 70 +++++++--------
4 files changed, 287 insertions(+), 258 deletions(-)
diff --git a/multipathd/callbacks.c b/multipathd/callbacks.c
index 11edc5c..e9cbb7f 100644
--- a/multipathd/callbacks.c
+++ b/multipathd/callbacks.c
@@ -1,59 +1,70 @@
void init_handler_callbacks(void)
{
- set_handler_callback(LIST+PATHS, HANDLER(cli_list_paths));
- set_handler_callback(LIST+PATHS+FMT, HANDLER(cli_list_paths_fmt));
- set_handler_callback(LIST+PATHS+RAW+FMT, HANDLER(cli_list_paths_raw));
- set_handler_callback(LIST+PATH, HANDLER(cli_list_path));
- set_handler_callback(LIST+MAPS, HANDLER(cli_list_maps));
- set_handler_callback(LIST+STATUS, HANDLER(cli_list_status));
- set_unlocked_handler_callback(LIST+DAEMON, HANDLER(cli_list_daemon));
- set_handler_callback(LIST+MAPS+STATUS, HANDLER(cli_list_maps_status));
- set_handler_callback(LIST+MAPS+STATS, HANDLER(cli_list_maps_stats));
- set_handler_callback(LIST+MAPS+FMT, HANDLER(cli_list_maps_fmt));
- set_handler_callback(LIST+MAPS+RAW+FMT, HANDLER(cli_list_maps_raw));
- set_handler_callback(LIST+MAPS+TOPOLOGY, HANDLER(cli_list_maps_topology));
- set_handler_callback(LIST+TOPOLOGY, HANDLER(cli_list_maps_topology));
- set_handler_callback(LIST+MAPS+JSON, HANDLER(cli_list_maps_json));
- set_handler_callback(LIST+MAP+TOPOLOGY, HANDLER(cli_list_map_topology));
- set_handler_callback(LIST+MAP+FMT, HANDLER(cli_list_map_fmt));
- set_handler_callback(LIST+MAP+RAW+FMT, HANDLER(cli_list_map_fmt));
- set_handler_callback(LIST+MAP+JSON, HANDLER(cli_list_map_json));
- set_handler_callback(LIST+CONFIG+LOCAL, HANDLER(cli_list_config_local));
- set_handler_callback(LIST+CONFIG, HANDLER(cli_list_config));
- set_handler_callback(LIST+BLACKLIST, HANDLER(cli_list_blacklist));
- set_handler_callback(LIST+DEVICES, HANDLER(cli_list_devices));
- set_handler_callback(LIST+WILDCARDS, HANDLER(cli_list_wildcards));
- set_handler_callback(RESET+MAPS+STATS, HANDLER(cli_reset_maps_stats));
- set_handler_callback(RESET+MAP+STATS, HANDLER(cli_reset_map_stats));
- set_handler_callback(ADD+PATH, HANDLER(cli_add_path));
- set_handler_callback(DEL+PATH, HANDLER(cli_del_path));
- set_handler_callback(ADD+MAP, HANDLER(cli_add_map));
- set_handler_callback(DEL+MAP, HANDLER(cli_del_map));
- set_handler_callback(DEL+MAPS, HANDLER(cli_del_maps));
- set_handler_callback(SWITCH+MAP+GROUP, HANDLER(cli_switch_group));
- set_unlocked_handler_callback(RECONFIGURE, HANDLER(cli_reconfigure));
- set_handler_callback(SUSPEND+MAP, HANDLER(cli_suspend));
- set_handler_callback(RESUME+MAP, HANDLER(cli_resume));
- set_handler_callback(RESIZE+MAP, HANDLER(cli_resize));
- set_handler_callback(RELOAD+MAP, HANDLER(cli_reload));
- set_handler_callback(RESET+MAP, HANDLER(cli_reassign));
- set_handler_callback(REINSTATE+PATH, HANDLER(cli_reinstate));
- set_handler_callback(FAIL+PATH, HANDLER(cli_fail));
- set_handler_callback(DISABLEQ+MAP, HANDLER(cli_disable_queueing));
- set_handler_callback(RESTOREQ+MAP, HANDLER(cli_restore_queueing));
- set_handler_callback(DISABLEQ+MAPS, HANDLER(cli_disable_all_queueing));
- set_handler_callback(RESTOREQ+MAPS, HANDLER(cli_restore_all_queueing));
- set_unlocked_handler_callback(QUIT, HANDLER(cli_quit));
- set_unlocked_handler_callback(SHUTDOWN, HANDLER(cli_shutdown));
- set_handler_callback(GETPRSTATUS+MAP, HANDLER(cli_getprstatus));
- set_handler_callback(SETPRSTATUS+MAP, HANDLER(cli_setprstatus));
- set_handler_callback(UNSETPRSTATUS+MAP, HANDLER(cli_unsetprstatus));
- set_handler_callback(FORCEQ+DAEMON, HANDLER(cli_force_no_daemon_q));
- set_handler_callback(RESTOREQ+DAEMON, HANDLER(cli_restore_no_daemon_q));
- set_handler_callback(GETPRKEY+MAP, HANDLER(cli_getprkey));
- set_handler_callback(SETPRKEY+MAP+KEY, HANDLER(cli_setprkey));
- set_handler_callback(UNSETPRKEY+MAP, HANDLER(cli_unsetprkey));
- set_handler_callback(SETMARGINAL+PATH, HANDLER(cli_set_marginal));
- set_handler_callback(UNSETMARGINAL+PATH, HANDLER(cli_unset_marginal));
- set_handler_callback(UNSETMARGINAL+MAP, HANDLER(cli_unset_all_marginal));
+ set_handler_callback(VRB_LIST | Q1_PATHS, HANDLER(cli_list_paths));
+ set_handler_callback(VRB_LIST | Q1_PATHS | Q2_FMT, HANDLER(cli_list_paths_fmt));
+ set_handler_callback(VRB_LIST | Q1_PATHS | Q2_RAW | Q3_FMT,
+ HANDLER(cli_list_paths_raw));
+ set_handler_callback(VRB_LIST | Q1_PATH, HANDLER(cli_list_path));
+ set_handler_callback(VRB_LIST | Q1_MAPS, HANDLER(cli_list_maps));
+ set_handler_callback(VRB_LIST | Q1_STATUS, HANDLER(cli_list_status));
+ set_unlocked_handler_callback(VRB_LIST | Q1_DAEMON, HANDLER(cli_list_daemon));
+ set_handler_callback(VRB_LIST | Q1_MAPS | Q2_STATUS,
+ HANDLER(cli_list_maps_status));
+ set_handler_callback(VRB_LIST | Q1_MAPS | Q2_STATS,
+ HANDLER(cli_list_maps_stats));
+ set_handler_callback(VRB_LIST | Q1_MAPS | Q2_FMT, HANDLER(cli_list_maps_fmt));
+ set_handler_callback(VRB_LIST | Q1_MAPS | Q2_RAW | Q3_FMT,
+ HANDLER(cli_list_maps_raw));
+ set_handler_callback(VRB_LIST | Q1_MAPS | Q2_TOPOLOGY,
+ HANDLER(cli_list_maps_topology));
+ set_handler_callback(VRB_LIST | Q1_TOPOLOGY, HANDLER(cli_list_maps_topology));
+ set_handler_callback(VRB_LIST | Q1_MAPS | Q2_JSON, HANDLER(cli_list_maps_json));
+ set_handler_callback(VRB_LIST | Q1_MAP | Q2_TOPOLOGY,
+ HANDLER(cli_list_map_topology));
+ set_handler_callback(VRB_LIST | Q1_MAP | Q2_FMT, HANDLER(cli_list_map_fmt));
+ set_handler_callback(VRB_LIST | Q1_MAP | Q2_RAW | Q3_FMT,
+ HANDLER(cli_list_map_fmt));
+ set_handler_callback(VRB_LIST | Q1_MAP | Q2_JSON, HANDLER(cli_list_map_json));
+ set_handler_callback(VRB_LIST | Q1_CONFIG | Q2_LOCAL,
+ HANDLER(cli_list_config_local));
+ set_handler_callback(VRB_LIST | Q1_CONFIG, HANDLER(cli_list_config));
+ set_handler_callback(VRB_LIST | Q1_BLACKLIST, HANDLER(cli_list_blacklist));
+ set_handler_callback(VRB_LIST | Q1_DEVICES, HANDLER(cli_list_devices));
+ set_handler_callback(VRB_LIST | Q1_WILDCARDS, HANDLER(cli_list_wildcards));
+ set_handler_callback(VRB_RESET | Q1_MAPS | Q2_STATS,
+ HANDLER(cli_reset_maps_stats));
+ set_handler_callback(VRB_RESET | Q1_MAP | Q2_STATS,
+ HANDLER(cli_reset_map_stats));
+ set_handler_callback(VRB_ADD | Q1_PATH, HANDLER(cli_add_path));
+ set_handler_callback(VRB_DEL | Q1_PATH, HANDLER(cli_del_path));
+ set_handler_callback(VRB_ADD | Q1_MAP, HANDLER(cli_add_map));
+ set_handler_callback(VRB_DEL | Q1_MAP, HANDLER(cli_del_map));
+ set_handler_callback(VRB_DEL | Q1_MAPS, HANDLER(cli_del_maps));
+ set_handler_callback(VRB_SWITCH | Q1_MAP | Q2_GROUP, HANDLER(cli_switch_group));
+ set_unlocked_handler_callback(VRB_RECONFIGURE, HANDLER(cli_reconfigure));
+ set_handler_callback(VRB_SUSPEND | Q1_MAP, HANDLER(cli_suspend));
+ set_handler_callback(VRB_RESUME | Q1_MAP, HANDLER(cli_resume));
+ set_handler_callback(VRB_RESIZE | Q1_MAP, HANDLER(cli_resize));
+ set_handler_callback(VRB_RELOAD | Q1_MAP, HANDLER(cli_reload));
+ set_handler_callback(VRB_RESET | Q1_MAP, HANDLER(cli_reassign));
+ set_handler_callback(VRB_REINSTATE | Q1_PATH, HANDLER(cli_reinstate));
+ set_handler_callback(VRB_FAIL | Q1_PATH, HANDLER(cli_fail));
+ set_handler_callback(VRB_DISABLEQ | Q1_MAP, HANDLER(cli_disable_queueing));
+ set_handler_callback(VRB_RESTOREQ | Q1_MAP, HANDLER(cli_restore_queueing));
+ set_handler_callback(VRB_DISABLEQ | Q1_MAPS, HANDLER(cli_disable_all_queueing));
+ set_handler_callback(VRB_RESTOREQ | Q1_MAPS, HANDLER(cli_restore_all_queueing));
+ set_unlocked_handler_callback(VRB_QUIT, HANDLER(cli_quit));
+ set_unlocked_handler_callback(VRB_SHUTDOWN, HANDLER(cli_shutdown));
+ set_handler_callback(VRB_GETPRSTATUS | Q1_MAP, HANDLER(cli_getprstatus));
+ set_handler_callback(VRB_SETPRSTATUS | Q1_MAP, HANDLER(cli_setprstatus));
+ set_handler_callback(VRB_UNSETPRSTATUS | Q1_MAP, HANDLER(cli_unsetprstatus));
+ set_handler_callback(VRB_FORCEQ | Q1_DAEMON, HANDLER(cli_force_no_daemon_q));
+ set_handler_callback(VRB_RESTOREQ | Q1_DAEMON, HANDLER(cli_restore_no_daemon_q));
+ set_handler_callback(VRB_GETPRKEY | Q1_MAP, HANDLER(cli_getprkey));
+ set_handler_callback(VRB_SETPRKEY | Q1_MAP | Q2_KEY, HANDLER(cli_setprkey));
+ set_handler_callback(VRB_UNSETPRKEY | Q1_MAP, HANDLER(cli_unsetprkey));
+ set_handler_callback(VRB_SETMARGINAL | Q1_PATH, HANDLER(cli_set_marginal));
+ set_handler_callback(VRB_UNSETMARGINAL | Q1_PATH, HANDLER(cli_unset_marginal));
+ set_handler_callback(VRB_UNSETMARGINAL | Q1_MAP,
+ HANDLER(cli_unset_all_marginal));
}
diff --git a/multipathd/cli.c b/multipathd/cli.c
index 8033db0..5d1a482 100644
--- a/multipathd/cli.c
+++ b/multipathd/cli.c
@@ -23,6 +23,9 @@
static vector keys;
static vector handlers;
+/* See KEY_INVALID in cli.h */
+#define INVALID_FINGERPRINT ((uint32_t)(0))
+
static struct key *
alloc_key (void)
{
@@ -36,7 +39,7 @@ alloc_handler (void)
}
static int
-add_key (vector vec, char * str, uint64_t code, int has_param)
+add_key (vector vec, char * str, uint8_t code, int has_param)
{
struct key * kw;
@@ -67,7 +70,7 @@ out:
}
-static struct handler *add_handler (uint64_t fp, int (*fn)(void *, char **, int *, void *), bool locked)
+static struct handler *add_handler (uint32_t fp, int (*fn)(void *, char **, int *, void *), bool locked)
{
struct handler * h;
@@ -90,11 +93,13 @@ static struct handler *add_handler (uint64_t fp, int (*fn)(void *, char **, int
}
static struct handler *
-find_handler (uint64_t fp)
+find_handler (uint32_t fp)
{
int i;
struct handler *h;
+ if (fp == INVALID_FINGERPRINT)
+ return NULL;
vector_foreach_slot (handlers, h, i)
if (h->fingerprint == fp)
return h;
@@ -103,14 +108,15 @@ find_handler (uint64_t fp)
}
int
-__set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *), bool locked)
+__set_handler_callback (uint32_t fp, int (*fn)(void *, char **, int *, void *), bool locked)
{
struct handler *h;
+ assert(fp != INVALID_FINGERPRINT);
assert(find_handler(fp) == NULL);
h = add_handler(fp, fn, locked);
if (!h) {
- condlog(0, "%s: failed to set handler for code %"PRIu64,
+ condlog(0, "%s: failed to set handler for code %"PRIu32,
__func__, fp);
return 1;
}
@@ -163,57 +169,57 @@ load_keys (void)
if (!keys)
return 1;
- r += add_key(keys, "list", LIST, 0);
- r += add_key(keys, "show", LIST, 0);
- r += add_key(keys, "add", ADD, 0);
- r += add_key(keys, "remove", DEL, 0);
- r += add_key(keys, "del", DEL, 0);
- r += add_key(keys, "switch", SWITCH, 0);
- r += add_key(keys, "switchgroup", SWITCH, 0);
- r += add_key(keys, "suspend", SUSPEND, 0);
- r += add_key(keys, "resume", RESUME, 0);
- r += add_key(keys, "reinstate", REINSTATE, 0);
- r += add_key(keys, "fail", FAIL, 0);
- r += add_key(keys, "resize", RESIZE, 0);
- r += add_key(keys, "reset", RESET, 0);
- r += add_key(keys, "reload", RELOAD, 0);
- r += add_key(keys, "forcequeueing", FORCEQ, 0);
- r += add_key(keys, "disablequeueing", DISABLEQ, 0);
- r += add_key(keys, "restorequeueing", RESTOREQ, 0);
- r += add_key(keys, "paths", PATHS, 0);
- r += add_key(keys, "maps", MAPS, 0);
- r += add_key(keys, "multipaths", MAPS, 0);
- r += add_key(keys, "path", PATH, 1);
- r += add_key(keys, "map", MAP, 1);
- r += add_key(keys, "multipath", MAP, 1);
- r += add_key(keys, "group", GROUP, 1);
- r += add_key(keys, "reconfigure", RECONFIGURE, 0);
- r += add_key(keys, "daemon", DAEMON, 0);
- r += add_key(keys, "status", STATUS, 0);
- r += add_key(keys, "stats", STATS, 0);
- r += add_key(keys, "topology", TOPOLOGY, 0);
- r += add_key(keys, "config", CONFIG, 0);
- r += add_key(keys, "blacklist", BLACKLIST, 0);
- r += add_key(keys, "devices", DEVICES, 0);
- r += add_key(keys, "raw", RAW, 0);
- r += add_key(keys, "wildcards", WILDCARDS, 0);
- r += add_key(keys, "quit", QUIT, 0);
- r += add_key(keys, "exit", QUIT, 0);
- r += add_key(keys, "shutdown", SHUTDOWN, 0);
- r += add_key(keys, "getprstatus", GETPRSTATUS, 0);
- r += add_key(keys, "setprstatus", SETPRSTATUS, 0);
- r += add_key(keys, "unsetprstatus", UNSETPRSTATUS, 0);
- r += add_key(keys, "format", FMT, 1);
- r += add_key(keys, "json", JSON, 0);
- r += add_key(keys, "getprkey", GETPRKEY, 0);
- r += add_key(keys, "setprkey", SETPRKEY, 0);
- r += add_key(keys, "unsetprkey", UNSETPRKEY, 0);
- r += add_key(keys, "key", KEY, 1);
- r += add_key(keys, "local", LOCAL, 0);
- r += add_key(keys, "setmarginal", SETMARGINAL, 0);
- r += add_key(keys, "unsetmarginal", UNSETMARGINAL, 0);
-
-
+ r += add_key(keys, "list", VRB_LIST, 0);
+ r += add_key(keys, "show", VRB_LIST, 0);
+ r += add_key(keys, "add", VRB_ADD, 0);
+ r += add_key(keys, "remove", VRB_DEL, 0);
+ r += add_key(keys, "del", VRB_DEL, 0);
+ r += add_key(keys, "switch", VRB_SWITCH, 0);
+ r += add_key(keys, "switchgroup", VRB_SWITCH, 0);
+ r += add_key(keys, "suspend", VRB_SUSPEND, 0);
+ r += add_key(keys, "resume", VRB_RESUME, 0);
+ r += add_key(keys, "reinstate", VRB_REINSTATE, 0);
+ r += add_key(keys, "fail", VRB_FAIL, 0);
+ r += add_key(keys, "resize", VRB_RESIZE, 0);
+ r += add_key(keys, "reset", VRB_RESET, 0);
+ r += add_key(keys, "reload", VRB_RELOAD, 0);
+ r += add_key(keys, "forcequeueing", VRB_FORCEQ, 0);
+ r += add_key(keys, "disablequeueing", VRB_DISABLEQ, 0);
+ r += add_key(keys, "restorequeueing", VRB_RESTOREQ, 0);
+ r += add_key(keys, "paths", KEY_PATHS, 0);
+ r += add_key(keys, "maps", KEY_MAPS, 0);
+ r += add_key(keys, "multipaths", KEY_MAPS, 0);
+ r += add_key(keys, "path", KEY_PATH, 1);
+ r += add_key(keys, "map", KEY_MAP, 1);
+ r += add_key(keys, "multipath", KEY_MAP, 1);
+ r += add_key(keys, "group", KEY_GROUP, 1);
+ r += add_key(keys, "reconfigure", VRB_RECONFIGURE, 0);
+ r += add_key(keys, "daemon", KEY_DAEMON, 0);
+ r += add_key(keys, "status", KEY_STATUS, 0);
+ r += add_key(keys, "stats", KEY_STATS, 0);
+ r += add_key(keys, "topology", KEY_TOPOLOGY, 0);
+ r += add_key(keys, "config", KEY_CONFIG, 0);
+ r += add_key(keys, "blacklist", KEY_BLACKLIST, 0);
+ r += add_key(keys, "devices", KEY_DEVICES, 0);
+ r += add_key(keys, "raw", KEY_RAW, 0);
+ r += add_key(keys, "wildcards", KEY_WILDCARDS, 0);
+ r += add_key(keys, "quit", VRB_QUIT, 0);
+ r += add_key(keys, "exit", VRB_QUIT, 0);
+ r += add_key(keys, "shutdown", VRB_SHUTDOWN, 0);
+ r += add_key(keys, "getprstatus", VRB_GETPRSTATUS, 0);
+ r += add_key(keys, "setprstatus", VRB_SETPRSTATUS, 0);
+ r += add_key(keys, "unsetprstatus", VRB_UNSETPRSTATUS, 0);
+ r += add_key(keys, "format", KEY_FMT, 1);
+ r += add_key(keys, "json", KEY_JSON, 0);
+ r += add_key(keys, "getprkey", VRB_GETPRKEY, 0);
+ r += add_key(keys, "setprkey", VRB_SETPRKEY, 0);
+ r += add_key(keys, "unsetprkey", VRB_UNSETPRKEY, 0);
+ r += add_key(keys, "key", KEY_KEY, 1);
+ r += add_key(keys, "local", KEY_LOCAL, 0);
+ r += add_key(keys, "setmarginal", VRB_SETMARGINAL, 0);
+ r += add_key(keys, "unsetmarginal", VRB_UNSETMARGINAL, 0);
+ r += add_key(keys, "all", KEY_ALL, 0);
+
if (r) {
free_keys(keys);
keys = NULL;
@@ -321,19 +327,22 @@ out:
return r;
}
-static uint64_t
+static uint32_t
fingerprint(vector vec)
{
int i;
- uint64_t fp = 0;
+ uint32_t fp = 0;
struct key * kw;
- if (!vec)
- return 0;
-
- vector_foreach_slot(vec, kw, i)
- fp += kw->code;
+ if (!vec || VECTOR_SIZE(vec) > 4)
+ return INVALID_FINGERPRINT;
+ vector_foreach_slot(vec, kw, i) {
+ if (i >= 4)
+ break;
+ fp |= (uint32_t)kw->code << (8 * i);
+ }
+
return fp;
}
@@ -367,8 +376,8 @@ genhelp_sprint_aliases (struct strbuf *reply, vector keys,
static int
do_genhelp(struct strbuf *reply, const char *cmd, int error) {
- int i, j;
- uint64_t fp;
+ int i, j, k;
+ uint32_t fp;
struct handler * h;
struct key * kw;
int rc = 0;
@@ -394,17 +403,24 @@ do_genhelp(struct strbuf *reply, const char *cmd, int error) {
vector_foreach_slot (handlers, h, i) {
fp = h->fingerprint;
- vector_foreach_slot (keys, kw, j) {
- if ((kw->code & fp)) {
- fp -= kw->code;
- if (print_strbuf(reply, " %s", kw->str) < 0 ||
- genhelp_sprint_aliases(reply, keys, kw) < 0)
- return -1;
-
- if (kw->has_param) {
- if (print_strbuf(reply, " $%s",
- kw->str) < 0)
+ for (k = 0; k < 4; k++, fp >>= 8) {
+ uint32_t code = fp & 0xff;
+
+ if (!code)
+ break;
+
+ vector_foreach_slot (keys, kw, j) {
+ if ((uint32_t)kw->code == code) {
+ if (print_strbuf(reply, " %s", kw->str) < 0 ||
+ genhelp_sprint_aliases(reply, keys, kw) < 0)
return -1;
+
+ if (kw->has_param) {
+ if (print_strbuf(reply, " $%s",
+ kw->str) < 0)
+ return -1;
+ }
+ break;
}
}
}
@@ -487,7 +503,7 @@ parse_cmd (char * cmd, char ** reply, int * len, void * data, int timeout )
}
char *
-get_keyparam (vector v, uint64_t code)
+get_keyparam (vector v, uint8_t code)
{
struct key * kw;
int i;
diff --git a/multipathd/cli.h b/multipathd/cli.h
index 6459203..a13e190 100644
--- a/multipathd/cli.h
+++ b/multipathd/cli.h
@@ -3,96 +3,98 @@
#include <stdint.h>
+/*
+ * CLI commands consist of 4 bytes, a verb (byte 0) and up to
+ * 3 qualifiers (byte 1 - 3).
+ */
+
enum {
- __LIST,
- __ADD,
- __DEL,
- __SWITCH,
- __SUSPEND,
- __RESUME,
- __REINSTATE,
- __FAIL,
- __RESIZE,
- __RESET,
- __RELOAD,
- __FORCEQ,
- __DISABLEQ,
- __RESTOREQ,
- __PATHS,
- __MAPS,
- __PATH,
- __MAP,
- __GROUP,
- __RECONFIGURE,
- __DAEMON,
- __STATUS,
- __STATS,
- __TOPOLOGY,
- __CONFIG,
- __BLACKLIST,
- __DEVICES,
- __RAW,
- __WILDCARDS,
- __QUIT,
- __SHUTDOWN,
- __GETPRSTATUS,
- __SETPRSTATUS,
- __UNSETPRSTATUS,
- __FMT,
- __JSON,
- __GETPRKEY,
- __SETPRKEY,
- __UNSETPRKEY,
- __KEY,
- __LOCAL,
- __SETMARGINAL,
- __UNSETMARGINAL,
+ /* See INVALID_FINGERPRINT in cli.c */
+ KEY_INVALID = 0,
+
+ /* Verbs */
+ VRB_LIST = 1,
+ VRB_ADD = 2,
+ VRB_DEL = 3,
+ VRB_RESET = 4,
+ VRB_SWITCH = 5,
+ VRB_RECONFIGURE = 6,
+ VRB_SUSPEND = 7,
+ VRB_RESUME = 8,
+ VRB_RESIZE = 9,
+ VRB_RELOAD = 10,
+ VRB_FAIL = 11,
+ VRB_REINSTATE = 12,
+ VRB_DISABLEQ = 13,
+ VRB_RESTOREQ = 14,
+ VRB_FORCEQ = 15,
+ VRB_GETPRSTATUS = 16,
+ VRB_SETPRSTATUS = 17,
+ VRB_UNSETPRSTATUS = 18,
+ VRB_GETPRKEY = 19,
+ VRB_SETPRKEY = 20,
+ VRB_UNSETPRKEY = 21,
+ VRB_SETMARGINAL = 22,
+ VRB_UNSETMARGINAL = 23,
+ VRB_SHUTDOWN = 24,
+ VRB_QUIT = 25,
+
+ /* Qualifiers, values must be different from verbs */
+ KEY_PATH = 65,
+ KEY_PATHS = 66,
+ KEY_MAP = 67,
+ KEY_MAPS = 68,
+ KEY_TOPOLOGY = 69,
+ KEY_CONFIG = 70,
+ KEY_BLACKLIST = 71,
+ KEY_DEVICES = 72,
+ KEY_WILDCARDS = 73,
+ KEY_ALL = 74,
+ KEY_DAEMON = 75,
+ KEY_FMT = 76,
+ KEY_RAW = 77,
+ KEY_STATUS = 78,
+ KEY_STATS = 79,
+ KEY_JSON = 80,
+ KEY_LOCAL = 81,
+ KEY_GROUP = 82,
+ KEY_KEY = 83,
};
-#define LIST (1 << __LIST)
-#define ADD (1 << __ADD)
-#define DEL (1 << __DEL)
-#define SWITCH (1 << __SWITCH)
-#define SUSPEND (1 << __SUSPEND)
-#define RESUME (1 << __RESUME)
-#define REINSTATE (1 << __REINSTATE)
-#define FAIL (1 << __FAIL)
-#define RESIZE (1 << __RESIZE)
-#define RESET (1 << __RESET)
-#define RELOAD (1 << __RELOAD)
-#define FORCEQ (1 << __FORCEQ)
-#define DISABLEQ (1 << __DISABLEQ)
-#define RESTOREQ (1 << __RESTOREQ)
-#define PATHS (1 << __PATHS)
-#define MAPS (1 << __MAPS)
-#define PATH (1 << __PATH)
-#define MAP (1 << __MAP)
-#define GROUP (1 << __GROUP)
-#define RECONFIGURE (1 << __RECONFIGURE)
-#define DAEMON (1 << __DAEMON)
-#define STATUS (1 << __STATUS)
-#define STATS (1 << __STATS)
-#define TOPOLOGY (1 << __TOPOLOGY)
-#define CONFIG (1 << __CONFIG)
-#define BLACKLIST (1 << __BLACKLIST)
-#define DEVICES (1 << __DEVICES)
-#define RAW (1 << __RAW)
-#define COUNT (1 << __COUNT)
-#define WILDCARDS (1 << __WILDCARDS)
-#define QUIT (1 << __QUIT)
-#define SHUTDOWN (1 << __SHUTDOWN)
-#define GETPRSTATUS (1ULL << __GETPRSTATUS)
-#define SETPRSTATUS (1ULL << __SETPRSTATUS)
-#define UNSETPRSTATUS (1ULL << __UNSETPRSTATUS)
-#define FMT (1ULL << __FMT)
-#define JSON (1ULL << __JSON)
-#define GETPRKEY (1ULL << __GETPRKEY)
-#define SETPRKEY (1ULL << __SETPRKEY)
-#define UNSETPRKEY (1ULL << __UNSETPRKEY)
-#define KEY (1ULL << __KEY)
-#define LOCAL (1ULL << __LOCAL)
-#define SETMARGINAL (1ULL << __SETMARGINAL)
-#define UNSETMARGINAL (1ULL << __UNSETMARGINAL)
+/*
+ * The shifted qualifiers determine valid positions of the
+ * keywords in the known commands. E.g. the only qualifier
+ * that's valid in position 3 is "fmt", e.g. "list maps raw fmt".
+ */
+enum {
+ /* byte 1: qualifier 1 */
+ Q1_PATH = KEY_PATH << 8,
+ Q1_PATHS = KEY_PATHS << 8,
+ Q1_MAP = KEY_MAP << 8,
+ Q1_MAPS = KEY_MAPS << 8,
+ Q1_TOPOLOGY = KEY_TOPOLOGY << 8,
+ Q1_CONFIG = KEY_CONFIG << 8,
+ Q1_BLACKLIST = KEY_BLACKLIST << 8,
+ Q1_DEVICES = KEY_DEVICES << 8,
+ Q1_WILDCARDS = KEY_WILDCARDS << 8,
+ Q1_ALL = KEY_ALL << 8,
+ Q1_DAEMON = KEY_DAEMON << 8,
+ Q1_STATUS = KEY_STATUS << 8,
+
+ /* byte 2: qualifier 2 */
+ Q2_FMT = KEY_FMT << 16,
+ Q2_RAW = KEY_RAW << 16,
+ Q2_STATUS = KEY_STATUS << 16,
+ Q2_STATS = KEY_STATS << 16,
+ Q2_TOPOLOGY = KEY_TOPOLOGY << 16,
+ Q2_JSON = KEY_JSON << 16,
+ Q2_LOCAL = KEY_LOCAL << 16,
+ Q2_GROUP = KEY_GROUP << 16,
+ Q2_KEY = KEY_KEY << 16,
+
+ /* byte 3: qualifier 3 */
+ Q3_FMT = KEY_FMT << 24,
+};
#define INITIAL_REPLY_LEN 1200
@@ -120,24 +122,24 @@ enum {
struct key {
char * str;
char * param;
- uint64_t code;
+ uint8_t code;
int has_param;
};
struct handler {
- uint64_t fingerprint;
+ uint32_t fingerprint;
int locked;
int (*fn)(void *, char **, int *, void *);
};
int alloc_handlers (void);
-int __set_handler_callback (uint64_t fp, int (*fn)(void *, char **, int *, void *), bool locked);
+int __set_handler_callback (uint32_t fp, int (*fn)(void *, char **, int *, void *), bool locked);
#define set_handler_callback(fp, fn) __set_handler_callback(fp, fn, true)
#define set_unlocked_handler_callback(fp, fn) __set_handler_callback(fp, fn, false)
int parse_cmd (char * cmd, char ** reply, int * len, void *, int);
int load_keys (void);
-char * get_keyparam (vector v, uint64_t code);
+char * get_keyparam (vector v, uint8_t code);
void free_keys (vector vec);
void free_handlers (void);
int cli_init (void);
diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
index 7d4f267..6d79287 100644
--- a/multipathd/cli_handlers.c
+++ b/multipathd/cli_handlers.c
@@ -237,7 +237,7 @@ static int
cli_list_paths_fmt (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * fmt = get_keyparam(v, FMT);
+ char * fmt = get_keyparam(v, KEY_FMT);
condlog(3, "list paths (operator)");
@@ -248,7 +248,7 @@ static int
cli_list_paths_raw (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * fmt = get_keyparam(v, FMT);
+ char * fmt = get_keyparam(v, KEY_FMT);
condlog(3, "list paths (operator)");
@@ -259,7 +259,7 @@ static int
cli_list_path (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path *pp;
param = convert_dev(param, 1);
@@ -277,7 +277,7 @@ cli_list_map_topology (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
@@ -306,7 +306,7 @@ cli_list_map_json (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
@@ -423,7 +423,7 @@ static int
cli_list_maps_fmt (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * fmt = get_keyparam(v, FMT);
+ char * fmt = get_keyparam(v, KEY_FMT);
condlog(3, "list maps (operator)");
@@ -434,7 +434,7 @@ static int
cli_list_maps_raw (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * fmt = get_keyparam(v, FMT);
+ char * fmt = get_keyparam(v, KEY_FMT);
condlog(3, "list maps (operator)");
@@ -446,8 +446,8 @@ cli_list_map_fmt (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
- char * fmt = get_keyparam(v, FMT);
+ char * param = get_keyparam(v, KEY_MAP);
+ char * fmt = get_keyparam(v, KEY_FMT);
param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
@@ -529,7 +529,7 @@ cli_reset_map_stats (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
struct multipath * mpp;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
param = convert_dev(param, 0);
mpp = find_mp_by_str(vecs->mpvec, param);
@@ -546,7 +546,7 @@ static int
cli_add_path (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path *pp;
int r;
struct config *conf;
@@ -662,7 +662,7 @@ static int
cli_del_path (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path *pp;
int ret;
@@ -685,7 +685,7 @@ static int
cli_add_map (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
int major = -1, minor = -1;
char dev_path[PATH_SIZE];
char *refwwid, *alias = NULL;
@@ -745,7 +745,7 @@ static int
cli_del_map (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
int major, minor;
char *alias;
int rc;
@@ -790,7 +790,7 @@ static int
cli_reload(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
- char * mapname = get_keyparam(v, MAP);
+ char * mapname = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
int minor;
@@ -843,7 +843,7 @@ static int
cli_resize(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
- char * mapname = get_keyparam(v, MAP);
+ char * mapname = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
int minor;
unsigned long long size, sz;
@@ -951,7 +951,7 @@ static int
cli_restore_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
- char * mapname = get_keyparam(v, MAP);
+ char * mapname = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
int minor;
struct config *conf;
@@ -1014,7 +1014,7 @@ static int
cli_disable_queueing(void *v, char **reply, int *len, void *data)
{
struct vectors * vecs = (struct vectors *)data;
- char * mapname = get_keyparam(v, MAP);
+ char * mapname = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
int minor;
@@ -1061,8 +1061,8 @@ cli_disable_all_queueing(void *v, char **reply, int *len, void *data)
static int
cli_switch_group(void * v, char ** reply, int * len, void * data)
{
- char * mapname = get_keyparam(v, MAP);
- int groupnum = atoi(get_keyparam(v, GROUP));
+ char * mapname = get_keyparam(v, KEY_MAP);
+ int groupnum = atoi(get_keyparam(v, KEY_GROUP));
mapname = convert_dev(mapname, 0);
condlog(2, "%s: switch to path group #%i (operator)", mapname, groupnum);
@@ -1091,7 +1091,7 @@ static int
cli_suspend(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
int r;
struct multipath * mpp;
@@ -1121,7 +1121,7 @@ static int
cli_resume(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
int r;
struct multipath * mpp;
uint16_t udev_flags;
@@ -1153,7 +1153,7 @@ static int
cli_reinstate(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path * pp;
param = convert_dev(param, 1);
@@ -1176,7 +1176,7 @@ static int
cli_reassign (void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
param = convert_dev(param, 0);
@@ -1200,7 +1200,7 @@ static int
cli_fail(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path * pp;
int r;
@@ -1303,7 +1303,7 @@ cli_getprstatus (void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
@@ -1328,7 +1328,7 @@ cli_setprstatus(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
@@ -1351,7 +1351,7 @@ cli_unsetprstatus(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, MAP);
+ char * param = get_keyparam(v, KEY_MAP);
param = convert_dev(param, 0);
get_path_layout(vecs->pathvec, 0);
@@ -1373,7 +1373,7 @@ cli_getprkey(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char *mapname = get_keyparam(v, MAP);
+ char *mapname = get_keyparam(v, KEY_MAP);
uint64_t key;
mapname = convert_dev(mapname, 0);
@@ -1405,7 +1405,7 @@ cli_unsetprkey(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char *mapname = get_keyparam(v, MAP);
+ char *mapname = get_keyparam(v, KEY_MAP);
int ret;
struct config *conf;
@@ -1429,8 +1429,8 @@ cli_setprkey(void * v, char ** reply, int * len, void * data)
{
struct multipath * mpp;
struct vectors * vecs = (struct vectors *)data;
- char *mapname = get_keyparam(v, MAP);
- char *keyparam = get_keyparam(v, KEY);
+ char *mapname = get_keyparam(v, KEY_MAP);
+ char *keyparam = get_keyparam(v, KEY_KEY);
uint64_t prkey;
uint8_t flags;
int ret;
@@ -1459,7 +1459,7 @@ cli_setprkey(void * v, char ** reply, int * len, void * data)
static int cli_set_marginal(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path * pp;
param = convert_dev(param, 1);
@@ -1486,7 +1486,7 @@ static int cli_set_marginal(void * v, char ** reply, int * len, void * data)
static int cli_unset_marginal(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * param = get_keyparam(v, PATH);
+ char * param = get_keyparam(v, KEY_PATH);
struct path * pp;
param = convert_dev(param, 1);
@@ -1513,7 +1513,7 @@ static int cli_unset_marginal(void * v, char ** reply, int * len, void * data)
static int cli_unset_all_marginal(void * v, char ** reply, int * len, void * data)
{
struct vectors * vecs = (struct vectors *)data;
- char * mapname = get_keyparam(v, MAP);
+ char * mapname = get_keyparam(v, KEY_MAP);
struct multipath *mpp;
struct pathgroup * pgp;
struct path * pp;
--
2.33.0

View File

@ -1,12 +1,12 @@
#needsrootforbuild
Name: multipath-tools
Version: 0.8.7
Release: 9
Version: 0.9.5
Release: 1
Summary: Tools to manage multipath devices with the device-mapper
License: GPL-2.0-or-later and LGPL-2.0-only
URL: http://christophe.varoqui.free.fr/
# curl https://github.com/opensvc/multipath-tools/archive/0.8.7.tar.gz -o multipath-tools-0.8.7.tgz
# curl https://github.com/opensvc/multipath-tools/archive/0.9.5.tar.gz -o multipath-tools-0.9.5.tgz
Source0: https://github.com/opensvc/multipath-tools/archive/%{version}.tar.gz
Source1: multipath.conf
Patch1: 0001-change-order-of-multipath.rules.patch
@ -24,23 +24,16 @@ Patch12: 0012-device-mapper-multipath-fix-find-multipath-failure.patch
Patch13: 0013-kpartx-change-kpartx-file-and-default-bindir.patch
Patch14: 0014-remove-local-disk-from-pathvec.patch
Patch15: 0015-clear-mpp-path-reference-when-path-is-freed-otherwis.patch
Patch16: 0016-multipath-return-failure-on-an-invalid-remove-cmd.patch
Patch17: 0017-multipath-fix-exit-status-of-multipath-T.patch
Patch18: 0018-multipath-tools-use-run-instead-of-dev-shm.patch
Patch19: 0019-multipathd-add-and-set-cli_handlers-in-a-single-step.patch
Patch20: 0020-multipathd-make-all-cli_handlers-static.patch
Patch21: 0021-multipathd-Fix-command-completion-in-interactive-mod.patch
Patch22: 0022-multipathd-more-robust-command-parsing.patch
Patch23: 0023-multipathd-Fixed-multipathd-parameter-invoking-seque.patch
Patch24: 0024-libmultipath-io_err_stat-don-t-free-aio-memory-befor.patch
Patch25: 0025-libmultipath-io_err_stat-call-io_destroy-inside-free.patch
Patch16: 0016-multipathd-Fixed-multipathd-parameter-invoking-seque.patch
Patch17: 0017-libmultipath-io_err_stat-don-t-free-aio-memory-befor.patch
Patch18: 0018-libmultipath-io_err_stat-call-io_destroy-inside-free.patch
BuildRequires: multipath-tools, libcmocka, libcmocka-devel
BuildRequires: gcc, libaio-devel, userspace-rcu-devel, device-mapper-devel >= 1.02.89
BuildRequires: libselinux-devel, libsepol-devel, readline-devel, ncurses-devel,
BuildRequires: libselinux-devel, libsepol-devel, readline-devel, ncurses-devel, libmount-devel
BuildRequires: systemd-units, systemd-devel, json-c-devel, perl-interpreter, pkgconfig
Requires: userspace-rcu, json-c, device-mapper >= 1.02.96
Requires: kpartx = %{version}-%{release}
Requires: kpartx = %{version}-%{release}, libmount
Requires(post): systemd-units
Requires(preun): systemd-units
Requires(postun): systemd-units
@ -91,7 +84,7 @@ Summary: Create device maps from partition tables.
Reads partition tables and create device maps over partitions segments detected.
%prep
%autosetup -n multipath-tools-0.8.7 -p1
%autosetup -n multipath-tools-%{version} -p1
cp %{SOURCE1} .
%build
@ -103,6 +96,8 @@ make install \
bindir=/usr/sbin \
syslibdir=/usr/%{_lib} \
usrlibdir=/usr/%{_lib} \
mandir=/usr/share/man \
plugindir=/usr/%{_lib}/multipath \
libdir=/usr/%{_lib}/multipath \
rcdir=%{_initrddir} \
unitdir=%{_unitdir} \
@ -133,13 +128,14 @@ fi
%files
%doc README.md README.alua multipath.conf
%doc README.md multipath.conf
%license LICENSES/GPL-2.0 LICENSES/LGPL-2.0 LICENSES/GPL-3.0
%{_unitdir}/*
/usr/sbin/multipath
/usr/sbin/multipathd
/usr/sbin/mpathconf
/usr/sbin/mpathpersist
/usr/sbin/multipathc
/usr/%{_lib}/libmultipath.so
/usr/%{_lib}/libmultipath.so.*
/usr/%{_lib}/libmpathpersist.so.*
@ -147,12 +143,15 @@ fi
/usr/%{_lib}/libdmmp.so.*
/usr/%{_lib}/libmpathvalid.so
/usr/%{_lib}/libmpathvalid.so.*
/usr/%{_lib}/libmpathutil.so
/usr/%{_lib}/libmpathutil.so.*
%dir /etc/multipath
%dir /usr/%{_lib}/multipath
/usr/%{_lib}/multipath/*
%config /usr/lib/udev/rules.d/62-multipath.rules
%config /usr/lib/udev/rules.d/11-dm-mpath.rules
%config /usr/lib/tmpfiles.d/multipath.conf
%config /usr/lib/modules-load.d/multipath.conf
%files devel
@ -181,6 +180,12 @@ fi
%changelog
* Mon Feb 5 2024 wangzhiqiang <wangzhiqiang95@huawei.com> - 0.9.5-1
- upgrade version to 0.9.5:
- add requires libmount and libmount-devel
- add multipath.conf multipathc and libmpathutil.so
- delete README.alua
* Tue Dec 19 2023 wangzhiqiang <wangzhiqiang95@huawei.com> - 0.8.7-9
- fix coredump in io_err_stat