diff --git a/bug-1163460-totemip-Add-support-for-sin6_scope_id.patch b/bug-1163460-totemip-Add-support-for-sin6_scope_id.patch new file mode 100644 index 0000000..be3694a --- /dev/null +++ b/bug-1163460-totemip-Add-support-for-sin6_scope_id.patch @@ -0,0 +1,109 @@ +From 36938e24a8d03f9b8fc97768ed08df36e63f61d0 Mon Sep 17 00:00:00 2001 +From: liangxin1300 +Date: Mon, 17 Feb 2020 22:24:31 +0800 +Subject: [PATCH] totemip: Add support for sin6_scope_id + +sin6_scope_id was not present in totemip structure making impossible to +use link-local ipv6 address. + +Patch adds sin6_scope_id and changes convert/copy functions to use it +(formally also comparator functions should be changed, but it seems to +cause more harm and it is not really needed). + +This makes corosync work with link-local addresses fine for both UDPU +and UDP transport as long as interface specification is used (so +fe80::xxxx:xxxx:xxxx:xxxx%eth0). + +(backported from master 934c47ed4384daf2819c26306bebba3225807499) + +Signed-off-by: liangxin1300 +Reviewed-by: Jan Friesse +--- + exec/totemip.c | 15 +++++++++++---- + include/corosync/coroapi.h | 1 + + include/corosync/totem/totemip.h | 1 + + 3 files changed, 13 insertions(+), 4 deletions(-) + +diff --git a/exec/totemip.c b/exec/totemip.c +index 28a88365..d8130831 100644 +--- a/exec/totemip.c ++++ b/exec/totemip.c +@@ -247,7 +247,7 @@ int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr, + #endif + sin->sin6_family = ip_addr->family; + sin->sin6_port = ntohs(port); +- sin->sin6_scope_id = 2; ++ sin->sin6_scope_id = ip_addr->sin6_scope_id; + memcpy(&sin->sin6_addr, ip_addr->addr, sizeof(struct in6_addr)); + + *addrlen = sizeof(struct sockaddr_in6); +@@ -282,10 +282,13 @@ int totemip_parse(struct totem_ip_address *totemip, const char *addr, int family + sa6 = (struct sockaddr_in6 *)ainfo->ai_addr; + totemip->family = ainfo->ai_family; + +- if (ainfo->ai_family == AF_INET) ++ if (ainfo->ai_family == AF_INET) { + memcpy(totemip->addr, &sa->sin_addr, sizeof(struct in_addr)); +- else ++ totemip->sin6_scope_id = 0; ++ } else { + memcpy(totemip->addr, &sa6->sin6_addr, sizeof(struct in6_addr)); ++ totemip->sin6_scope_id = sa6->sin6_scope_id; ++ } + + freeaddrinfo(ainfo); + return 0; +@@ -304,6 +307,7 @@ int totemip_sockaddr_to_totemip_convert(const struct sockaddr_storage *saddr, + const struct sockaddr_in *sin = (const struct sockaddr_in *)saddr; + + memcpy(ip_addr->addr, &sin->sin_addr, sizeof(struct in_addr)); ++ ip_addr->sin6_scope_id = 0; + ret = 0; + } + +@@ -312,7 +316,7 @@ int totemip_sockaddr_to_totemip_convert(const struct sockaddr_storage *saddr, + = (const struct sockaddr_in6 *)saddr; + + memcpy(ip_addr->addr, &sin->sin6_addr, sizeof(struct in6_addr)); +- ++ ip_addr->sin6_scope_id = sin->sin6_scope_id; + ret = 0; + } + return ret; +@@ -445,6 +449,9 @@ int totemip_iface_check(struct totem_ip_address *bindnet, + if (addr_len == 0) + continue ; + ++ if (bindnet->sin6_scope_id != 0 && bindnet->sin6_scope_id != if_addr->interface_num) ++ continue; ++ + totemip_copy(&bn_netaddr, bindnet); + totemip_copy(&if_netaddr, &if_addr->ip_addr); + +diff --git a/include/corosync/coroapi.h b/include/corosync/coroapi.h +index 7e1f27cb..00173001 100644 +--- a/include/corosync/coroapi.h ++++ b/include/corosync/coroapi.h +@@ -112,6 +112,7 @@ struct totem_ip_address { + unsigned int nodeid; + unsigned short family; + unsigned char addr[TOTEMIP_ADDRLEN]; ++ unsigned int sin6_scope_id; + } __attribute__((packed)); + #endif + +diff --git a/include/corosync/totem/totemip.h b/include/corosync/totem/totemip.h +index 0168e66c..2ae0e03e 100644 +--- a/include/corosync/totem/totemip.h ++++ b/include/corosync/totem/totemip.h +@@ -65,6 +65,7 @@ struct totem_ip_address + unsigned int nodeid; + unsigned short family; + unsigned char addr[TOTEMIP_ADDRLEN]; ++ unsigned int sin6_scope_id; + } __attribute__((packed)); + + struct totem_ip_if_address +-- +2.21.1 + diff --git a/bug-1166899-quorumtool-Fix-exit-status-codes.patch b/bug-1166899-quorumtool-Fix-exit-status-codes.patch new file mode 100644 index 0000000..2690512 --- /dev/null +++ b/bug-1166899-quorumtool-Fix-exit-status-codes.patch @@ -0,0 +1,241 @@ +From a95e28cc35e1d59cedb406914ba437e21bc3e1ea Mon Sep 17 00:00:00 2001 +From: Jan Friesse +Date: Thu, 14 Feb 2019 16:05:59 +0100 +Subject: [PATCH] quorumtool: Fix exit status codes + +1. Use EXIT_SUCCESS and EXIT_FAILURE when possible +2. For -s option return EXIT_SUCCESS when no problem appeared and node + is quorate, EXIT_FAILURE if problem appeared and exit code 2 + (EXIT_NOT_QUORATE) when no problem appeared but node is not quorate. +3. Document exit codes in the man page + +Signed-off-by: Jan Friesse +Reviewed-by: Christine Caulfield +(cherry picked from commit db38e3958c4f88d5d06e8f7c83d6d90334d9fbd2) +--- + man/corosync-quorumtool.8 | 17 +++++++++++- + tools/corosync-quorumtool.c | 53 ++++++++++++++++++++++--------------- + 2 files changed, 47 insertions(+), 23 deletions(-) + +diff --git a/man/corosync-quorumtool.8 b/man/corosync-quorumtool.8 +index 915f35ff..2fc4e020 100644 +--- a/man/corosync-quorumtool.8 ++++ b/man/corosync-quorumtool.8 +@@ -31,7 +31,7 @@ + .\" * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + .\" * THE POSSIBILITY OF SUCH DAMAGE. + .\" */ +-.TH COROSYNC-QUORUMTOOL 8 2012-01-12 ++.TH COROSYNC-QUORUMTOOL 8 2019-02-14 + .SH NAME + corosync-quorumtool \- Set and display quorum settings. + .SH SYNOPSIS +@@ -89,6 +89,21 @@ show this help text + show version and exit + .PP + * Starred items only work if votequorum is the quorum provider for corosync ++.SH EXIT STATUS ++corosync-quorumtool may return one of several error codes if it encounters problems. ++.TP ++0 ++No problems occurred (quorate for ++.B -s ++operation). ++.TP ++1 ++Generic error code. ++.TP ++2 ++Not quorate (returned only for ++.B -s ++operation). + .SH SEE ALSO + .BR corosync_overview (8), + .BR votequorum_overview (8), +diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c +index e5d17b16..66ca7de5 100644 +--- a/tools/corosync-quorumtool.c ++++ b/tools/corosync-quorumtool.c +@@ -1,5 +1,5 @@ + /* +- * Copyright (c) 2009-2014 Red Hat, Inc. ++ * Copyright (c) 2009-2019 Red Hat, Inc. + * + * All rights reserved. + * +@@ -75,6 +75,8 @@ typedef enum { + SORT_NODENAME + } sorttype_t; + ++#define EXIT_NOT_QUORATE 2 ++ + /* + * global vars + */ +@@ -238,7 +240,7 @@ static int set_votes(uint32_t nodeid, int votes) + votes, nodeid, cs_strerror(err)); + } + +- return err==CS_OK?0:err; ++ return (err == CS_OK ? EXIT_SUCCESS : EXIT_FAILURE); + } + + static int set_expected(int expected_votes) +@@ -249,7 +251,7 @@ static int set_expected(int expected_votes) + fprintf(stderr, "Unable to set expected votes: %s\n", cs_strerror(err)); + } + +- return err==CS_OK?0:err; ++ return (err == CS_OK ? EXIT_SUCCESS : EXIT_FAILURE); + } + + /* +@@ -638,9 +640,9 @@ static int display_quorum_data(int is_quorate, + } + + /* +- * return 1 if quorate +- * 0 if not quorate +- * -1 on error ++ * return EXIT_SUCCESS if quorate ++ * EXIT_NOT_QUORATE if not quorate ++ * EXIT_FAILURE on error + */ + static int show_status(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) + { +@@ -689,15 +691,15 @@ static int show_status(nodeid_format_t nodeid_format, name_format_t name_format, + + quorum_err: + if (err != CS_OK) { +- return -1; ++ return EXIT_FAILURE; + } + + err = display_quorum_data(is_quorate, nodeid_format, name_format, sort_type, 0); + if (err != CS_OK) { +- return -1; ++ return EXIT_FAILURE; + } + +- return is_quorate; ++ return (is_quorate ? EXIT_SUCCESS : EXIT_NOT_QUORATE); + } + + static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) { +@@ -750,7 +752,7 @@ static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_form + } + + quorum_err: +- return -1; ++ return EXIT_FAILURE; + } + + static int show_nodes(nodeid_format_t nodeid_format, name_format_t name_format, sorttype_t sort_type) +@@ -784,23 +786,30 @@ static int unregister_qdevice(void) + { + int err; + struct votequorum_info info; ++ int result; ++ ++ result = EXIT_FAILURE; + + err = votequorum_getinfo(v_handle, our_nodeid, &info); + if (err != CS_OK) { + fprintf(stderr, "Unable to get quorum device info: %s\n", cs_strerror(err)); +- return -1; ++ goto err_exit; + } + + if (!(info.flags & VOTEQUORUM_INFO_QDEVICE_REGISTERED)) { +- return 0; ++ result = EXIT_SUCCESS; ++ goto err_exit; + } + + err = votequorum_qdevice_unregister(v_handle, info.qdevice_name); + if (err != CS_OK) { + fprintf(stderr, "Unable to unregister quorum device: %s\n", cs_strerror(err)); +- return -1; ++ goto err_exit; + } +- return 0; ++ ++ result = EXIT_SUCCESS; ++err_exit: ++ return result; + } + + /* +@@ -884,7 +893,7 @@ int main (int argc, char *argv[]) { + + if (init_all()) { + close_all(); +- exit(1); ++ exit(EXIT_FAILURE); + } + + while ( (opt = getopt(argc, argv, options)) != -1 ) { +@@ -894,7 +903,7 @@ int main (int argc, char *argv[]) { + command_opt = CMD_UNREGISTER_QDEVICE; + } else { + fprintf(stderr, "You cannot unregister quorum device, corosync is not using votequorum\n"); +- exit(2); ++ exit(EXIT_FAILURE); + } + break; + case 's': +@@ -928,14 +937,14 @@ int main (int argc, char *argv[]) { + } + } else { + fprintf(stderr, "You cannot change expected votes, corosync is not using votequorum\n"); +- exit(2); ++ exit(EXIT_FAILURE); + } + break; + case 'n': + l = strtol(optarg, &endptr, 0); + if ((l == 0 && endptr == optarg) || l < 0) { + fprintf(stderr, "The nodeid was not valid, try a positive number\n"); +- exit(2); ++ exit(EXIT_FAILURE); + } + nodeid = l; + nodeid_set = 1; +@@ -945,14 +954,14 @@ int main (int argc, char *argv[]) { + votes = strtol(optarg, &endptr, 0); + if ((votes == 0 && endptr == optarg) || votes < 0) { + fprintf(stderr, "New votes value was not valid, try a positive number or zero\n"); +- exit(2); ++ exit(EXIT_FAILURE); + } else { + command_opt = CMD_SETVOTES; + } + } + else { + fprintf(stderr, "You cannot change node votes, corosync is not using votequorum\n"); +- exit(2); ++ exit(EXIT_FAILURE); + } + break; + case 'o': +@@ -966,7 +975,7 @@ int main (int argc, char *argv[]) { + break; + default: + fprintf(stderr, "Invalid ordering option. valid orders are a(address), i(node ID) or n(name)\n"); +- exit(2); ++ exit(EXIT_FAILURE); + break; + } + break; +@@ -985,7 +994,7 @@ int main (int argc, char *argv[]) { + switch (command_opt) { + case CMD_UNKNOWN: + show_usage(argv[0]); +- ret = -1; ++ ret = EXIT_FAILURE; + break; + case CMD_SHOWNODES: + ret = show_nodes(nodeid_format, address_format, sort_opt); +-- +2.21.1 + diff --git a/corosync.changes b/corosync.changes index 91dfbf1..9561f65 100644 --- a/corosync.changes +++ b/corosync.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Fri Mar 20 14:07:26 UTC 2020 - XinLiang + +- Fix bsc#1163460 Corosync does not support link-local IPv6 addresses + Added: bug-1163460-totemip-Add-support-for-sin6_scope_id.patch + +------------------------------------------------------------------- +Wed Mar 18 02:47:13 UTC 2020 - XinLiang + +- Fix bsc#1166899, return value of "corosync-quorumtool -s" was not correct + Added: bug-1166899-quorumtool-Fix-exit-status-codes.patch + ------------------------------------------------------------------- Fri Jan 3 11:30:41 UTC 2020 - matthias.gerstner@suse.com diff --git a/corosync.spec b/corosync.spec index b11baef..d3b73a7 100644 --- a/corosync.spec +++ b/corosync.spec @@ -1,7 +1,7 @@ # # spec file for package corosync # -# Copyright (c) 2020 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -52,7 +52,7 @@ License: BSD-3-Clause Group: Productivity/Clustering/HA Version: 2.4.5 Release: 0 -Url: http://corosync.github.io/corosync/ +URL: http://corosync.github.io/corosync/ # source should be Souce code.tar.gz, https://github.com/corosync/corosync/archive/vX.X.X.tar.gz Source0: %{name}-%{version}.tar.gz Source2: baselibs.conf @@ -65,6 +65,8 @@ Patch6: bug-1001164_corosync.conf-example.patch Patch7: corosync-2.3.4-fix-bashisms.patch Patch8: corosync-init-lockfile-path-error.patch Patch9: corosync-start-stop-level.patch +Patch10: bug-1166899-quorumtool-Fix-exit-status-codes.patch +Patch11: bug-1163460-totemip-Add-support-for-sin6_scope_id.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build # openais is indeed gone and should be uninstalled. Yes, we do not @@ -139,6 +141,8 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build %patch7 -p1 %patch8 -p1 %patch9 -p1 +%patch10 -p1 +%patch11 -p1 %build %if %{with runautogen}