From 79b3a063e4dac88fafea5d04d7021368e1257b5116871da700b4c955a56b4295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= Date: Wed, 22 Mar 2017 08:50:09 +0000 Subject: [PATCH 1/3] Accepting request 481947 from home:cbosdonnat:branches:Virtualization - Fail to start network instead of losing routes if IPv6 forwarding is required. bsc#1025252 Added patches: 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch 5dd607059-add-virNetDevGetName.patch 754515b7d-add-virNetlinkDumpCommand.patch d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch OBS-URL: https://build.opensuse.org/request/show/481947 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=593 --- ...cept_ra-before-enabling-ipv6-forward.patch | 260 ++++++++++++++++++ 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch | 46 ++++ 5dd607059-add-virNetDevGetName.patch | 70 +++++ 754515b7d-add-virNetlinkDumpCommand.patch | 125 +++++++++ ...-request-sending-code-from-virNetlin.patch | 165 +++++++++++ libvirt.changes | 13 + libvirt.spec | 14 +- 7 files changed, 691 insertions(+), 2 deletions(-) create mode 100644 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch create mode 100644 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch create mode 100644 5dd607059-add-virNetDevGetName.patch create mode 100644 754515b7d-add-virNetlinkDumpCommand.patch create mode 100644 d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch diff --git a/00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch b/00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch new file mode 100644 index 0000000..cf408e4 --- /dev/null +++ b/00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch @@ -0,0 +1,260 @@ +From 00d28a78b5d1f6eaf79f06ac59e31c568af9da37 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= +Date: Fri, 3 Mar 2017 14:14:51 +0100 +Subject: [PATCH 5/5] network: check accept_ra before enabling ipv6 forwarding + +When enabling IPv6 on all interfaces, we may get the host Router +Advertisement routes discarded. To avoid this, the user needs to set +accept_ra to 2 for the interfaces with such routes. + +See https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt +on this topic. + +To avoid user mistakenly losing routes on their hosts, check +accept_ra values before enabling IPv6 forwarding. If a RA route is +detected, but neither the corresponding device nor global accept_ra +is set to 2, the network will fail to start. +--- + src/libvirt_private.syms | 1 + + src/network/bridge_driver.c | 16 +++-- + src/util/virnetdevip.c | 158 ++++++++++++++++++++++++++++++++++++++++++++ + src/util/virnetdevip.h | 1 + + 4 files changed, 171 insertions(+), 5 deletions(-) + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index 3b2cb83c4..57acfdbb1 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -2067,6 +2067,7 @@ virNetDevBridgeSetVlanFiltering; + virNetDevIPAddrAdd; + virNetDevIPAddrDel; + virNetDevIPAddrGet; ++virNetDevIPCheckIPv6Forwarding; + virNetDevIPInfoAddToDev; + virNetDevIPInfoClear; + virNetDevIPRouteAdd; +diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c +index 4d1a44516..a753cd78b 100644 +--- a/src/network/bridge_driver.c ++++ b/src/network/bridge_driver.c +@@ -61,6 +61,7 @@ + #include "virlog.h" + #include "virdnsmasq.h" + #include "configmake.h" ++#include "virnetlink.h" + #include "virnetdev.h" + #include "virnetdevip.h" + #include "virnetdevbridge.h" +@@ -2389,11 +2390,16 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver, + } + + /* If forward.type != NONE, turn on global IP forwarding */ +- if (network->def->forward.type != VIR_NETWORK_FORWARD_NONE && +- networkEnableIPForwarding(v4present, v6present) < 0) { +- virReportSystemError(errno, "%s", +- _("failed to enable IP forwarding")); +- goto err3; ++ if (network->def->forward.type != VIR_NETWORK_FORWARD_NONE) { ++ if (!virNetDevIPCheckIPv6Forwarding()) ++ goto err3; /* Precise error message already provided */ ++ ++ ++ if (networkEnableIPForwarding(v4present, v6present) < 0) { ++ virReportSystemError(errno, "%s", ++ _("failed to enable IP forwarding")); ++ goto err3; ++ } + } + + +diff --git a/src/util/virnetdevip.c b/src/util/virnetdevip.c +index 42fbba1eb..a4d382427 100644 +--- a/src/util/virnetdevip.c ++++ b/src/util/virnetdevip.c +@@ -508,6 +508,158 @@ virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs, size_t count) + return ret; + } + ++static int ++virNetDevIPGetAcceptRA(const char *ifname) ++{ ++ char *path = NULL; ++ char *buf = NULL; ++ char *suffix; ++ int accept_ra = -1; ++ ++ if (virAsprintf(&path, "/proc/sys/net/ipv6/conf/%s/accept_ra", ++ ifname ? ifname : "all") < 0) ++ goto cleanup; ++ ++ if ((virFileReadAll(path, 512, &buf) < 0) || ++ (virStrToLong_i(buf, &suffix, 10, &accept_ra) < 0)) ++ goto cleanup; ++ ++ cleanup: ++ VIR_FREE(path); ++ VIR_FREE(buf); ++ ++ return accept_ra; ++} ++ ++struct virNetDevIPCheckIPv6ForwardingData { ++ bool hasRARoutes; ++ ++ /* Devices with conflicting accept_ra */ ++ char **devices; ++ size_t ndevices; ++}; ++ ++static int ++virNetDevIPCheckIPv6ForwardingCallback(const struct nlmsghdr *resp, ++ void *opaque) ++{ ++ struct rtmsg *rtmsg = NLMSG_DATA(resp); ++ int accept_ra = -1; ++ struct rtattr *rta; ++ char *ifname = NULL; ++ struct virNetDevIPCheckIPv6ForwardingData *data = opaque; ++ int ret = 0; ++ int len = RTM_PAYLOAD(resp); ++ int oif = -1; ++ ++ /* Ignore messages other than route ones */ ++ if (resp->nlmsg_type != RTM_NEWROUTE) ++ return ret; ++ ++ /* Extract a few attributes */ ++ for (rta = RTM_RTA(rtmsg); RTA_OK(rta, len); rta = RTA_NEXT(rta, len)) { ++ switch (rta->rta_type) { ++ case RTA_OIF: ++ oif = *(int *)RTA_DATA(rta); ++ ++ if (!(ifname = virNetDevGetName(oif))) ++ goto error; ++ break; ++ } ++ } ++ ++ /* No need to do anything else for non RA routes */ ++ if (rtmsg->rtm_protocol != RTPROT_RA) ++ goto cleanup; ++ ++ data->hasRARoutes = true; ++ ++ /* Check the accept_ra value for the interface */ ++ accept_ra = virNetDevIPGetAcceptRA(ifname); ++ VIR_DEBUG("Checking route for device %s, accept_ra: %d", ifname, accept_ra); ++ ++ if (accept_ra != 2 && VIR_APPEND_ELEMENT(data->devices, data->ndevices, ifname) < 0) ++ goto error; ++ ++ cleanup: ++ VIR_FREE(ifname); ++ return ret; ++ ++ error: ++ ret = -1; ++ goto cleanup; ++} ++ ++bool ++virNetDevIPCheckIPv6Forwarding(void) ++{ ++ struct nl_msg *nlmsg = NULL; ++ bool valid = false; ++ struct rtgenmsg genmsg; ++ size_t i; ++ struct virNetDevIPCheckIPv6ForwardingData data = { ++ .hasRARoutes = false, ++ .devices = NULL, ++ .ndevices = 0 ++ }; ++ ++ ++ /* Prepare the request message */ ++ if (!(nlmsg = nlmsg_alloc_simple(RTM_GETROUTE, ++ NLM_F_REQUEST | NLM_F_DUMP))) { ++ virReportOOMError(); ++ goto cleanup; ++ } ++ ++ memset(&genmsg, 0, sizeof(genmsg)); ++ genmsg.rtgen_family = AF_INET6; ++ ++ if (nlmsg_append(nlmsg, &genmsg, sizeof(genmsg), NLMSG_ALIGNTO) < 0) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", ++ _("allocated netlink buffer is too small")); ++ goto cleanup; ++ } ++ ++ /* Send the request and loop over the responses */ ++ if (virNetlinkDumpCommand(nlmsg, virNetDevIPCheckIPv6ForwardingCallback, ++ 0, 0, NETLINK_ROUTE, 0, &data) < 0) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", ++ _("Failed to loop over IPv6 routes")); ++ goto cleanup; ++ } ++ ++ valid = !data.hasRARoutes || data.ndevices == 0; ++ ++ /* Check the global accept_ra if at least one isn't set on a ++ per-device basis */ ++ if (!valid && data.hasRARoutes) { ++ int accept_ra = virNetDevIPGetAcceptRA(NULL); ++ valid = accept_ra == 2; ++ VIR_DEBUG("Checked global accept_ra: %d", accept_ra); ++ } ++ ++ if (!valid) { ++ virBuffer buf = VIR_BUFFER_INITIALIZER; ++ for (i = 0; i < data.ndevices; i++) { ++ virBufferAdd(&buf, data.devices[i], -1); ++ if (i < data.ndevices - 1) ++ virBufferAddLit(&buf, ", "); ++ } ++ ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("Check the host setup: enabling IPv6 forwarding with " ++ "RA routes without accept_ra set to 2 is likely to cause " ++ "routes loss. Interfaces to look at: %s"), ++ virBufferCurrentContent(&buf)); ++ virBufferFreeAndReset(&buf); ++ } ++ ++ cleanup: ++ nlmsg_free(nlmsg); ++ for (i = 0; i < data.ndevices; i++) ++ VIR_FREE(data.devices[i]); ++ return valid; ++} + + #else /* defined(__linux__) && defined(HAVE_LIBNL) */ + +@@ -655,6 +807,12 @@ virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs ATTRIBUTE_UNUSED, + return -1; + } + ++bool ++virNetDevIPCheckIPv6Forwarding(void) ++{ ++ VIR_WARN("built without libnl: unable to check if IPv6 forwarding can be safely enabled"); ++ return true; ++} + + #endif /* defined(__linux__) && defined(HAVE_LIBNL) */ + +diff --git a/src/util/virnetdevip.h b/src/util/virnetdevip.h +index b7abdf94d..cc466ca25 100644 +--- a/src/util/virnetdevip.h ++++ b/src/util/virnetdevip.h +@@ -83,6 +83,7 @@ int virNetDevIPAddrGet(const char *ifname, virSocketAddrPtr addr) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; + int virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs, size_t count) + ATTRIBUTE_NONNULL(1); ++bool virNetDevIPCheckIPv6Forwarding(void); + + /* virNetDevIPRoute object */ + void virNetDevIPRouteFree(virNetDevIPRoutePtr def); +-- +2.12.0 + diff --git a/3ee35d7d6-more-uses-of-SYSCTL_PATH.patch b/3ee35d7d6-more-uses-of-SYSCTL_PATH.patch new file mode 100644 index 0000000..3e6e739 --- /dev/null +++ b/3ee35d7d6-more-uses-of-SYSCTL_PATH.patch @@ -0,0 +1,46 @@ +From 3ee35d7d6caf0ffa722d60251eabec43c094fb12 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= +Date: Fri, 3 Mar 2017 14:13:49 +0100 +Subject: [PATCH 3/5] bridge_driver.c: more uses of SYSCTL_PATH + +Replace a few occurences of /proc/sys by the corresponding macro +defined a few lines after: SYSCTL_PATH +--- + src/network/bridge_driver.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c +index 32c5ab7a7..4d1a44516 100644 +--- a/src/network/bridge_driver.c ++++ b/src/network/bridge_driver.c +@@ -85,6 +85,8 @@ + */ + #define VIR_NETWORK_DHCP_LEASE_FILE_SIZE_MAX (32 * 1024 * 1024) + ++#define SYSCTL_PATH "/proc/sys" ++ + VIR_LOG_INIT("network.bridge_driver"); + + static virNetworkDriverStatePtr network_driver; +@@ -2092,15 +2094,14 @@ networkEnableIPForwarding(bool enableIPv4, bool enableIPv6) + &enabled, sizeof(enabled)); + #else + if (enableIPv4) +- ret = virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n", 0); ++ ret = virFileWriteStr(SYSCTL_PATH "/net/ipv4/ip_forward", "1\n", 0); + if (enableIPv6 && ret == 0) +- ret = virFileWriteStr("/proc/sys/net/ipv6/conf/all/forwarding", "1\n", 0); ++ ret = virFileWriteStr(SYSCTL_PATH "/net/ipv6/conf/all/forwarding", "1\n", 0); ++ + #endif + return ret; + } + +-#define SYSCTL_PATH "/proc/sys" +- + static int + networkSetIPv6Sysctls(virNetworkObjPtr network) + { +-- +2.12.0 + diff --git a/5dd607059-add-virNetDevGetName.patch b/5dd607059-add-virNetDevGetName.patch new file mode 100644 index 0000000..5a59dca --- /dev/null +++ b/5dd607059-add-virNetDevGetName.patch @@ -0,0 +1,70 @@ +From 5dd607059d8a98e04024305ae4afbd038aadbdcd Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= +Date: Wed, 15 Mar 2017 14:46:56 +0100 +Subject: [PATCH 4/5] util: add virNetDevGetName() function + +Add a function getting the name of a network interface out of its index. +--- + src/libvirt_private.syms | 1 + + src/util/virnetdev.c | 19 +++++++++++++++++++ + src/util/virnetdev.h | 2 ++ + 3 files changed, 22 insertions(+) + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index f03925bc1..3b2cb83c4 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -1995,6 +1995,7 @@ virNetDevGetIndex; + virNetDevGetLinkInfo; + virNetDevGetMAC; + virNetDevGetMTU; ++virNetDevGetName; + virNetDevGetOnline; + virNetDevGetPhysicalFunction; + virNetDevGetPromiscuous; +diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c +index d12324878..91a5274aa 100644 +--- a/src/util/virnetdev.c ++++ b/src/util/virnetdev.c +@@ -899,6 +899,25 @@ virNetDevGetRcvAllMulti(const char *ifname, + return virNetDevGetIFFlag(ifname, VIR_IFF_ALLMULTI, receive); + } + ++char *virNetDevGetName(int ifindex) ++{ ++ char name[IFNAMSIZ]; ++ char *ifname = NULL; ++ ++ memset(&name, 0, sizeof(name)); ++ ++ if (!if_indextoname(ifindex, name)) { ++ virReportSystemError(errno, ++ _("Failed to convert interface index %d to a name"), ++ ifindex); ++ goto cleanup; ++ } ++ ++ ignore_value(VIR_STRDUP(ifname, name)); ++ ++ cleanup: ++ return ifname; ++} + + /** + * virNetDevGetIndex: +diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h +index 236cf83ef..01e9c5b95 100644 +--- a/src/util/virnetdev.h ++++ b/src/util/virnetdev.h +@@ -157,6 +157,8 @@ int virNetDevSetNamespace(const char *ifname, pid_t pidInNs) + int virNetDevSetName(const char *ifname, const char *newifname) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; + ++char *virNetDevGetName(int ifindex) ++ ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + int virNetDevGetIndex(const char *ifname, int *ifindex) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; + +-- +2.12.0 + diff --git a/754515b7d-add-virNetlinkDumpCommand.patch b/754515b7d-add-virNetlinkDumpCommand.patch new file mode 100644 index 0000000..4b9002d --- /dev/null +++ b/754515b7d-add-virNetlinkDumpCommand.patch @@ -0,0 +1,125 @@ +From 754515b7db6258ab592265b743128353be0cb32b Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= +Date: Fri, 3 Mar 2017 12:22:50 +0100 +Subject: [PATCH 2/5] util: add virNetlinkDumpCommand() + +virNetlinkCommand() processes only one response message, while some +netlink commands, like route dumping, need to process several. +Add virNetlinkDumpCommand() as a virNetlinkCommand() sister. +--- + src/libvirt_private.syms | 1 + + src/util/virnetlink.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ + src/util/virnetlink.h | 9 ++++++++ + 3 files changed, 68 insertions(+) + +diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms +index b46e85f63..f03925bc1 100644 +--- a/src/libvirt_private.syms ++++ b/src/libvirt_private.syms +@@ -2138,6 +2138,7 @@ virNetDevVPortProfileOpTypeToString; + # util/virnetlink.h + virNetlinkCommand; + virNetlinkDelLink; ++virNetlinkDumpCommand; + virNetlinkDumpLink; + virNetlinkEventAddClient; + virNetlinkEventRemoveClient; +diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c +index be00351db..9bc1f0f2b 100644 +--- a/src/util/virnetlink.c ++++ b/src/util/virnetlink.c +@@ -335,6 +335,52 @@ int virNetlinkCommand(struct nl_msg *nl_msg, + return ret; + } + ++int ++virNetlinkDumpCommand(struct nl_msg *nl_msg, ++ virNetlinkDumpCallback callback, ++ uint32_t src_pid, uint32_t dst_pid, ++ unsigned int protocol, unsigned int groups, ++ void *opaque) ++{ ++ int ret = -1; ++ bool end = false; ++ int len = 0; ++ struct nlmsghdr *resp = NULL; ++ struct nlmsghdr *msg = NULL; ++ ++ struct sockaddr_nl nladdr = { ++ .nl_family = AF_NETLINK, ++ .nl_pid = dst_pid, ++ .nl_groups = 0, ++ }; ++ virNetlinkHandle *nlhandle = NULL; ++ ++ if (!(nlhandle = virNetlinkSendRequest(nl_msg, src_pid, nladdr, ++ protocol, groups))) ++ goto cleanup; ++ ++ while (!end) { ++ len = nl_recv(nlhandle, &nladdr, (unsigned char **)&resp, NULL); ++ ++ for (msg = resp; NLMSG_OK(msg, len); msg = NLMSG_NEXT(msg, len)) { ++ if (msg->nlmsg_type == NLMSG_DONE) ++ end = true; ++ ++ if (virNetlinkGetErrorCode(msg, len) < 0) ++ goto cleanup; ++ ++ if (callback(msg, opaque) < 0) ++ goto cleanup; ++ } ++ } ++ ++ ret = 0; ++ ++ cleanup: ++ virNetlinkFree(nlhandle); ++ return ret; ++} ++ + /** + * virNetlinkDumpLink: + * +@@ -1061,6 +1107,18 @@ int virNetlinkCommand(struct nl_msg *nl_msg ATTRIBUTE_UNUSED, + return -1; + } + ++int ++virNetlinkDumpCommand(struct nl_msg *nl_msg ATTRIBUTE_UNUSED, ++ virNetlinkDumpCallback callback ATTRIBUTE_UNUSED, ++ uint32_t src_pid ATTRIBUTE_UNUSED, ++ uint32_t dst_pid ATTRIBUTE_UNUSED, ++ unsigned int protocol ATTRIBUTE_UNUSED, ++ unsigned int groups ATTRIBUTE_UNUSED, ++ void *opaque ATTRIBUTE_UNUSED) ++{ ++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); ++ return -1; ++} + + int + virNetlinkDumpLink(const char *ifname ATTRIBUTE_UNUSED, +diff --git a/src/util/virnetlink.h b/src/util/virnetlink.h +index 11e817c82..088b01343 100644 +--- a/src/util/virnetlink.h ++++ b/src/util/virnetlink.h +@@ -52,6 +52,15 @@ int virNetlinkCommand(struct nl_msg *nl_msg, + uint32_t src_pid, uint32_t dst_pid, + unsigned int protocol, unsigned int groups); + ++typedef int (*virNetlinkDumpCallback)(const struct nlmsghdr *resp, ++ void *data); ++ ++int virNetlinkDumpCommand(struct nl_msg *nl_msg, ++ virNetlinkDumpCallback callback, ++ uint32_t src_pid, uint32_t dst_pid, ++ unsigned int protocol, unsigned int groups, ++ void *opaque); ++ + typedef int (*virNetlinkDelLinkFallback)(const char *ifname); + + int virNetlinkDelLink(const char *ifname, virNetlinkDelLinkFallback fallback); +-- +2.12.0 + diff --git a/d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch b/d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch new file mode 100644 index 0000000..1a744cf --- /dev/null +++ b/d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch @@ -0,0 +1,165 @@ +From d68cb4f554d16c2af79f64749e18d7d6cd9dd5b9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= +Date: Fri, 3 Mar 2017 12:16:32 +0100 +Subject: [PATCH 1/5] util: extract the request sending code from + virNetlinkCommand() + +Allow to reuse as much as possible from virNetlinkCommand(). This +comment prepares for the introduction of virNetlinkDumpCommand() +only differing by how it handles the responses. +--- + src/util/virnetlink.c | 89 +++++++++++++++++++++++++++++++-------------------- + 1 file changed, 54 insertions(+), 35 deletions(-) + +diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c +index a5d10fa8e..be00351db 100644 +--- a/src/util/virnetlink.c ++++ b/src/util/virnetlink.c +@@ -209,61 +209,38 @@ virNetlinkCreateSocket(int protocol) + goto cleanup; + } + +- +-/** +- * virNetlinkCommand: +- * @nlmsg: pointer to netlink message +- * @respbuf: pointer to pointer where response buffer will be allocated +- * @respbuflen: pointer to integer holding the size of the response buffer +- * on return of the function. +- * @src_pid: the pid of the process to send a message +- * @dst_pid: the pid of the process to talk to, i.e., pid = 0 for kernel +- * @protocol: netlink protocol +- * @groups: the group identifier +- * +- * Send the given message to the netlink layer and receive response. +- * Returns 0 on success, -1 on error. In case of error, no response +- * buffer will be returned. +- */ +-int virNetlinkCommand(struct nl_msg *nl_msg, +- struct nlmsghdr **resp, unsigned int *respbuflen, +- uint32_t src_pid, uint32_t dst_pid, ++static virNetlinkHandle * ++virNetlinkSendRequest(struct nl_msg *nl_msg, uint32_t src_pid, ++ struct sockaddr_nl nladdr, + unsigned int protocol, unsigned int groups) + { +- int ret = -1; +- struct sockaddr_nl nladdr = { +- .nl_family = AF_NETLINK, +- .nl_pid = dst_pid, +- .nl_groups = 0, +- }; + ssize_t nbytes; +- struct pollfd fds[1]; + int fd; + int n; +- struct nlmsghdr *nlmsg = nlmsg_hdr(nl_msg); + virNetlinkHandle *nlhandle = NULL; +- int len = 0; ++ struct pollfd fds[1]; ++ struct nlmsghdr *nlmsg = nlmsg_hdr(nl_msg); + + if (protocol >= MAX_LINKS) { + virReportSystemError(EINVAL, + _("invalid protocol argument: %d"), protocol); +- goto cleanup; ++ goto error; + } + + if (!(nlhandle = virNetlinkCreateSocket(protocol))) +- goto cleanup; ++ goto error; + + fd = nl_socket_get_fd(nlhandle); + if (fd < 0) { + virReportSystemError(errno, + "%s", _("cannot get netlink socket fd")); +- goto cleanup; ++ goto error; + } + + if (groups && nl_socket_add_membership(nlhandle, groups) < 0) { + virReportSystemError(errno, + "%s", _("cannot add netlink membership")); +- goto cleanup; ++ goto error; + } + + nlmsg_set_dst(nl_msg, &nladdr); +@@ -274,10 +251,11 @@ int virNetlinkCommand(struct nl_msg *nl_msg, + if (nbytes < 0) { + virReportSystemError(errno, + "%s", _("cannot send to netlink socket")); +- goto cleanup; ++ goto error; + } + + memset(fds, 0, sizeof(fds)); ++ + fds[0].fd = fd; + fds[0].events = POLLIN; + +@@ -289,9 +267,51 @@ int virNetlinkCommand(struct nl_msg *nl_msg, + if (n == 0) + virReportSystemError(ETIMEDOUT, "%s", + _("no valid netlink response was received")); +- goto cleanup; + } + ++ return nlhandle; ++ ++ error: ++ virNetlinkFree(nlhandle); ++ return NULL; ++} ++ ++/** ++ * virNetlinkCommand: ++ * @nlmsg: pointer to netlink message ++ * @respbuf: pointer to pointer where response buffer will be allocated ++ * @respbuflen: pointer to integer holding the size of the response buffer ++ * on return of the function. ++ * @src_pid: the pid of the process to send a message ++ * @dst_pid: the pid of the process to talk to, i.e., pid = 0 for kernel ++ * @protocol: netlink protocol ++ * @groups: the group identifier ++ * ++ * Send the given message to the netlink layer and receive response. ++ * Returns 0 on success, -1 on error. In case of error, no response ++ * buffer will be returned. ++ */ ++int virNetlinkCommand(struct nl_msg *nl_msg, ++ struct nlmsghdr **resp, unsigned int *respbuflen, ++ uint32_t src_pid, uint32_t dst_pid, ++ unsigned int protocol, unsigned int groups) ++{ ++ int ret = -1; ++ struct sockaddr_nl nladdr = { ++ .nl_family = AF_NETLINK, ++ .nl_pid = dst_pid, ++ .nl_groups = 0, ++ }; ++ struct pollfd fds[1]; ++ virNetlinkHandle *nlhandle = NULL; ++ int len = 0; ++ ++ memset(fds, 0, sizeof(fds)); ++ ++ if (!(nlhandle = virNetlinkSendRequest(nl_msg, src_pid, nladdr, ++ protocol, groups))) ++ goto cleanup; ++ + len = nl_recv(nlhandle, &nladdr, (unsigned char **)resp, NULL); + if (len == 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", +@@ -315,7 +335,6 @@ int virNetlinkCommand(struct nl_msg *nl_msg, + return ret; + } + +- + /** + * virNetlinkDumpLink: + * +-- +2.12.0 + diff --git a/libvirt.changes b/libvirt.changes index c2a7f74..22e9543 100644 --- a/libvirt.changes +++ b/libvirt.changes @@ -1,3 +1,16 @@ +------------------------------------------------------------------- +Wed Mar 22 08:30:55 UTC 2017 - cbosdonnat@suse.com + +- Fail to start network instead of losing routes if IPv6 forwarding + is required. bsc#1025252 + Added patches: + 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch + 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch + 5dd607059-add-virNetDevGetName.patch + 754515b7d-add-virNetlinkDumpCommand.patch + d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch + + ------------------------------------------------------------------- Thu Mar 16 14:23:16 UTC 2017 - jfehlig@suse.com diff --git a/libvirt.spec b/libvirt.spec index 553152e..b7b90ca 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -1,7 +1,7 @@ # # spec file for package libvirt # -# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -319,6 +319,11 @@ Source100: %{name}-rpmlintrc # Upstream patches Patch0: 67dcb797-virTimeBackOffWait-sleepcap.patch Patch1: 85af0b80-qemu-adaptive-montimeout.patch +Patch2: d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch +Patch3: 754515b7d-add-virNetlinkDumpCommand.patch +Patch4: 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch +Patch5: 5dd607059-add-virNetDevGetName.patch +Patch6: 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch # Patches pending upstream review Patch100: libxl-dom-reset.patch Patch101: network-don-t-use-dhcp-authoritative-on-static-netwo.patch @@ -818,9 +823,9 @@ capabilities of recent versions of Linux (and other OSes). %package libs Summary: Client side libraries for libvirt +Group: Development/Libraries/C and C++ # So remote clients can access libvirt over SSH tunnel # (client invokes 'nc' against the UNIX socket on the server) -Group: Development/Libraries/C and C++ Requires: netcat-openbsd # Not technically required, but makes 'out-of-box' config # work correctly & doesn't have onerous dependencies @@ -888,6 +893,11 @@ libvirt plugin for NSS for translating domain names into IP addresses. %setup -q %patch0 -p1 %patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 %patch100 -p1 %patch101 -p1 %patch150 -p1 From f9c1123f5afdb704a7b0b7bd4f0b85b5a4d9e7561f6af47548ae20edbe378328 Mon Sep 17 00:00:00 2001 From: James Fehlig Date: Thu, 23 Mar 2017 15:03:20 +0000 Subject: [PATCH 2/3] Accepting request 482274 from home:jengelh:branches:Virtualization - RPM group fix OBS-URL: https://build.opensuse.org/request/show/482274 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=594 --- libvirt.changes | 5 +++++ libvirt.spec | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/libvirt.changes b/libvirt.changes index 22e9543..8fee441 100644 --- a/libvirt.changes +++ b/libvirt.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Thu Mar 23 14:42:07 UTC 2017 - jengelh@inai.de + +- RPM group fix + ------------------------------------------------------------------- Wed Mar 22 08:30:55 UTC 2017 - cbosdonnat@suse.com diff --git a/libvirt.spec b/libvirt.spec index b7b90ca..05b704a 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -1,7 +1,7 @@ # # spec file for package libvirt # -# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -367,7 +367,7 @@ to interact with Linux virtualization technologies. %package doc Summary: API reference and website documentation for libvirt -Group: Development/Libraries/C and C++ +Group: Documentation/HTML %description doc Includes the API reference for the libvirt C library, and a complete @@ -823,9 +823,9 @@ capabilities of recent versions of Linux (and other OSes). %package libs Summary: Client side libraries for libvirt -Group: Development/Libraries/C and C++ # So remote clients can access libvirt over SSH tunnel # (client invokes 'nc' against the UNIX socket on the server) +Group: Development/Libraries/C and C++ Requires: netcat-openbsd # Not technically required, but makes 'out-of-box' config # work correctly & doesn't have onerous dependencies From f39448844a516c0c7dbadab485697d6a2a74fbc0e08c3a5b5f3efb348ca144d3 Mon Sep 17 00:00:00 2001 From: James Fehlig Date: Mon, 3 Apr 2017 04:57:47 +0000 Subject: [PATCH 3/3] Accepting request 484775 from home:jfehlig:branches:Virtualization - Update to libvirt 3.2.0 - Many incremental improvements and bug fixes, see http://libvirt.org/news.html - Dropped patches: 67dcb797-virTimeBackOffWait-sleepcap.patch, 85af0b80-qemu-adaptive-montimeout.patch, d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch, 754515b7d-add-virNetlinkDumpCommand.patch, 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch, 5dd607059-add-virNetDevGetName.patch, 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch - Add Conflicts=xendomains.service to libvirtd service suse-libvirtd-service.patch bsc#1015348 OBS-URL: https://build.opensuse.org/request/show/484775 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=595 --- ...cept_ra-before-enabling-ipv6-forward.patch | 260 ------------------ 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch | 46 ---- 5dd607059-add-virNetDevGetName.patch | 70 ----- 67dcb797-virTimeBackOffWait-sleepcap.patch | 66 ----- 754515b7d-add-virNetlinkDumpCommand.patch | 125 --------- 85af0b80-qemu-adaptive-montimeout.patch | 171 ------------ apparmor-fixes.patch | 6 +- apparmor-no-mount.patch | 6 +- blockcopy-check-dst-identical-device.patch | 8 +- ...-request-sending-code-from-virNetlin.patch | 165 ----------- libvirt-3.1.0.tar.xz | 3 - libvirt-3.1.0.tar.xz.asc | 10 - libvirt-3.2.0.tar.xz | 3 + libvirt-3.2.0.tar.xz.asc | 10 + libvirt-guests-init-script.patch | 18 +- libvirt-power8-models.patch | 6 +- libvirt-suse-netcontrol.patch | 50 ++-- libvirt.changes | 18 ++ libvirt.spec | 18 +- libvirtd-defaults.patch | 18 +- libvirtd-init-script.patch | 6 +- libxl-dom-reset.patch | 6 +- libxl-qemu-emulator-caps.patch | 6 +- libxl-set-cach-mode.patch | 6 +- libxl-set-migration-constraints.patch | 50 ++-- libxl-support-block-script.patch | 6 +- lxc-wait-after-eth-del.patch | 58 ++-- ...e-dhcp-authoritative-on-static-netwo.patch | 14 +- ppc64le-canonical-name.patch | 6 +- qemu-apparmor-screenshot.patch | 6 +- support-managed-pci-xen-driver.patch | 12 +- suse-libvirtd-service.patch | 19 ++ suse-qemu-conf.patch | 12 +- systemd-service-xen.patch | 6 +- virtlockd-init-script.patch | 12 +- virtlogd-init-script.patch | 12 +- xen-pv-cdrom.patch | 6 +- xen-sxpr-disk-type.patch | 6 +- 38 files changed, 236 insertions(+), 1090 deletions(-) delete mode 100644 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch delete mode 100644 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch delete mode 100644 5dd607059-add-virNetDevGetName.patch delete mode 100644 67dcb797-virTimeBackOffWait-sleepcap.patch delete mode 100644 754515b7d-add-virNetlinkDumpCommand.patch delete mode 100644 85af0b80-qemu-adaptive-montimeout.patch delete mode 100644 d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch delete mode 100644 libvirt-3.1.0.tar.xz delete mode 100644 libvirt-3.1.0.tar.xz.asc create mode 100644 libvirt-3.2.0.tar.xz create mode 100644 libvirt-3.2.0.tar.xz.asc create mode 100644 suse-libvirtd-service.patch diff --git a/00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch b/00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch deleted file mode 100644 index cf408e4..0000000 --- a/00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch +++ /dev/null @@ -1,260 +0,0 @@ -From 00d28a78b5d1f6eaf79f06ac59e31c568af9da37 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= -Date: Fri, 3 Mar 2017 14:14:51 +0100 -Subject: [PATCH 5/5] network: check accept_ra before enabling ipv6 forwarding - -When enabling IPv6 on all interfaces, we may get the host Router -Advertisement routes discarded. To avoid this, the user needs to set -accept_ra to 2 for the interfaces with such routes. - -See https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt -on this topic. - -To avoid user mistakenly losing routes on their hosts, check -accept_ra values before enabling IPv6 forwarding. If a RA route is -detected, but neither the corresponding device nor global accept_ra -is set to 2, the network will fail to start. ---- - src/libvirt_private.syms | 1 + - src/network/bridge_driver.c | 16 +++-- - src/util/virnetdevip.c | 158 ++++++++++++++++++++++++++++++++++++++++++++ - src/util/virnetdevip.h | 1 + - 4 files changed, 171 insertions(+), 5 deletions(-) - -diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms -index 3b2cb83c4..57acfdbb1 100644 ---- a/src/libvirt_private.syms -+++ b/src/libvirt_private.syms -@@ -2067,6 +2067,7 @@ virNetDevBridgeSetVlanFiltering; - virNetDevIPAddrAdd; - virNetDevIPAddrDel; - virNetDevIPAddrGet; -+virNetDevIPCheckIPv6Forwarding; - virNetDevIPInfoAddToDev; - virNetDevIPInfoClear; - virNetDevIPRouteAdd; -diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c -index 4d1a44516..a753cd78b 100644 ---- a/src/network/bridge_driver.c -+++ b/src/network/bridge_driver.c -@@ -61,6 +61,7 @@ - #include "virlog.h" - #include "virdnsmasq.h" - #include "configmake.h" -+#include "virnetlink.h" - #include "virnetdev.h" - #include "virnetdevip.h" - #include "virnetdevbridge.h" -@@ -2389,11 +2390,16 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver, - } - - /* If forward.type != NONE, turn on global IP forwarding */ -- if (network->def->forward.type != VIR_NETWORK_FORWARD_NONE && -- networkEnableIPForwarding(v4present, v6present) < 0) { -- virReportSystemError(errno, "%s", -- _("failed to enable IP forwarding")); -- goto err3; -+ if (network->def->forward.type != VIR_NETWORK_FORWARD_NONE) { -+ if (!virNetDevIPCheckIPv6Forwarding()) -+ goto err3; /* Precise error message already provided */ -+ -+ -+ if (networkEnableIPForwarding(v4present, v6present) < 0) { -+ virReportSystemError(errno, "%s", -+ _("failed to enable IP forwarding")); -+ goto err3; -+ } - } - - -diff --git a/src/util/virnetdevip.c b/src/util/virnetdevip.c -index 42fbba1eb..a4d382427 100644 ---- a/src/util/virnetdevip.c -+++ b/src/util/virnetdevip.c -@@ -508,6 +508,158 @@ virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs, size_t count) - return ret; - } - -+static int -+virNetDevIPGetAcceptRA(const char *ifname) -+{ -+ char *path = NULL; -+ char *buf = NULL; -+ char *suffix; -+ int accept_ra = -1; -+ -+ if (virAsprintf(&path, "/proc/sys/net/ipv6/conf/%s/accept_ra", -+ ifname ? ifname : "all") < 0) -+ goto cleanup; -+ -+ if ((virFileReadAll(path, 512, &buf) < 0) || -+ (virStrToLong_i(buf, &suffix, 10, &accept_ra) < 0)) -+ goto cleanup; -+ -+ cleanup: -+ VIR_FREE(path); -+ VIR_FREE(buf); -+ -+ return accept_ra; -+} -+ -+struct virNetDevIPCheckIPv6ForwardingData { -+ bool hasRARoutes; -+ -+ /* Devices with conflicting accept_ra */ -+ char **devices; -+ size_t ndevices; -+}; -+ -+static int -+virNetDevIPCheckIPv6ForwardingCallback(const struct nlmsghdr *resp, -+ void *opaque) -+{ -+ struct rtmsg *rtmsg = NLMSG_DATA(resp); -+ int accept_ra = -1; -+ struct rtattr *rta; -+ char *ifname = NULL; -+ struct virNetDevIPCheckIPv6ForwardingData *data = opaque; -+ int ret = 0; -+ int len = RTM_PAYLOAD(resp); -+ int oif = -1; -+ -+ /* Ignore messages other than route ones */ -+ if (resp->nlmsg_type != RTM_NEWROUTE) -+ return ret; -+ -+ /* Extract a few attributes */ -+ for (rta = RTM_RTA(rtmsg); RTA_OK(rta, len); rta = RTA_NEXT(rta, len)) { -+ switch (rta->rta_type) { -+ case RTA_OIF: -+ oif = *(int *)RTA_DATA(rta); -+ -+ if (!(ifname = virNetDevGetName(oif))) -+ goto error; -+ break; -+ } -+ } -+ -+ /* No need to do anything else for non RA routes */ -+ if (rtmsg->rtm_protocol != RTPROT_RA) -+ goto cleanup; -+ -+ data->hasRARoutes = true; -+ -+ /* Check the accept_ra value for the interface */ -+ accept_ra = virNetDevIPGetAcceptRA(ifname); -+ VIR_DEBUG("Checking route for device %s, accept_ra: %d", ifname, accept_ra); -+ -+ if (accept_ra != 2 && VIR_APPEND_ELEMENT(data->devices, data->ndevices, ifname) < 0) -+ goto error; -+ -+ cleanup: -+ VIR_FREE(ifname); -+ return ret; -+ -+ error: -+ ret = -1; -+ goto cleanup; -+} -+ -+bool -+virNetDevIPCheckIPv6Forwarding(void) -+{ -+ struct nl_msg *nlmsg = NULL; -+ bool valid = false; -+ struct rtgenmsg genmsg; -+ size_t i; -+ struct virNetDevIPCheckIPv6ForwardingData data = { -+ .hasRARoutes = false, -+ .devices = NULL, -+ .ndevices = 0 -+ }; -+ -+ -+ /* Prepare the request message */ -+ if (!(nlmsg = nlmsg_alloc_simple(RTM_GETROUTE, -+ NLM_F_REQUEST | NLM_F_DUMP))) { -+ virReportOOMError(); -+ goto cleanup; -+ } -+ -+ memset(&genmsg, 0, sizeof(genmsg)); -+ genmsg.rtgen_family = AF_INET6; -+ -+ if (nlmsg_append(nlmsg, &genmsg, sizeof(genmsg), NLMSG_ALIGNTO) < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", -+ _("allocated netlink buffer is too small")); -+ goto cleanup; -+ } -+ -+ /* Send the request and loop over the responses */ -+ if (virNetlinkDumpCommand(nlmsg, virNetDevIPCheckIPv6ForwardingCallback, -+ 0, 0, NETLINK_ROUTE, 0, &data) < 0) { -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", -+ _("Failed to loop over IPv6 routes")); -+ goto cleanup; -+ } -+ -+ valid = !data.hasRARoutes || data.ndevices == 0; -+ -+ /* Check the global accept_ra if at least one isn't set on a -+ per-device basis */ -+ if (!valid && data.hasRARoutes) { -+ int accept_ra = virNetDevIPGetAcceptRA(NULL); -+ valid = accept_ra == 2; -+ VIR_DEBUG("Checked global accept_ra: %d", accept_ra); -+ } -+ -+ if (!valid) { -+ virBuffer buf = VIR_BUFFER_INITIALIZER; -+ for (i = 0; i < data.ndevices; i++) { -+ virBufferAdd(&buf, data.devices[i], -1); -+ if (i < data.ndevices - 1) -+ virBufferAddLit(&buf, ", "); -+ } -+ -+ virReportError(VIR_ERR_INTERNAL_ERROR, -+ _("Check the host setup: enabling IPv6 forwarding with " -+ "RA routes without accept_ra set to 2 is likely to cause " -+ "routes loss. Interfaces to look at: %s"), -+ virBufferCurrentContent(&buf)); -+ virBufferFreeAndReset(&buf); -+ } -+ -+ cleanup: -+ nlmsg_free(nlmsg); -+ for (i = 0; i < data.ndevices; i++) -+ VIR_FREE(data.devices[i]); -+ return valid; -+} - - #else /* defined(__linux__) && defined(HAVE_LIBNL) */ - -@@ -655,6 +807,12 @@ virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs ATTRIBUTE_UNUSED, - return -1; - } - -+bool -+virNetDevIPCheckIPv6Forwarding(void) -+{ -+ VIR_WARN("built without libnl: unable to check if IPv6 forwarding can be safely enabled"); -+ return true; -+} - - #endif /* defined(__linux__) && defined(HAVE_LIBNL) */ - -diff --git a/src/util/virnetdevip.h b/src/util/virnetdevip.h -index b7abdf94d..cc466ca25 100644 ---- a/src/util/virnetdevip.h -+++ b/src/util/virnetdevip.h -@@ -83,6 +83,7 @@ int virNetDevIPAddrGet(const char *ifname, virSocketAddrPtr addr) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; - int virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs, size_t count) - ATTRIBUTE_NONNULL(1); -+bool virNetDevIPCheckIPv6Forwarding(void); - - /* virNetDevIPRoute object */ - void virNetDevIPRouteFree(virNetDevIPRoutePtr def); --- -2.12.0 - diff --git a/3ee35d7d6-more-uses-of-SYSCTL_PATH.patch b/3ee35d7d6-more-uses-of-SYSCTL_PATH.patch deleted file mode 100644 index 3e6e739..0000000 --- a/3ee35d7d6-more-uses-of-SYSCTL_PATH.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 3ee35d7d6caf0ffa722d60251eabec43c094fb12 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= -Date: Fri, 3 Mar 2017 14:13:49 +0100 -Subject: [PATCH 3/5] bridge_driver.c: more uses of SYSCTL_PATH - -Replace a few occurences of /proc/sys by the corresponding macro -defined a few lines after: SYSCTL_PATH ---- - src/network/bridge_driver.c | 9 +++++---- - 1 file changed, 5 insertions(+), 4 deletions(-) - -diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c -index 32c5ab7a7..4d1a44516 100644 ---- a/src/network/bridge_driver.c -+++ b/src/network/bridge_driver.c -@@ -85,6 +85,8 @@ - */ - #define VIR_NETWORK_DHCP_LEASE_FILE_SIZE_MAX (32 * 1024 * 1024) - -+#define SYSCTL_PATH "/proc/sys" -+ - VIR_LOG_INIT("network.bridge_driver"); - - static virNetworkDriverStatePtr network_driver; -@@ -2092,15 +2094,14 @@ networkEnableIPForwarding(bool enableIPv4, bool enableIPv6) - &enabled, sizeof(enabled)); - #else - if (enableIPv4) -- ret = virFileWriteStr("/proc/sys/net/ipv4/ip_forward", "1\n", 0); -+ ret = virFileWriteStr(SYSCTL_PATH "/net/ipv4/ip_forward", "1\n", 0); - if (enableIPv6 && ret == 0) -- ret = virFileWriteStr("/proc/sys/net/ipv6/conf/all/forwarding", "1\n", 0); -+ ret = virFileWriteStr(SYSCTL_PATH "/net/ipv6/conf/all/forwarding", "1\n", 0); -+ - #endif - return ret; - } - --#define SYSCTL_PATH "/proc/sys" -- - static int - networkSetIPv6Sysctls(virNetworkObjPtr network) - { --- -2.12.0 - diff --git a/5dd607059-add-virNetDevGetName.patch b/5dd607059-add-virNetDevGetName.patch deleted file mode 100644 index 5a59dca..0000000 --- a/5dd607059-add-virNetDevGetName.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 5dd607059d8a98e04024305ae4afbd038aadbdcd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= -Date: Wed, 15 Mar 2017 14:46:56 +0100 -Subject: [PATCH 4/5] util: add virNetDevGetName() function - -Add a function getting the name of a network interface out of its index. ---- - src/libvirt_private.syms | 1 + - src/util/virnetdev.c | 19 +++++++++++++++++++ - src/util/virnetdev.h | 2 ++ - 3 files changed, 22 insertions(+) - -diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms -index f03925bc1..3b2cb83c4 100644 ---- a/src/libvirt_private.syms -+++ b/src/libvirt_private.syms -@@ -1995,6 +1995,7 @@ virNetDevGetIndex; - virNetDevGetLinkInfo; - virNetDevGetMAC; - virNetDevGetMTU; -+virNetDevGetName; - virNetDevGetOnline; - virNetDevGetPhysicalFunction; - virNetDevGetPromiscuous; -diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c -index d12324878..91a5274aa 100644 ---- a/src/util/virnetdev.c -+++ b/src/util/virnetdev.c -@@ -899,6 +899,25 @@ virNetDevGetRcvAllMulti(const char *ifname, - return virNetDevGetIFFlag(ifname, VIR_IFF_ALLMULTI, receive); - } - -+char *virNetDevGetName(int ifindex) -+{ -+ char name[IFNAMSIZ]; -+ char *ifname = NULL; -+ -+ memset(&name, 0, sizeof(name)); -+ -+ if (!if_indextoname(ifindex, name)) { -+ virReportSystemError(errno, -+ _("Failed to convert interface index %d to a name"), -+ ifindex); -+ goto cleanup; -+ } -+ -+ ignore_value(VIR_STRDUP(ifname, name)); -+ -+ cleanup: -+ return ifname; -+} - - /** - * virNetDevGetIndex: -diff --git a/src/util/virnetdev.h b/src/util/virnetdev.h -index 236cf83ef..01e9c5b95 100644 ---- a/src/util/virnetdev.h -+++ b/src/util/virnetdev.h -@@ -157,6 +157,8 @@ int virNetDevSetNamespace(const char *ifname, pid_t pidInNs) - int virNetDevSetName(const char *ifname, const char *newifname) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; - -+char *virNetDevGetName(int ifindex) -+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; - int virNetDevGetIndex(const char *ifname, int *ifindex) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK; - --- -2.12.0 - diff --git a/67dcb797-virTimeBackOffWait-sleepcap.patch b/67dcb797-virTimeBackOffWait-sleepcap.patch deleted file mode 100644 index 37a3ead..0000000 --- a/67dcb797-virTimeBackOffWait-sleepcap.patch +++ /dev/null @@ -1,66 +0,0 @@ -commit 67dcb797ed7f1fbb048aa47006576f424923933b -Author: Michal Privoznik -Date: Mon Mar 13 11:05:08 2017 +0100 - - virTimeBackOffWait: Avoid long periods of sleep - - While connecting to qemu monitor, the first thing we do is wait - for it to show up. However, we are doing it with some timeout to - avoid indefinite waits (e.g. when qemu doesn't create the monitor - socket at all). After beaa447a29 we are using exponential back - off timeout meaning, after the first connection attempt we wait - 1ms, then 2ms, then 4 and so on. This allows us to bring down - wait time for small domains where qemu initializes quickly. - However, on the other end of this scale are some domains with - huge amounts of guest memory. Now imagine that we've gotten up to - wait time of 15 seconds. The next one is going to be 30 seconds, - and the one after that whole minute. Well, okay - with current - code we are not going to wait longer than 30 seconds in total, - but this is going to change in the next commit. - - The exponential back off is usable only for first few iterations. - Then it needs to be caped (one second was chosen as the limit) - and switch to constant wait time. - - Signed-off-by: Michal Privoznik - -Index: libvirt-3.1.0/src/util/virtime.c -=================================================================== ---- libvirt-3.1.0.orig/src/util/virtime.c -+++ libvirt-3.1.0/src/util/virtime.c -@@ -390,6 +390,9 @@ virTimeBackOffStart(virTimeBackOffVar *v - return 0; - } - -+ -+#define VIR_TIME_BACKOFF_CAP 1000 -+ - /** - * virTimeBackOffWait - * @var: Timeout variable (with type virTimeBackOffVar *). -@@ -410,7 +413,9 @@ virTimeBackOffStart(virTimeBackOffVar *v - * The while loop that runs the body of the code repeatedly, with an - * exponential backoff. It first waits for first milliseconds, then - * runs the body, then waits for 2*first ms, then runs the body again. -- * Then 4*first ms, and so on. -+ * Then 4*first ms, and so on, up until wait time would reach -+ * VIR_TIME_BACK_OFF_CAP (whole second). Then it switches to constant -+ * waiting time of VIR_TIME_BACK_OFF_CAP. - * - * When timeout milliseconds is reached, the while loop ends. - * -@@ -429,8 +434,13 @@ virTimeBackOffWait(virTimeBackOffVar *va - if (t > var->limit_t) - return 0; /* ends the while loop */ - -+ /* Compute next wait time. Cap at VIR_TIME_BACKOFF_CAP -+ * to avoid long useless sleeps. */ - next = var->next; -- var->next *= 2; -+ if (var->next < VIR_TIME_BACKOFF_CAP) -+ var->next *= 2; -+ else if (var->next > VIR_TIME_BACKOFF_CAP) -+ var->next = VIR_TIME_BACKOFF_CAP; - - /* If sleeping would take us beyond the limit, then shorten the - * sleep. This is so we always run the body just before the final diff --git a/754515b7d-add-virNetlinkDumpCommand.patch b/754515b7d-add-virNetlinkDumpCommand.patch deleted file mode 100644 index 4b9002d..0000000 --- a/754515b7d-add-virNetlinkDumpCommand.patch +++ /dev/null @@ -1,125 +0,0 @@ -From 754515b7db6258ab592265b743128353be0cb32b Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= -Date: Fri, 3 Mar 2017 12:22:50 +0100 -Subject: [PATCH 2/5] util: add virNetlinkDumpCommand() - -virNetlinkCommand() processes only one response message, while some -netlink commands, like route dumping, need to process several. -Add virNetlinkDumpCommand() as a virNetlinkCommand() sister. ---- - src/libvirt_private.syms | 1 + - src/util/virnetlink.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ - src/util/virnetlink.h | 9 ++++++++ - 3 files changed, 68 insertions(+) - -diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms -index b46e85f63..f03925bc1 100644 ---- a/src/libvirt_private.syms -+++ b/src/libvirt_private.syms -@@ -2138,6 +2138,7 @@ virNetDevVPortProfileOpTypeToString; - # util/virnetlink.h - virNetlinkCommand; - virNetlinkDelLink; -+virNetlinkDumpCommand; - virNetlinkDumpLink; - virNetlinkEventAddClient; - virNetlinkEventRemoveClient; -diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c -index be00351db..9bc1f0f2b 100644 ---- a/src/util/virnetlink.c -+++ b/src/util/virnetlink.c -@@ -335,6 +335,52 @@ int virNetlinkCommand(struct nl_msg *nl_msg, - return ret; - } - -+int -+virNetlinkDumpCommand(struct nl_msg *nl_msg, -+ virNetlinkDumpCallback callback, -+ uint32_t src_pid, uint32_t dst_pid, -+ unsigned int protocol, unsigned int groups, -+ void *opaque) -+{ -+ int ret = -1; -+ bool end = false; -+ int len = 0; -+ struct nlmsghdr *resp = NULL; -+ struct nlmsghdr *msg = NULL; -+ -+ struct sockaddr_nl nladdr = { -+ .nl_family = AF_NETLINK, -+ .nl_pid = dst_pid, -+ .nl_groups = 0, -+ }; -+ virNetlinkHandle *nlhandle = NULL; -+ -+ if (!(nlhandle = virNetlinkSendRequest(nl_msg, src_pid, nladdr, -+ protocol, groups))) -+ goto cleanup; -+ -+ while (!end) { -+ len = nl_recv(nlhandle, &nladdr, (unsigned char **)&resp, NULL); -+ -+ for (msg = resp; NLMSG_OK(msg, len); msg = NLMSG_NEXT(msg, len)) { -+ if (msg->nlmsg_type == NLMSG_DONE) -+ end = true; -+ -+ if (virNetlinkGetErrorCode(msg, len) < 0) -+ goto cleanup; -+ -+ if (callback(msg, opaque) < 0) -+ goto cleanup; -+ } -+ } -+ -+ ret = 0; -+ -+ cleanup: -+ virNetlinkFree(nlhandle); -+ return ret; -+} -+ - /** - * virNetlinkDumpLink: - * -@@ -1061,6 +1107,18 @@ int virNetlinkCommand(struct nl_msg *nl_msg ATTRIBUTE_UNUSED, - return -1; - } - -+int -+virNetlinkDumpCommand(struct nl_msg *nl_msg ATTRIBUTE_UNUSED, -+ virNetlinkDumpCallback callback ATTRIBUTE_UNUSED, -+ uint32_t src_pid ATTRIBUTE_UNUSED, -+ uint32_t dst_pid ATTRIBUTE_UNUSED, -+ unsigned int protocol ATTRIBUTE_UNUSED, -+ unsigned int groups ATTRIBUTE_UNUSED, -+ void *opaque ATTRIBUTE_UNUSED) -+{ -+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _(unsupported)); -+ return -1; -+} - - int - virNetlinkDumpLink(const char *ifname ATTRIBUTE_UNUSED, -diff --git a/src/util/virnetlink.h b/src/util/virnetlink.h -index 11e817c82..088b01343 100644 ---- a/src/util/virnetlink.h -+++ b/src/util/virnetlink.h -@@ -52,6 +52,15 @@ int virNetlinkCommand(struct nl_msg *nl_msg, - uint32_t src_pid, uint32_t dst_pid, - unsigned int protocol, unsigned int groups); - -+typedef int (*virNetlinkDumpCallback)(const struct nlmsghdr *resp, -+ void *data); -+ -+int virNetlinkDumpCommand(struct nl_msg *nl_msg, -+ virNetlinkDumpCallback callback, -+ uint32_t src_pid, uint32_t dst_pid, -+ unsigned int protocol, unsigned int groups, -+ void *opaque); -+ - typedef int (*virNetlinkDelLinkFallback)(const char *ifname); - - int virNetlinkDelLink(const char *ifname, virNetlinkDelLinkFallback fallback); --- -2.12.0 - diff --git a/85af0b80-qemu-adaptive-montimeout.patch b/85af0b80-qemu-adaptive-montimeout.patch deleted file mode 100644 index c6ed37f..0000000 --- a/85af0b80-qemu-adaptive-montimeout.patch +++ /dev/null @@ -1,171 +0,0 @@ -commit 85af0b803cd19a03f71bd01ab4e045552410368f -Author: Michal Privoznik -Date: Sat Mar 11 07:23:42 2017 +0100 - - qemu: Adaptive timeout for connecting to monitor - - There were couple of reports on the list (e.g. [1]) that guests - with huge amounts of RAM are unable to start because libvirt - kills qemu in the initialization phase. The problem is that if - guest is configured to use hugepages kernel has to zero them all - out before handing over to qemu process. For instance, 402GiB - worth of 1GiB pages took around 105 seconds (~3.8GiB/s). Since we - do not want to make the timeout for connecting to monitor - configurable, we have to teach libvirt to count with this - fact. This commit implements "1s per each 1GiB of RAM" approach - as suggested here [2]. - - 1: https://www.redhat.com/archives/libvir-list/2017-March/msg00373.html - 2: https://www.redhat.com/archives/libvir-list/2017-March/msg00405.html - - Signed-off-by: Michal Privoznik - -Index: libvirt-3.1.0/src/qemu/qemu_capabilities.c -=================================================================== ---- libvirt-3.1.0.orig/src/qemu/qemu_capabilities.c -+++ libvirt-3.1.0/src/qemu/qemu_capabilities.c -@@ -4571,7 +4571,7 @@ virQEMUCapsInitQMPCommandRun(virQEMUCaps - cmd->vm->pid = cmd->pid; - - if (!(cmd->mon = qemuMonitorOpen(cmd->vm, &cmd->config, true, -- &callbacks, NULL))) -+ 0, &callbacks, NULL))) - goto ignore; - - virObjectLock(cmd->mon); -Index: libvirt-3.1.0/src/qemu/qemu_monitor.c -=================================================================== ---- libvirt-3.1.0.orig/src/qemu/qemu_monitor.c -+++ libvirt-3.1.0/src/qemu/qemu_monitor.c -@@ -327,11 +327,13 @@ qemuMonitorDispose(void *obj) - - - static int --qemuMonitorOpenUnix(const char *monitor, pid_t cpid) -+qemuMonitorOpenUnix(const char *monitor, -+ pid_t cpid, -+ unsigned long long timeout) - { - struct sockaddr_un addr; - int monfd; -- virTimeBackOffVar timeout; -+ virTimeBackOffVar timebackoff; - int ret = -1; - - if ((monfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { -@@ -348,9 +350,9 @@ qemuMonitorOpenUnix(const char *monitor, - goto error; - } - -- if (virTimeBackOffStart(&timeout, 1, 30*1000 /* ms */) < 0) -+ if (virTimeBackOffStart(&timebackoff, 1, timeout * 1000) < 0) - goto error; -- while (virTimeBackOffWait(&timeout)) { -+ while (virTimeBackOffWait(&timebackoff)) { - ret = connect(monfd, (struct sockaddr *) &addr, sizeof(addr)); - - if (ret == 0) -@@ -871,10 +873,30 @@ qemuMonitorOpenInternal(virDomainObjPtr - } - - -+#define QEMU_DEFAULT_MONITOR_WAIT 30 -+ -+/** -+ * qemuMonitorOpen: -+ * @vm: domain object -+ * @config: monitor configuration -+ * @json: enable JSON on the monitor -+ * @timeout: number of seconds to add to default timeout -+ * @cb: monitor event handles -+ * @opaque: opaque data for @cb -+ * -+ * Opens the monitor for running qemu. It may happen that it -+ * takes some time for qemu to create the monitor socket (e.g. -+ * because kernel is zeroing configured hugepages), therefore we -+ * wait up to default + timeout seconds for the monitor to show -+ * up after which a failure is claimed. -+ * -+ * Returns monitor object, NULL on error. -+ */ - qemuMonitorPtr - qemuMonitorOpen(virDomainObjPtr vm, - virDomainChrSourceDefPtr config, - bool json, -+ unsigned long long timeout, - qemuMonitorCallbacksPtr cb, - void *opaque) - { -@@ -882,10 +904,14 @@ qemuMonitorOpen(virDomainObjPtr vm, - bool hasSendFD = false; - qemuMonitorPtr ret; - -+ timeout += QEMU_DEFAULT_MONITOR_WAIT; -+ - switch (config->type) { - case VIR_DOMAIN_CHR_TYPE_UNIX: - hasSendFD = true; -- if ((fd = qemuMonitorOpenUnix(config->data.nix.path, vm ? vm->pid : 0)) < 0) -+ if ((fd = qemuMonitorOpenUnix(config->data.nix.path, -+ vm ? vm->pid : 0, -+ timeout)) < 0) - return NULL; - break; - -Index: libvirt-3.1.0/src/qemu/qemu_monitor.h -=================================================================== ---- libvirt-3.1.0.orig/src/qemu/qemu_monitor.h -+++ libvirt-3.1.0/src/qemu/qemu_monitor.h -@@ -246,6 +246,7 @@ char *qemuMonitorUnescapeArg(const char - qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, - virDomainChrSourceDefPtr config, - bool json, -+ unsigned long long timeout, - qemuMonitorCallbacksPtr cb, - void *opaque) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4); -Index: libvirt-3.1.0/src/qemu/qemu_process.c -=================================================================== ---- libvirt-3.1.0.orig/src/qemu/qemu_process.c -+++ libvirt-3.1.0/src/qemu/qemu_process.c -@@ -1656,6 +1656,7 @@ qemuConnectMonitor(virQEMUDriverPtr driv - qemuDomainObjPrivatePtr priv = vm->privateData; - int ret = -1; - qemuMonitorPtr mon = NULL; -+ unsigned long long timeout = 0; - - if (virSecurityManagerSetDaemonSocketLabel(driver->securityManager, - vm->def) < 0) { -@@ -1664,6 +1665,12 @@ qemuConnectMonitor(virQEMUDriverPtr driv - return -1; - } - -+ /* When using hugepages, kernel zeroes them out before -+ * handing them over to qemu. This can be very time -+ * consuming. Therefore, add a second to timeout for each -+ * 1GiB of guest RAM. */ -+ timeout = vm->def->mem.total_memory / (1024 * 1024); -+ - /* Hold an extra reference because we can't allow 'vm' to be - * deleted until the monitor gets its own reference. */ - virObjectRef(vm); -@@ -1674,6 +1681,7 @@ qemuConnectMonitor(virQEMUDriverPtr driv - mon = qemuMonitorOpen(vm, - priv->monConfig, - priv->monJSON, -+ timeout, - &monitorCallbacks, - driver); - -Index: libvirt-3.1.0/tests/qemumonitortestutils.c -=================================================================== ---- libvirt-3.1.0.orig/tests/qemumonitortestutils.c -+++ libvirt-3.1.0/tests/qemumonitortestutils.c -@@ -1175,6 +1175,7 @@ qemuMonitorTestNew(bool json, - if (!(test->mon = qemuMonitorOpen(test->vm, - &src, - json, -+ 0, - &qemuMonitorTestCallbacks, - driver))) - goto error; diff --git a/apparmor-fixes.patch b/apparmor-fixes.patch index 025822a..5ba094f 100644 --- a/apparmor-fixes.patch +++ b/apparmor-fixes.patch @@ -1,7 +1,7 @@ -Index: libvirt-3.1.0/examples/apparmor/libvirt-qemu +Index: libvirt-3.2.0/examples/apparmor/libvirt-qemu =================================================================== ---- libvirt-3.1.0.orig/examples/apparmor/libvirt-qemu -+++ libvirt-3.1.0/examples/apparmor/libvirt-qemu +--- libvirt-3.2.0.orig/examples/apparmor/libvirt-qemu ++++ libvirt-3.2.0/examples/apparmor/libvirt-qemu @@ -146,6 +146,9 @@ # for restore /{usr/,}bin/bash rmix, diff --git a/apparmor-no-mount.patch b/apparmor-no-mount.patch index 713376f..ef73088 100644 --- a/apparmor-no-mount.patch +++ b/apparmor-no-mount.patch @@ -1,7 +1,7 @@ -Index: libvirt-3.1.0/examples/apparmor/libvirt-lxc +Index: libvirt-3.2.0/examples/apparmor/libvirt-lxc =================================================================== ---- libvirt-3.1.0.orig/examples/apparmor/libvirt-lxc -+++ libvirt-3.1.0/examples/apparmor/libvirt-lxc +--- libvirt-3.2.0.orig/examples/apparmor/libvirt-lxc ++++ libvirt-3.2.0/examples/apparmor/libvirt-lxc @@ -2,39 +2,15 @@ #include diff --git a/blockcopy-check-dst-identical-device.patch b/blockcopy-check-dst-identical-device.patch index 823d93b..1862953 100644 --- a/blockcopy-check-dst-identical-device.patch +++ b/blockcopy-check-dst-identical-device.patch @@ -11,11 +11,11 @@ Signed-off-by: Chunyan Liu src/qemu/qemu_driver.c | 7 +++++++ 1 file changed, 7 insertions(+) -Index: libvirt-3.1.0/src/qemu/qemu_driver.c +Index: libvirt-3.2.0/src/qemu/qemu_driver.c =================================================================== ---- libvirt-3.1.0.orig/src/qemu/qemu_driver.c -+++ libvirt-3.1.0/src/qemu/qemu_driver.c -@@ -16523,6 +16523,15 @@ qemuDomainBlockCopyCommon(virDomainObjPt +--- libvirt-3.2.0.orig/src/qemu/qemu_driver.c ++++ libvirt-3.2.0/src/qemu/qemu_driver.c +@@ -16554,6 +16554,15 @@ qemuDomainBlockCopyCommon(virDomainObjPt _("non-file destination not supported yet")); goto endjob; } diff --git a/d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch b/d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch deleted file mode 100644 index 1a744cf..0000000 --- a/d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch +++ /dev/null @@ -1,165 +0,0 @@ -From d68cb4f554d16c2af79f64749e18d7d6cd9dd5b9 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?C=C3=A9dric=20Bosdonnat?= -Date: Fri, 3 Mar 2017 12:16:32 +0100 -Subject: [PATCH 1/5] util: extract the request sending code from - virNetlinkCommand() - -Allow to reuse as much as possible from virNetlinkCommand(). This -comment prepares for the introduction of virNetlinkDumpCommand() -only differing by how it handles the responses. ---- - src/util/virnetlink.c | 89 +++++++++++++++++++++++++++++++-------------------- - 1 file changed, 54 insertions(+), 35 deletions(-) - -diff --git a/src/util/virnetlink.c b/src/util/virnetlink.c -index a5d10fa8e..be00351db 100644 ---- a/src/util/virnetlink.c -+++ b/src/util/virnetlink.c -@@ -209,61 +209,38 @@ virNetlinkCreateSocket(int protocol) - goto cleanup; - } - -- --/** -- * virNetlinkCommand: -- * @nlmsg: pointer to netlink message -- * @respbuf: pointer to pointer where response buffer will be allocated -- * @respbuflen: pointer to integer holding the size of the response buffer -- * on return of the function. -- * @src_pid: the pid of the process to send a message -- * @dst_pid: the pid of the process to talk to, i.e., pid = 0 for kernel -- * @protocol: netlink protocol -- * @groups: the group identifier -- * -- * Send the given message to the netlink layer and receive response. -- * Returns 0 on success, -1 on error. In case of error, no response -- * buffer will be returned. -- */ --int virNetlinkCommand(struct nl_msg *nl_msg, -- struct nlmsghdr **resp, unsigned int *respbuflen, -- uint32_t src_pid, uint32_t dst_pid, -+static virNetlinkHandle * -+virNetlinkSendRequest(struct nl_msg *nl_msg, uint32_t src_pid, -+ struct sockaddr_nl nladdr, - unsigned int protocol, unsigned int groups) - { -- int ret = -1; -- struct sockaddr_nl nladdr = { -- .nl_family = AF_NETLINK, -- .nl_pid = dst_pid, -- .nl_groups = 0, -- }; - ssize_t nbytes; -- struct pollfd fds[1]; - int fd; - int n; -- struct nlmsghdr *nlmsg = nlmsg_hdr(nl_msg); - virNetlinkHandle *nlhandle = NULL; -- int len = 0; -+ struct pollfd fds[1]; -+ struct nlmsghdr *nlmsg = nlmsg_hdr(nl_msg); - - if (protocol >= MAX_LINKS) { - virReportSystemError(EINVAL, - _("invalid protocol argument: %d"), protocol); -- goto cleanup; -+ goto error; - } - - if (!(nlhandle = virNetlinkCreateSocket(protocol))) -- goto cleanup; -+ goto error; - - fd = nl_socket_get_fd(nlhandle); - if (fd < 0) { - virReportSystemError(errno, - "%s", _("cannot get netlink socket fd")); -- goto cleanup; -+ goto error; - } - - if (groups && nl_socket_add_membership(nlhandle, groups) < 0) { - virReportSystemError(errno, - "%s", _("cannot add netlink membership")); -- goto cleanup; -+ goto error; - } - - nlmsg_set_dst(nl_msg, &nladdr); -@@ -274,10 +251,11 @@ int virNetlinkCommand(struct nl_msg *nl_msg, - if (nbytes < 0) { - virReportSystemError(errno, - "%s", _("cannot send to netlink socket")); -- goto cleanup; -+ goto error; - } - - memset(fds, 0, sizeof(fds)); -+ - fds[0].fd = fd; - fds[0].events = POLLIN; - -@@ -289,9 +267,51 @@ int virNetlinkCommand(struct nl_msg *nl_msg, - if (n == 0) - virReportSystemError(ETIMEDOUT, "%s", - _("no valid netlink response was received")); -- goto cleanup; - } - -+ return nlhandle; -+ -+ error: -+ virNetlinkFree(nlhandle); -+ return NULL; -+} -+ -+/** -+ * virNetlinkCommand: -+ * @nlmsg: pointer to netlink message -+ * @respbuf: pointer to pointer where response buffer will be allocated -+ * @respbuflen: pointer to integer holding the size of the response buffer -+ * on return of the function. -+ * @src_pid: the pid of the process to send a message -+ * @dst_pid: the pid of the process to talk to, i.e., pid = 0 for kernel -+ * @protocol: netlink protocol -+ * @groups: the group identifier -+ * -+ * Send the given message to the netlink layer and receive response. -+ * Returns 0 on success, -1 on error. In case of error, no response -+ * buffer will be returned. -+ */ -+int virNetlinkCommand(struct nl_msg *nl_msg, -+ struct nlmsghdr **resp, unsigned int *respbuflen, -+ uint32_t src_pid, uint32_t dst_pid, -+ unsigned int protocol, unsigned int groups) -+{ -+ int ret = -1; -+ struct sockaddr_nl nladdr = { -+ .nl_family = AF_NETLINK, -+ .nl_pid = dst_pid, -+ .nl_groups = 0, -+ }; -+ struct pollfd fds[1]; -+ virNetlinkHandle *nlhandle = NULL; -+ int len = 0; -+ -+ memset(fds, 0, sizeof(fds)); -+ -+ if (!(nlhandle = virNetlinkSendRequest(nl_msg, src_pid, nladdr, -+ protocol, groups))) -+ goto cleanup; -+ - len = nl_recv(nlhandle, &nladdr, (unsigned char **)resp, NULL); - if (len == 0) { - virReportError(VIR_ERR_INTERNAL_ERROR, "%s", -@@ -315,7 +335,6 @@ int virNetlinkCommand(struct nl_msg *nl_msg, - return ret; - } - -- - /** - * virNetlinkDumpLink: - * --- -2.12.0 - diff --git a/libvirt-3.1.0.tar.xz b/libvirt-3.1.0.tar.xz deleted file mode 100644 index 7eab50f..0000000 --- a/libvirt-3.1.0.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7879029a0fcac4e58dbeec66f0bc77771565c4b6667212c8f6251eefb03732a9 -size 13906204 diff --git a/libvirt-3.1.0.tar.xz.asc b/libvirt-3.1.0.tar.xz.asc deleted file mode 100644 index 84e9923..0000000 --- a/libvirt-3.1.0.tar.xz.asc +++ /dev/null @@ -1,10 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQEcBAABAgAGBQJYuUErAAoJEBVYiyZZa+pdWBkIAKVc+m0tbSTxBgszQCarG/f6 -cde4qCXZOVTpyIQFAtJajV/yhqM4uMhDOAZOGvxRWWIIGAXfPI5EAcsKGajIgAdX -GWkzMc1a3JMzsXSveSUXboXvnfEilHquVVN+Hm2U9Y2eWy+daGCyl8j9+jyKRmzo -sXzajagqNP/WrQTxoeIKbIaNlNoM/YmnySHNq/jjkWUYFFhK2dTz/qqfLCqrcygD -iOARRi6QLQ2zbRiIOqf/tz2MNEPdgj6o31i2FT+pqLzIOTAhKXBXHD3V6TlSlRdY -kwJWcIm8tjMqJ0UuJNRDvO1jQ9m4sbpLqRdL0HCaYHz5Pa1n04n/hzsCLIuePoY= -=WTde ------END PGP SIGNATURE----- diff --git a/libvirt-3.2.0.tar.xz b/libvirt-3.2.0.tar.xz new file mode 100644 index 0000000..4438c8c --- /dev/null +++ b/libvirt-3.2.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9481a083b567a07927f239553dd70b5c0d1bff5b9b4ec61be1899981c646209e +size 14057340 diff --git a/libvirt-3.2.0.tar.xz.asc b/libvirt-3.2.0.tar.xz.asc new file mode 100644 index 0000000..e95fe32 --- /dev/null +++ b/libvirt-3.2.0.tar.xz.asc @@ -0,0 +1,10 @@ +-----BEGIN PGP SIGNATURE----- + +iQEcBAABAgAGBQJY4RMFAAoJEBVYiyZZa+pdScUIAMgcsw1t17IsF5VAjBRzz5bI +a5XzJR5WFoziYHE+7M1N0brnh+h7c1AL3kYCz9+k611ql3QHVQs8lkt7tT8GTLLb +FtiGrGREHUNy9xDGE1D32RhlrlNnruYLrkqBTc71dR3SQM2ePNfPAKVCYtZyWw7z +vxKFRAz2R5uQ6XzW7Qo7OJONh9+3ufpHg/gTDR8gOxcQWnW8xUb440qNyrLXIE3F +6TgAbdbCRarwCOb1aE5omp+0AFcnhnkXVChC9gugxvLaqM51A2Ppl5gmEa5J3gqU +kUw7NlmzBrGldlG1RIlcPWS3lPRMm/lQkuvU1SYyJQVaYRVA25VcabyfnDdDUSY= +=zFsI +-----END PGP SIGNATURE----- diff --git a/libvirt-guests-init-script.patch b/libvirt-guests-init-script.patch index d48ad5f..4ba9c45 100644 --- a/libvirt-guests-init-script.patch +++ b/libvirt-guests-init-script.patch @@ -1,9 +1,9 @@ Adjust libvirt-guests init files to conform to SUSE standards -Index: libvirt-3.1.0/tools/libvirt-guests.init.in +Index: libvirt-3.2.0/tools/libvirt-guests.init.in =================================================================== ---- libvirt-3.1.0.orig/tools/libvirt-guests.init.in -+++ libvirt-3.1.0/tools/libvirt-guests.init.in +--- libvirt-3.2.0.orig/tools/libvirt-guests.init.in ++++ libvirt-3.2.0/tools/libvirt-guests.init.in @@ -4,27 +4,27 @@ # http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html # @@ -45,10 +45,10 @@ Index: libvirt-3.1.0/tools/libvirt-guests.init.in # exec @libexecdir@/libvirt-guests.sh "$@" -Index: libvirt-3.1.0/tools/libvirt-guests.sh.in +Index: libvirt-3.2.0/tools/libvirt-guests.sh.in =================================================================== ---- libvirt-3.1.0.orig/tools/libvirt-guests.sh.in -+++ libvirt-3.1.0/tools/libvirt-guests.sh.in +--- libvirt-3.2.0.orig/tools/libvirt-guests.sh.in ++++ libvirt-3.2.0/tools/libvirt-guests.sh.in @@ -16,14 +16,13 @@ # License along with this library. If not, see # . @@ -208,10 +208,10 @@ Index: libvirt-3.1.0/tools/libvirt-guests.sh.in esac -exit $RETVAL +rc_exit -Index: libvirt-3.1.0/tools/libvirt-guests.sysconf +Index: libvirt-3.2.0/tools/libvirt-guests.sysconf =================================================================== ---- libvirt-3.1.0.orig/tools/libvirt-guests.sysconf -+++ libvirt-3.1.0/tools/libvirt-guests.sysconf +--- libvirt-3.2.0.orig/tools/libvirt-guests.sysconf ++++ libvirt-3.2.0/tools/libvirt-guests.sysconf @@ -1,19 +1,29 @@ +## Path: System/Virtualization/libvirt-guests + diff --git a/libvirt-power8-models.patch b/libvirt-power8-models.patch index dda322c..fbc75dc 100644 --- a/libvirt-power8-models.patch +++ b/libvirt-power8-models.patch @@ -2,10 +2,10 @@ Add POWER8 v2.0 and v2.1 to cpu map XML From: -Index: libvirt-3.1.0/src/cpu/cpu_map.xml +Index: libvirt-3.2.0/src/cpu/cpu_map.xml =================================================================== ---- libvirt-3.1.0.orig/src/cpu/cpu_map.xml -+++ libvirt-3.1.0/src/cpu/cpu_map.xml +--- libvirt-3.2.0.orig/src/cpu/cpu_map.xml ++++ libvirt-3.2.0/src/cpu/cpu_map.xml @@ -1569,6 +1569,8 @@ diff --git a/libvirt-suse-netcontrol.patch b/libvirt-suse-netcontrol.patch index 5dc591b..bebe9a9 100644 --- a/libvirt-suse-netcontrol.patch +++ b/libvirt-suse-netcontrol.patch @@ -1,8 +1,8 @@ -Index: libvirt-3.1.0/configure.ac +Index: libvirt-3.2.0/configure.ac =================================================================== ---- libvirt-3.1.0.orig/configure.ac -+++ libvirt-3.1.0/configure.ac -@@ -255,6 +255,7 @@ LIBVIRT_ARG_LIBSSH +--- libvirt-3.2.0.orig/configure.ac ++++ libvirt-3.2.0/configure.ac +@@ -256,6 +256,7 @@ LIBVIRT_ARG_LIBSSH LIBVIRT_ARG_LIBXML LIBVIRT_ARG_MACVTAP LIBVIRT_ARG_NETCF @@ -10,7 +10,7 @@ Index: libvirt-3.1.0/configure.ac LIBVIRT_ARG_NSS LIBVIRT_ARG_NUMACTL LIBVIRT_ARG_OPENWSMAN -@@ -295,6 +296,7 @@ LIBVIRT_CHECK_LIBSSH +@@ -296,6 +297,7 @@ LIBVIRT_CHECK_LIBSSH LIBVIRT_CHECK_LIBXML LIBVIRT_CHECK_MACVTAP LIBVIRT_CHECK_NETCF @@ -18,7 +18,7 @@ Index: libvirt-3.1.0/configure.ac LIBVIRT_CHECK_NUMACTL LIBVIRT_CHECK_NWFILTER LIBVIRT_CHECK_OPENWSMAN -@@ -966,6 +968,7 @@ LIBVIRT_RESULT_LIBXL +@@ -968,6 +970,7 @@ LIBVIRT_RESULT_LIBXL LIBVIRT_RESULT_LIBXML LIBVIRT_RESULT_MACVTAP LIBVIRT_RESULT_NETCF @@ -26,11 +26,11 @@ Index: libvirt-3.1.0/configure.ac LIBVIRT_RESULT_NSS LIBVIRT_RESULT_NUMACTL LIBVIRT_RESULT_OPENWSMAN -Index: libvirt-3.1.0/src/Makefile.am +Index: libvirt-3.2.0/src/Makefile.am =================================================================== ---- libvirt-3.1.0.orig/src/Makefile.am -+++ libvirt-3.1.0/src/Makefile.am -@@ -959,6 +959,10 @@ if WITH_NETCF +--- libvirt-3.2.0.orig/src/Makefile.am ++++ libvirt-3.2.0/src/Makefile.am +@@ -969,6 +969,10 @@ if WITH_NETCF INTERFACE_DRIVER_SOURCES += \ interface/interface_backend_netcf.c endif WITH_NETCF @@ -41,7 +41,7 @@ Index: libvirt-3.1.0/src/Makefile.am if WITH_UDEV INTERFACE_DRIVER_SOURCES += \ interface/interface_backend_udev.c -@@ -1620,6 +1624,10 @@ if WITH_NETCF +@@ -1637,6 +1641,10 @@ if WITH_NETCF libvirt_driver_interface_la_CFLAGS += $(NETCF_CFLAGS) libvirt_driver_interface_la_LIBADD += $(NETCF_LIBS) endif WITH_NETCF @@ -52,10 +52,10 @@ Index: libvirt-3.1.0/src/Makefile.am if WITH_UDEV libvirt_driver_interface_la_CFLAGS += $(UDEV_CFLAGS) libvirt_driver_interface_la_LIBADD += $(UDEV_LIBS) -Index: libvirt-3.1.0/tools/virsh.c +Index: libvirt-3.2.0/tools/virsh.c =================================================================== ---- libvirt-3.1.0.orig/tools/virsh.c -+++ libvirt-3.1.0/tools/virsh.c +--- libvirt-3.2.0.orig/tools/virsh.c ++++ libvirt-3.2.0/tools/virsh.c @@ -602,6 +602,8 @@ virshShowVersion(vshControl *ctl ATTRIBU vshPrint(ctl, " Interface"); # if defined(WITH_NETCF) @@ -65,10 +65,10 @@ Index: libvirt-3.1.0/tools/virsh.c # elif defined(WITH_UDEV) vshPrint(ctl, " udev"); # endif -Index: libvirt-3.1.0/src/interface/interface_backend_netcf.c +Index: libvirt-3.2.0/src/interface/interface_backend_netcf.c =================================================================== ---- libvirt-3.1.0.orig/src/interface/interface_backend_netcf.c -+++ libvirt-3.1.0/src/interface/interface_backend_netcf.c +--- libvirt-3.2.0.orig/src/interface/interface_backend_netcf.c ++++ libvirt-3.2.0/src/interface/interface_backend_netcf.c @@ -23,7 +23,12 @@ #include @@ -83,7 +83,7 @@ Index: libvirt-3.1.0/src/interface/interface_backend_netcf.c #include "virerror.h" #include "datatypes.h" -@@ -65,6 +70,37 @@ VIR_ONCE_GLOBAL_INIT(virNetcfDriverState +@@ -66,6 +71,37 @@ VIR_ONCE_GLOBAL_INIT(virNetcfDriverState static virNetcfDriverStatePtr driver; @@ -121,7 +121,7 @@ Index: libvirt-3.1.0/src/interface/interface_backend_netcf.c static void virNetcfDriverStateDispose(void *obj) -@@ -87,6 +123,10 @@ netcfStateInitialize(bool privileged ATT +@@ -88,6 +124,10 @@ netcfStateInitialize(bool privileged ATT if (!(driver = virObjectLockableNew(virNetcfDriverStateClass))) return -1; @@ -132,7 +132,7 @@ Index: libvirt-3.1.0/src/interface/interface_backend_netcf.c /* open netcf */ if (ncf_init(&driver->netcf, NULL) != 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", -@@ -1140,6 +1180,19 @@ static virStateDriver interfaceStateDriv +@@ -1141,6 +1181,19 @@ static virStateDriver interfaceStateDriv int netcfIfaceRegister(void) { @@ -152,10 +152,10 @@ Index: libvirt-3.1.0/src/interface/interface_backend_netcf.c if (virSetSharedInterfaceDriver(&interfaceDriver) < 0) return -1; if (virRegisterStateDriver(&interfaceStateDriver) < 0) -Index: libvirt-3.1.0/src/interface/interface_driver.c +Index: libvirt-3.2.0/src/interface/interface_driver.c =================================================================== ---- libvirt-3.1.0.orig/src/interface/interface_driver.c -+++ libvirt-3.1.0/src/interface/interface_driver.c +--- libvirt-3.2.0.orig/src/interface/interface_driver.c ++++ libvirt-3.2.0/src/interface/interface_driver.c @@ -30,8 +30,15 @@ interfaceRegister(void) if (netcfIfaceRegister() == 0) return 0; @@ -173,10 +173,10 @@ Index: libvirt-3.1.0/src/interface/interface_driver.c if (udevIfaceRegister() == 0) return 0; #endif /* WITH_UDEV */ -Index: libvirt-3.1.0/m4/virt-netcontrol.m4 +Index: libvirt-3.2.0/m4/virt-netcontrol.m4 =================================================================== --- /dev/null -+++ libvirt-3.1.0/m4/virt-netcontrol.m4 ++++ libvirt-3.2.0/m4/virt-netcontrol.m4 @@ -0,0 +1,39 @@ +dnl The libnetcontrol library +dnl diff --git a/libvirt.changes b/libvirt.changes index 8fee441..4a12c7f 100644 --- a/libvirt.changes +++ b/libvirt.changes @@ -1,3 +1,21 @@ +------------------------------------------------------------------- +Mon Apr 3 04:40:57 UTC 2017 - jfehlig@suse.com + +- Update to libvirt 3.2.0 + - Many incremental improvements and bug fixes, see + http://libvirt.org/news.html + - Dropped patches: + 67dcb797-virTimeBackOffWait-sleepcap.patch, + 85af0b80-qemu-adaptive-montimeout.patch, + d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch, + 754515b7d-add-virNetlinkDumpCommand.patch, + 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch, + 5dd607059-add-virNetDevGetName.patch, + 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch +- Add Conflicts=xendomains.service to libvirtd service + suse-libvirtd-service.patch + bsc#1015348 + ------------------------------------------------------------------- Thu Mar 23 14:42:07 UTC 2017 - jengelh@inai.de diff --git a/libvirt.spec b/libvirt.spec index 05b704a..fa9aad1 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -175,7 +175,7 @@ Name: libvirt Url: http://libvirt.org/ -Version: 3.1.0 +Version: 3.2.0 Release: 0 Summary: Library providing a simple virtualization API License: LGPL-2.1+ @@ -317,13 +317,6 @@ Source4: libvirtd-relocation-server.fw Source99: baselibs.conf Source100: %{name}-rpmlintrc # Upstream patches -Patch0: 67dcb797-virTimeBackOffWait-sleepcap.patch -Patch1: 85af0b80-qemu-adaptive-montimeout.patch -Patch2: d68cb4f55-extract-the-request-sending-code-from-virNetlin.patch -Patch3: 754515b7d-add-virNetlinkDumpCommand.patch -Patch4: 3ee35d7d6-more-uses-of-SYSCTL_PATH.patch -Patch5: 5dd607059-add-virNetDevGetName.patch -Patch6: 00d28a78b-check-accept_ra-before-enabling-ipv6-forward.patch # Patches pending upstream review Patch100: libxl-dom-reset.patch Patch101: network-don-t-use-dhcp-authoritative-on-static-netwo.patch @@ -351,6 +344,7 @@ Patch211: qemu-apparmor-screenshot.patch Patch212: libvirt-suse-netcontrol.patch Patch213: lxc-wait-after-eth-del.patch Patch214: libxl-qemu-emulator-caps.patch +Patch215: suse-libvirtd-service.patch # SLES-Only patches %if %{with_sle_build} Patch400: virt-create-rootfs.patch @@ -891,13 +885,6 @@ libvirt plugin for NSS for translating domain names into IP addresses. %prep %setup -q -%patch0 -p1 -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 %patch100 -p1 %patch101 -p1 %patch150 -p1 @@ -922,6 +909,7 @@ libvirt plugin for NSS for translating domain names into IP addresses. %patch212 -p1 %patch213 -p1 %patch214 -p1 +%patch215 -p1 %if %{with_sle_build} %patch400 -p1 %endif diff --git a/libvirtd-defaults.patch b/libvirtd-defaults.patch index ff6b086..d7133f2 100644 --- a/libvirtd-defaults.patch +++ b/libvirtd-defaults.patch @@ -1,7 +1,7 @@ -Index: libvirt-3.1.0/daemon/libvirtd.conf +Index: libvirt-3.2.0/daemon/libvirtd.conf =================================================================== ---- libvirt-3.1.0.orig/daemon/libvirtd.conf -+++ libvirt-3.1.0/daemon/libvirtd.conf +--- libvirt-3.2.0.orig/daemon/libvirtd.conf ++++ libvirt-3.2.0/daemon/libvirtd.conf @@ -18,8 +18,8 @@ # It is necessary to setup a CA and issue server certificates before # using this capability. @@ -13,10 +13,10 @@ Index: libvirt-3.1.0/daemon/libvirtd.conf # Listen for unencrypted TCP connections on the public TCP/IP port. # NB, must pass the --listen flag to the libvirtd process for this to -Index: libvirt-3.1.0/daemon/libvirtd-config.c +Index: libvirt-3.2.0/daemon/libvirtd-config.c =================================================================== ---- libvirt-3.1.0.orig/daemon/libvirtd-config.c -+++ libvirt-3.1.0/daemon/libvirtd-config.c +--- libvirt-3.2.0.orig/daemon/libvirtd-config.c ++++ libvirt-3.2.0/daemon/libvirtd-config.c @@ -110,7 +110,7 @@ daemonConfigNew(bool privileged ATTRIBUT if (VIR_ALLOC(data) < 0) return NULL; @@ -26,10 +26,10 @@ Index: libvirt-3.1.0/daemon/libvirtd-config.c data->listen_tcp = 0; if (VIR_STRDUP(data->tls_port, LIBVIRTD_TLS_PORT) < 0 || -Index: libvirt-3.1.0/daemon/test_libvirtd.aug.in +Index: libvirt-3.2.0/daemon/test_libvirtd.aug.in =================================================================== ---- libvirt-3.1.0.orig/daemon/test_libvirtd.aug.in -+++ libvirt-3.1.0/daemon/test_libvirtd.aug.in +--- libvirt-3.2.0.orig/daemon/test_libvirtd.aug.in ++++ libvirt-3.2.0/daemon/test_libvirtd.aug.in @@ -2,7 +2,7 @@ module Test_libvirtd = ::CONFIG:: diff --git a/libvirtd-init-script.patch b/libvirtd-init-script.patch index ae7c8cb..c9c0b3c 100644 --- a/libvirtd-init-script.patch +++ b/libvirtd-init-script.patch @@ -1,9 +1,9 @@ Adjust libvirtd sysconfig file to conform to SUSE standards -Index: libvirt-3.1.0/daemon/libvirtd.sysconf +Index: libvirt-3.2.0/daemon/libvirtd.sysconf =================================================================== ---- libvirt-3.1.0.orig/daemon/libvirtd.sysconf -+++ libvirt-3.1.0/daemon/libvirtd.sysconf +--- libvirt-3.2.0.orig/daemon/libvirtd.sysconf ++++ libvirt-3.2.0/daemon/libvirtd.sysconf @@ -1,16 +1,25 @@ +## Path: System/Virtualization/libvirt + diff --git a/libxl-dom-reset.patch b/libxl-dom-reset.patch index 00955ef..4df93a0 100644 --- a/libxl-dom-reset.patch +++ b/libxl-dom-reset.patch @@ -8,10 +8,10 @@ Date: Mon Jun 23 15:51:20 2014 -0600 option, but domainReset can be implemented in the libxl driver by forcibly destroying the domain and starting it again. -Index: libvirt-3.1.0/src/libxl/libxl_driver.c +Index: libvirt-3.2.0/src/libxl/libxl_driver.c =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_driver.c -+++ libvirt-3.1.0/src/libxl/libxl_driver.c +--- libvirt-3.2.0.orig/src/libxl/libxl_driver.c ++++ libvirt-3.2.0/src/libxl/libxl_driver.c @@ -1389,6 +1389,61 @@ libxlDomainReboot(virDomainPtr dom, unsi } diff --git a/libxl-qemu-emulator-caps.patch b/libxl-qemu-emulator-caps.patch index a434c8a..a829953 100644 --- a/libxl-qemu-emulator-caps.patch +++ b/libxl-qemu-emulator-caps.patch @@ -8,10 +8,10 @@ as the default , instead of the qemu-xen one. See FATE#320638 for details. -Index: libvirt-3.1.0/src/libxl/libxl_capabilities.c +Index: libvirt-3.2.0/src/libxl/libxl_capabilities.c =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_capabilities.c -+++ libvirt-3.1.0/src/libxl/libxl_capabilities.c +--- libvirt-3.2.0.orig/src/libxl/libxl_capabilities.c ++++ libvirt-3.2.0/src/libxl/libxl_capabilities.c @@ -38,6 +38,7 @@ #include "libxl_capabilities.h" #include "cpu/cpu_x86.h" diff --git a/libxl-set-cach-mode.patch b/libxl-set-cach-mode.patch index 489f853..26b5a58 100644 --- a/libxl-set-cach-mode.patch +++ b/libxl-set-cach-mode.patch @@ -3,10 +3,10 @@ https://bugzilla.novell.com/show_bug.cgi?id=879425 src/libxl/libxl_conf.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) -Index: libvirt-3.1.0/src/libxl/libxl_conf.c +Index: libvirt-3.2.0/src/libxl/libxl_conf.c =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_conf.c -+++ libvirt-3.1.0/src/libxl/libxl_conf.c +--- libvirt-3.2.0.orig/src/libxl/libxl_conf.c ++++ libvirt-3.2.0/src/libxl/libxl_conf.c @@ -609,6 +609,30 @@ libxlDiskSetDiscard(libxl_device_disk *x #endif } diff --git a/libxl-set-migration-constraints.patch b/libxl-set-migration-constraints.patch index acc736f..9d568db 100644 --- a/libxl-set-migration-constraints.patch +++ b/libxl-set-migration-constraints.patch @@ -16,11 +16,11 @@ Signed-off-by: Jim Fehlig tools/virsh.pod | 8 ++++++++ 6 files changed, 125 insertions(+), 6 deletions(-) -Index: libvirt-3.1.0/include/libvirt/libvirt-domain.h +Index: libvirt-3.2.0/include/libvirt/libvirt-domain.h =================================================================== ---- libvirt-3.1.0.orig/include/libvirt/libvirt-domain.h -+++ libvirt-3.1.0/include/libvirt/libvirt-domain.h -@@ -1000,6 +1000,31 @@ typedef enum { +--- libvirt-3.2.0.orig/include/libvirt/libvirt-domain.h ++++ libvirt-3.2.0/include/libvirt/libvirt-domain.h +@@ -1008,6 +1008,31 @@ typedef enum { */ # define VIR_MIGRATE_PARAM_AUTO_CONVERGE_INCREMENT "auto_converge.increment" @@ -52,10 +52,10 @@ Index: libvirt-3.1.0/include/libvirt/libvirt-domain.h /* Domain migration. */ virDomainPtr virDomainMigrate (virDomainPtr domain, virConnectPtr dconn, unsigned long flags, const char *dname, -Index: libvirt-3.1.0/src/libxl/libxl_driver.c +Index: libvirt-3.2.0/src/libxl/libxl_driver.c =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_driver.c -+++ libvirt-3.1.0/src/libxl/libxl_driver.c +--- libvirt-3.2.0.orig/src/libxl/libxl_driver.c ++++ libvirt-3.2.0/src/libxl/libxl_driver.c @@ -6115,6 +6115,9 @@ libxlDomainMigratePerform3Params(virDoma const char *dname = NULL; const char *uri = NULL; @@ -99,10 +99,10 @@ Index: libvirt-3.1.0/src/libxl/libxl_driver.c goto cleanup; } -Index: libvirt-3.1.0/src/libxl/libxl_migration.c +Index: libvirt-3.2.0/src/libxl/libxl_migration.c =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_migration.c -+++ libvirt-3.1.0/src/libxl/libxl_migration.c +--- libvirt-3.2.0.orig/src/libxl/libxl_migration.c ++++ libvirt-3.2.0/src/libxl/libxl_migration.c @@ -359,18 +359,39 @@ libxlMigrateReceive(virNetSocketPtr sock static int libxlDoMigrateSend(libxlDriverPrivatePtr driver, @@ -263,10 +263,10 @@ Index: libvirt-3.1.0/src/libxl/libxl_migration.c virObjectLock(vm); cleanup: -Index: libvirt-3.1.0/src/libxl/libxl_migration.h +Index: libvirt-3.2.0/src/libxl/libxl_migration.h =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_migration.h -+++ libvirt-3.1.0/src/libxl/libxl_migration.h +--- libvirt-3.2.0.orig/src/libxl/libxl_migration.h ++++ libvirt-3.2.0/src/libxl/libxl_migration.h @@ -39,6 +39,10 @@ VIR_MIGRATE_PARAM_URI, VIR_TYPED_PARAM_STRING, \ VIR_MIGRATE_PARAM_DEST_NAME, VIR_TYPED_PARAM_STRING, \ @@ -311,13 +311,13 @@ Index: libvirt-3.1.0/src/libxl/libxl_migration.h virDomainPtr libxlDomainMigrationFinish(virConnectPtr dconn, -Index: libvirt-3.1.0/tools/virsh-domain.c +Index: libvirt-3.2.0/tools/virsh-domain.c =================================================================== ---- libvirt-3.1.0.orig/tools/virsh-domain.c -+++ libvirt-3.1.0/tools/virsh-domain.c -@@ -10222,6 +10222,22 @@ static const vshCmdOptDef opts_migrate[] - .type = VSH_OT_STRING, - .help = N_("filename containing updated persistent XML for the target") +--- libvirt-3.2.0.orig/tools/virsh-domain.c ++++ libvirt-3.2.0/tools/virsh-domain.c +@@ -10284,6 +10284,22 @@ static const vshCmdOptDef opts_migrate[] + .type = VSH_OT_BOOL, + .help = N_("use TLS for migration") }, + {.name = "max_iters", + .type = VSH_OT_INT, @@ -338,7 +338,7 @@ Index: libvirt-3.1.0/tools/virsh-domain.c {.name = NULL} }; -@@ -10245,6 +10261,7 @@ doMigrate(void *opaque) +@@ -10307,6 +10323,7 @@ doMigrate(void *opaque) unsigned long long ullOpt = 0; int rv; virConnectPtr dconn = data->dconn; @@ -346,7 +346,7 @@ Index: libvirt-3.1.0/tools/virsh-domain.c sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); -@@ -10364,6 +10381,27 @@ doMigrate(void *opaque) +@@ -10426,6 +10443,27 @@ doMigrate(void *opaque) goto save_error; } @@ -374,11 +374,11 @@ Index: libvirt-3.1.0/tools/virsh-domain.c if (vshCommandOptStringReq(ctl, cmd, "xml", &opt) < 0) goto out; if (opt) { -Index: libvirt-3.1.0/tools/virsh.pod +Index: libvirt-3.2.0/tools/virsh.pod =================================================================== ---- libvirt-3.1.0.orig/tools/virsh.pod -+++ libvirt-3.1.0/tools/virsh.pod -@@ -1732,6 +1732,14 @@ compression. I<--comp-mt-threads> and I< +--- libvirt-3.2.0.orig/tools/virsh.pod ++++ libvirt-3.2.0/tools/virsh.pod +@@ -1752,6 +1752,14 @@ compression. I<--comp-mt-threads> and I< of compress threads on source and the number of decompress threads on target respectively. I<--comp-xbzrle-cache> sets size of page cache in bytes. diff --git a/libxl-support-block-script.patch b/libxl-support-block-script.patch index 729c679..fa1be6b 100644 --- a/libxl-support-block-script.patch +++ b/libxl-support-block-script.patch @@ -7,10 +7,10 @@ and npiv. For more details, see bsc#954872 and FATE#319810 -Index: libvirt-3.1.0/src/libxl/libxl_conf.c +Index: libvirt-3.2.0/src/libxl/libxl_conf.c =================================================================== ---- libvirt-3.1.0.orig/src/libxl/libxl_conf.c -+++ libvirt-3.1.0/src/libxl/libxl_conf.c +--- libvirt-3.2.0.orig/src/libxl/libxl_conf.c ++++ libvirt-3.2.0/src/libxl/libxl_conf.c @@ -609,6 +609,25 @@ libxlDiskSetDiscard(libxl_device_disk *x #endif } diff --git a/lxc-wait-after-eth-del.patch b/lxc-wait-after-eth-del.patch index bfe8351..d59eb0c 100644 --- a/lxc-wait-after-eth-del.patch +++ b/lxc-wait-after-eth-del.patch @@ -13,47 +13,71 @@ device with the same name that is being created. src/lxc/lxc_process.c | 1 + 3 files changed, 4 insertions(+) -Index: libvirt-3.1.0/src/lxc/lxc_controller.c +Index: libvirt-3.2.0/src/lxc/lxc_controller.c =================================================================== ---- libvirt-3.1.0.orig/src/lxc/lxc_controller.c -+++ libvirt-3.1.0/src/lxc/lxc_controller.c -@@ -1997,6 +1997,7 @@ static int virLXCControllerDeleteInterfa +--- libvirt-3.2.0.orig/src/lxc/lxc_controller.c ++++ libvirt-3.2.0/src/lxc/lxc_controller.c +@@ -73,6 +73,7 @@ + #include "rpc/virnetdaemon.h" + #include "virstring.h" + #include "virgettext.h" ++#include "virutil.h" + + #define VIR_FROM_THIS VIR_FROM_LXC + +@@ -1997,6 +1998,7 @@ static int virLXCControllerDeleteInterfa if (virNetDevVethDelete(ctrl->veths[i]) < 0) ret = -1; } -+ virFileWaitForDevices(); ++ virWaitForDevices(); return ret; } -Index: libvirt-3.1.0/src/lxc/lxc_driver.c +Index: libvirt-3.2.0/src/lxc/lxc_driver.c =================================================================== ---- libvirt-3.1.0.orig/src/lxc/lxc_driver.c -+++ libvirt-3.1.0/src/lxc/lxc_driver.c -@@ -4036,6 +4036,7 @@ lxcDomainAttachDeviceNetLive(virConnectP +--- libvirt-3.2.0.orig/src/lxc/lxc_driver.c ++++ libvirt-3.2.0/src/lxc/lxc_driver.c +@@ -76,6 +76,7 @@ + #include "virtime.h" + #include "virtypedparam.h" + #include "viruri.h" ++#include "virutil.h" + #include "virstring.h" + #include "viraccessapicheck.h" + #include "viraccessapichecklxc.h" +@@ -4035,6 +4036,7 @@ lxcDomainAttachDeviceNetLive(virConnectP case VIR_DOMAIN_NET_TYPE_NETWORK: case VIR_DOMAIN_NET_TYPE_ETHERNET: ignore_value(virNetDevVethDelete(veth)); -+ virFileWaitForDevices(); ++ virWaitForDevices(); break; case VIR_DOMAIN_NET_TYPE_DIRECT: -@@ -4470,6 +4471,7 @@ lxcDomainDetachDeviceNetLive(virDomainOb +@@ -4469,6 +4471,7 @@ lxcDomainDetachDeviceNetLive(virDomainOb virDomainAuditNet(vm, detach, NULL, "detach", false); goto cleanup; } -+ virFileWaitForDevices(); ++ virWaitForDevices(); break; /* It'd be nice to support this, but with macvlan -Index: libvirt-3.1.0/src/lxc/lxc_process.c +Index: libvirt-3.2.0/src/lxc/lxc_process.c =================================================================== ---- libvirt-3.1.0.orig/src/lxc/lxc_process.c -+++ libvirt-3.1.0/src/lxc/lxc_process.c -@@ -221,6 +221,7 @@ static void virLXCProcessCleanup(virLXCD +--- libvirt-3.2.0.orig/src/lxc/lxc_process.c ++++ libvirt-3.2.0/src/lxc/lxc_process.c +@@ -52,6 +52,7 @@ + #include "viratomic.h" + #include "virprocess.h" + #include "virsystemd.h" ++#include "virutil.h" + #include "netdev_bandwidth_conf.h" + + #define VIR_FROM_THIS VIR_FROM_LXC +@@ -221,6 +222,7 @@ static void virLXCProcessCleanup(virLXCD } networkReleaseActualDevice(vm->def, iface); } -+ virFileWaitForDevices(); ++ virWaitForDevices(); virDomainConfVMNWFilterTeardown(vm); diff --git a/network-don-t-use-dhcp-authoritative-on-static-netwo.patch b/network-don-t-use-dhcp-authoritative-on-static-netwo.patch index 2e0529c..13d987a 100644 --- a/network-don-t-use-dhcp-authoritative-on-static-netwo.patch +++ b/network-don-t-use-dhcp-authoritative-on-static-netwo.patch @@ -17,11 +17,11 @@ Signed-off-by: Martin Wilck tests/networkxml2confdata/dhcp6host-routed-network.conf | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) -Index: libvirt-3.1.0/src/network/bridge_driver.c +Index: libvirt-3.2.0/src/network/bridge_driver.c =================================================================== ---- libvirt-3.1.0.orig/src/network/bridge_driver.c -+++ libvirt-3.1.0/src/network/bridge_driver.c -@@ -1398,7 +1398,14 @@ networkDnsmasqConfContents(virNetworkObj +--- libvirt-3.2.0.orig/src/network/bridge_driver.c ++++ libvirt-3.2.0/src/network/bridge_driver.c +@@ -1413,7 +1413,14 @@ networkDnsmasqConfContents(virNetworkObj if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET)) { if (ipdef->nranges || ipdef->nhosts) { virBufferAddLit(&configbuf, "dhcp-no-override\n"); @@ -37,10 +37,10 @@ Index: libvirt-3.1.0/src/network/bridge_driver.c } if (ipdef->tftproot) { -Index: libvirt-3.1.0/tests/networkxml2confdata/dhcp6host-routed-network.conf +Index: libvirt-3.2.0/tests/networkxml2confdata/dhcp6host-routed-network.conf =================================================================== ---- libvirt-3.1.0.orig/tests/networkxml2confdata/dhcp6host-routed-network.conf -+++ libvirt-3.1.0/tests/networkxml2confdata/dhcp6host-routed-network.conf +--- libvirt-3.2.0.orig/tests/networkxml2confdata/dhcp6host-routed-network.conf ++++ libvirt-3.2.0/tests/networkxml2confdata/dhcp6host-routed-network.conf @@ -10,7 +10,6 @@ bind-dynamic interface=virbr1 dhcp-range=192.168.122.1,static diff --git a/ppc64le-canonical-name.patch b/ppc64le-canonical-name.patch index 019b3e2..fdc3f03 100644 --- a/ppc64le-canonical-name.patch +++ b/ppc64le-canonical-name.patch @@ -2,10 +2,10 @@ Canonicalize hostarch name ppc64le to ppc64 See bnc#894956 -Index: libvirt-3.1.0/src/util/virarch.c +Index: libvirt-3.2.0/src/util/virarch.c =================================================================== ---- libvirt-3.1.0.orig/src/util/virarch.c -+++ libvirt-3.1.0/src/util/virarch.c +--- libvirt-3.2.0.orig/src/util/virarch.c ++++ libvirt-3.2.0/src/util/virarch.c @@ -169,6 +169,8 @@ virArch virArchFromHost(void) arch = VIR_ARCH_I686; } else if (STREQ(ut.machine, "amd64")) { diff --git a/qemu-apparmor-screenshot.patch b/qemu-apparmor-screenshot.patch index f8d1b83..5bf443e 100644 --- a/qemu-apparmor-screenshot.patch +++ b/qemu-apparmor-screenshot.patch @@ -1,7 +1,7 @@ -Index: libvirt-3.1.0/examples/apparmor/libvirt-qemu +Index: libvirt-3.2.0/examples/apparmor/libvirt-qemu =================================================================== ---- libvirt-3.1.0.orig/examples/apparmor/libvirt-qemu -+++ libvirt-3.1.0/examples/apparmor/libvirt-qemu +--- libvirt-3.2.0.orig/examples/apparmor/libvirt-qemu ++++ libvirt-3.2.0/examples/apparmor/libvirt-qemu @@ -154,3 +154,6 @@ /etc/udev/udev.conf r, /sys/bus/ r, diff --git a/support-managed-pci-xen-driver.patch b/support-managed-pci-xen-driver.patch index f143b9f..032e2dc 100644 --- a/support-managed-pci-xen-driver.patch +++ b/support-managed-pci-xen-driver.patch @@ -8,10 +8,10 @@ Subject: [PATCH] support managed pci devices in xen driver src/xenxs/xen_xm.c | 28 +++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 15 deletions(-) -Index: libvirt-3.1.0/src/xenconfig/xen_common.c +Index: libvirt-3.2.0/src/xenconfig/xen_common.c =================================================================== ---- libvirt-3.1.0.orig/src/xenconfig/xen_common.c -+++ libvirt-3.1.0/src/xenconfig/xen_common.c +--- libvirt-3.2.0.orig/src/xenconfig/xen_common.c ++++ libvirt-3.2.0/src/xenconfig/xen_common.c @@ -394,6 +394,8 @@ xenParsePCI(virConfPtr conf, virDomainDe { virConfValuePtr list = virConfGetValue(conf, "pci"); @@ -66,10 +66,10 @@ Index: libvirt-3.1.0/src/xenconfig/xen_common.c hostdev->source.subsys.type = VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI; hostdev->source.subsys.u.pci.addr.domain = domainID; hostdev->source.subsys.u.pci.addr.bus = busID; -Index: libvirt-3.1.0/src/xenconfig/xen_sxpr.c +Index: libvirt-3.2.0/src/xenconfig/xen_sxpr.c =================================================================== ---- libvirt-3.1.0.orig/src/xenconfig/xen_sxpr.c -+++ libvirt-3.1.0/src/xenconfig/xen_sxpr.c +--- libvirt-3.2.0.orig/src/xenconfig/xen_sxpr.c ++++ libvirt-3.2.0/src/xenconfig/xen_sxpr.c @@ -1062,6 +1062,7 @@ xenParseSxprPCI(virDomainDefPtr def, int busID; int slotID; diff --git a/suse-libvirtd-service.patch b/suse-libvirtd-service.patch new file mode 100644 index 0000000..b990861 --- /dev/null +++ b/suse-libvirtd-service.patch @@ -0,0 +1,19 @@ +Add Conflicts=xendomains.service to libvirtd service + +On SUSE distros, we promote libvirt and all the libvirt-based +tools. If a user installs libvirt on their SUSE Xen host, then libvirt +should be king and override xendomains. + +bsc#1015348 +Index: libvirt-3.2.0/daemon/libvirtd.service.in +=================================================================== +--- libvirt-3.2.0.orig/daemon/libvirtd.service.in ++++ libvirt-3.2.0/daemon/libvirtd.service.in +@@ -15,6 +15,7 @@ After=apparmor.service + After=local-fs.target + After=remote-fs.target + After=xencommons.service ++Conflicts=xendomains.service + Documentation=man:libvirtd(8) + Documentation=http://libvirt.org + diff --git a/suse-qemu-conf.patch b/suse-qemu-conf.patch index d513e92..2c266a2 100644 --- a/suse-qemu-conf.patch +++ b/suse-qemu-conf.patch @@ -7,11 +7,11 @@ suse-qemu-conf-secdriver.patch, suse-qemu-conf-lockmgr.patch, etc.), but for now they are all lumped together in this single patch. -Index: libvirt-3.1.0/src/qemu/qemu.conf +Index: libvirt-3.2.0/src/qemu/qemu.conf =================================================================== ---- libvirt-3.1.0.orig/src/qemu/qemu.conf -+++ libvirt-3.1.0/src/qemu/qemu.conf -@@ -283,11 +283,20 @@ +--- libvirt-3.2.0.orig/src/qemu/qemu.conf ++++ libvirt-3.2.0/src/qemu/qemu.conf +@@ -332,11 +332,20 @@ # isolation, but it cannot appear in a list of drivers. # #security_driver = "selinux" @@ -34,7 +34,7 @@ Index: libvirt-3.1.0/src/qemu/qemu.conf # If set to non-zero, then attempts to create unconfined # guests will be blocked. Defaults to 0. -@@ -531,11 +540,22 @@ +@@ -580,11 +589,22 @@ #allow_disk_format_probing = 1 @@ -62,7 +62,7 @@ Index: libvirt-3.1.0/src/qemu/qemu.conf # #lock_manager = "lockd" -@@ -626,9 +646,8 @@ +@@ -675,9 +695,8 @@ # for x86_64 and i686, but it's AAVMF for aarch64. The libvirt default # follows this scheme. #nvram = [ diff --git a/systemd-service-xen.patch b/systemd-service-xen.patch index 2593042..e36ff21 100644 --- a/systemd-service-xen.patch +++ b/systemd-service-xen.patch @@ -1,7 +1,7 @@ -Index: libvirt-3.1.0/daemon/libvirtd.service.in +Index: libvirt-3.2.0/daemon/libvirtd.service.in =================================================================== ---- libvirt-3.1.0.orig/daemon/libvirtd.service.in -+++ libvirt-3.1.0/daemon/libvirtd.service.in +--- libvirt-3.2.0.orig/daemon/libvirtd.service.in ++++ libvirt-3.2.0/daemon/libvirtd.service.in @@ -14,6 +14,7 @@ After=iscsid.service After=apparmor.service After=local-fs.target diff --git a/virtlockd-init-script.patch b/virtlockd-init-script.patch index 73f962b..026cef2 100644 --- a/virtlockd-init-script.patch +++ b/virtlockd-init-script.patch @@ -1,9 +1,9 @@ Adjust virtlockd init files to conform to SUSE standards -Index: libvirt-3.1.0/src/locking/virtlockd.sysconf +Index: libvirt-3.2.0/src/locking/virtlockd.sysconf =================================================================== ---- libvirt-3.1.0.orig/src/locking/virtlockd.sysconf -+++ libvirt-3.1.0/src/locking/virtlockd.sysconf +--- libvirt-3.2.0.orig/src/locking/virtlockd.sysconf ++++ libvirt-3.2.0/src/locking/virtlockd.sysconf @@ -1,3 +1,7 @@ +## Path: System/Virtualization/virtlockd + @@ -12,10 +12,10 @@ Index: libvirt-3.1.0/src/locking/virtlockd.sysconf # # Pass extra arguments to virtlockd #VIRTLOCKD_ARGS= -Index: libvirt-3.1.0/src/locking/virtlockd.init.in +Index: libvirt-3.2.0/src/locking/virtlockd.init.in =================================================================== ---- libvirt-3.1.0.orig/src/locking/virtlockd.init.in -+++ libvirt-3.1.0/src/locking/virtlockd.init.in +--- libvirt-3.2.0.orig/src/locking/virtlockd.init.in ++++ libvirt-3.2.0/src/locking/virtlockd.init.in @@ -4,59 +4,57 @@ # http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html # diff --git a/virtlogd-init-script.patch b/virtlogd-init-script.patch index 061afc5..3d1b29e 100644 --- a/virtlogd-init-script.patch +++ b/virtlogd-init-script.patch @@ -1,9 +1,9 @@ Adjust virtlogd init files to conform to SUSE standards -Index: libvirt-3.1.0/src/logging/virtlogd.init.in +Index: libvirt-3.2.0/src/logging/virtlogd.init.in =================================================================== ---- libvirt-3.1.0.orig/src/logging/virtlogd.init.in -+++ libvirt-3.1.0/src/logging/virtlogd.init.in +--- libvirt-3.2.0.orig/src/logging/virtlogd.init.in ++++ libvirt-3.2.0/src/logging/virtlogd.init.in @@ -4,59 +4,56 @@ # http://refspecs.linuxfoundation.org/LSB_5.0.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html # @@ -126,10 +126,10 @@ Index: libvirt-3.1.0/src/logging/virtlogd.init.in esac -exit $RETVAL +rc_exit -Index: libvirt-3.1.0/src/logging/virtlogd.sysconf +Index: libvirt-3.2.0/src/logging/virtlogd.sysconf =================================================================== ---- libvirt-3.1.0.orig/src/logging/virtlogd.sysconf -+++ libvirt-3.1.0/src/logging/virtlogd.sysconf +--- libvirt-3.2.0.orig/src/logging/virtlogd.sysconf ++++ libvirt-3.2.0/src/logging/virtlogd.sysconf @@ -1,3 +1,7 @@ +## Path: System/Virtualization/virtlogd + diff --git a/xen-pv-cdrom.patch b/xen-pv-cdrom.patch index c854af9..461a59b 100644 --- a/xen-pv-cdrom.patch +++ b/xen-pv-cdrom.patch @@ -1,7 +1,7 @@ -Index: libvirt-3.1.0/src/xenconfig/xen_sxpr.c +Index: libvirt-3.2.0/src/xenconfig/xen_sxpr.c =================================================================== ---- libvirt-3.1.0.orig/src/xenconfig/xen_sxpr.c -+++ libvirt-3.1.0/src/xenconfig/xen_sxpr.c +--- libvirt-3.2.0.orig/src/xenconfig/xen_sxpr.c ++++ libvirt-3.2.0/src/xenconfig/xen_sxpr.c @@ -392,7 +392,7 @@ xenParseSxprVifRate(const char *rate, un static int xenParseSxprDisks(virDomainDefPtr def, diff --git a/xen-sxpr-disk-type.patch b/xen-sxpr-disk-type.patch index d0a7b31..3d4a522 100644 --- a/xen-sxpr-disk-type.patch +++ b/xen-sxpr-disk-type.patch @@ -6,10 +6,10 @@ and 'file'. This was implicitly done prior to commit 9673418c. https://bugzilla.suse.com/show_bug.cgi?id=938228 -Index: libvirt-3.1.0/src/xenconfig/xen_sxpr.c +Index: libvirt-3.2.0/src/xenconfig/xen_sxpr.c =================================================================== ---- libvirt-3.1.0.orig/src/xenconfig/xen_sxpr.c -+++ libvirt-3.1.0/src/xenconfig/xen_sxpr.c +--- libvirt-3.2.0.orig/src/xenconfig/xen_sxpr.c ++++ libvirt-3.2.0/src/xenconfig/xen_sxpr.c @@ -506,10 +506,11 @@ xenParseSxprDisks(virDomainDefPtr def, omnipotent, we can revisit this, perhaps stat()'ing the src file in question */