diff options
author | Guido Günther <agx@sigxcpu.org> | 2014-09-30 19:28:00 +0200 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-09-30 19:28:00 +0200 |
commit | 8707039d5fcb05230d3ad5b21de4113ccf86cf1c (patch) | |
tree | 7cf3e7847d0ff1ecbfdcc1d10a77406159a9ee84 /src | |
parent | 063cc84dcfb5112e1e1ead25123fe13a6f0ac201 (diff) |
New upstream version 1.2.9~rc2
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 8 | ||||
-rw-r--r-- | src/Makefile.in | 29 | ||||
-rw-r--r-- | src/access/viraccessdriverpolkit.c | 20 | ||||
-rw-r--r-- | src/conf/cpu_conf.c | 10 | ||||
-rw-r--r-- | src/conf/domain_event.c | 2 | ||||
-rw-r--r-- | src/libvirt.c | 1 | ||||
-rw-r--r-- | src/lxc/lxc_driver.c | 2 | ||||
-rw-r--r-- | src/lxc/lxc_monitor_protocol.c | 15 | ||||
-rw-r--r-- | src/lxc/lxc_monitor_protocol.h | 15 | ||||
-rw-r--r-- | src/lxc/lxc_monitor_protocol.x | 19 | ||||
-rw-r--r-- | src/parallels/parallels_driver.c | 16 | ||||
-rw-r--r-- | src/parallels/parallels_sdk.c | 241 | ||||
-rw-r--r-- | src/parallels/parallels_sdk.h | 30 | ||||
-rw-r--r-- | src/parallels/parallels_utils.h | 4 | ||||
-rw-r--r-- | src/qemu/qemu_capabilities.c | 2 | ||||
-rw-r--r-- | src/qemu/qemu_cgroup.c | 9 | ||||
-rw-r--r-- | src/qemu/qemu_domain.c | 2 | ||||
-rw-r--r-- | src/qemu/qemu_driver.c | 70 | ||||
-rw-r--r-- | src/qemu/qemu_process.c | 3 | ||||
-rw-r--r-- | src/remote/remote_driver.c | 4 | ||||
-rw-r--r-- | src/rpc/virnetserver.c | 8 | ||||
-rw-r--r-- | src/uml/uml_driver.c | 2 | ||||
-rw-r--r-- | src/vbox/vbox_common.c | 2 |
23 files changed, 467 insertions, 47 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 7680bae7d..e65177f1b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -788,7 +788,9 @@ PARALLELS_DRIVER_SOURCES = \ parallels/parallels_utils.c \ parallels/parallels_utils.h \ parallels/parallels_storage.c \ - parallels/parallels_network.c + parallels/parallels_network.c \ + parallels/parallels_sdk.h \ + parallels/parallels_sdk.c BHYVE_DRIVER_SOURCES = \ bhyve/bhyve_capabilities.c \ @@ -1390,7 +1392,9 @@ if WITH_PARALLELS noinst_LTLIBRARIES += libvirt_driver_parallels.la libvirt_la_BUILT_LIBADD += libvirt_driver_parallels.la libvirt_driver_parallels_la_CFLAGS = \ - -I$(top_srcdir)/src/conf $(AM_CFLAGS) + -I$(top_srcdir)/src/conf $(AM_CFLAGS) \ + $(PARALLELS_SDK_CFLAGS) +libvirt_driver_parallels_la_LIBADD = $(PARALLELS_SDK_LIBS) libvirt_driver_parallels_la_SOURCES = $(PARALLELS_DRIVER_SOURCES) endif WITH_PARALLELS diff --git a/src/Makefile.in b/src/Makefile.in index 6c592ea73..870dab42e 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1148,16 +1148,19 @@ libvirt_driver_openvz_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(libvirt_driver_openvz_la_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ @WITH_OPENVZ_TRUE@am_libvirt_driver_openvz_la_rpath = -libvirt_driver_parallels_la_LIBADD = +@WITH_PARALLELS_TRUE@libvirt_driver_parallels_la_DEPENDENCIES = \ +@WITH_PARALLELS_TRUE@ $(am__DEPENDENCIES_1) am__libvirt_driver_parallels_la_SOURCES_DIST = \ parallels/parallels_driver.h parallels/parallels_driver.c \ parallels/parallels_utils.c parallels/parallels_utils.h \ - parallels/parallels_storage.c parallels/parallels_network.c + parallels/parallels_storage.c parallels/parallels_network.c \ + parallels/parallels_sdk.h parallels/parallels_sdk.c am__objects_48 = \ parallels/libvirt_driver_parallels_la-parallels_driver.lo \ parallels/libvirt_driver_parallels_la-parallels_utils.lo \ parallels/libvirt_driver_parallels_la-parallels_storage.lo \ - parallels/libvirt_driver_parallels_la-parallels_network.lo + parallels/libvirt_driver_parallels_la-parallels_network.lo \ + parallels/libvirt_driver_parallels_la-parallels_sdk.lo @WITH_PARALLELS_TRUE@am_libvirt_driver_parallels_la_OBJECTS = \ @WITH_PARALLELS_TRUE@ $(am__objects_48) libvirt_driver_parallels_la_OBJECTS = \ @@ -3135,6 +3138,8 @@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ +PARALLELS_SDK_CFLAGS = @PARALLELS_SDK_CFLAGS@ +PARALLELS_SDK_LIBS = @PARALLELS_SDK_LIBS@ PARTED = @PARTED@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ @@ -4214,7 +4219,9 @@ PARALLELS_DRIVER_SOURCES = \ parallels/parallels_utils.c \ parallels/parallels_utils.h \ parallels/parallels_storage.c \ - parallels/parallels_network.c + parallels/parallels_network.c \ + parallels/parallels_sdk.h \ + parallels/parallels_sdk.c BHYVE_DRIVER_SOURCES = \ bhyve/bhyve_capabilities.c \ @@ -4658,8 +4665,10 @@ HYPERV_GENERATED_STAMP = .hyperv_wmi_generator.stamp @WITH_HYPERV_TRUE@libvirt_driver_hyperv_la_LIBADD = $(OPENWSMAN_LIBS) @WITH_HYPERV_TRUE@libvirt_driver_hyperv_la_SOURCES = $(HYPERV_DRIVER_SOURCES) @WITH_PARALLELS_TRUE@libvirt_driver_parallels_la_CFLAGS = \ -@WITH_PARALLELS_TRUE@ -I$(top_srcdir)/src/conf $(AM_CFLAGS) +@WITH_PARALLELS_TRUE@ -I$(top_srcdir)/src/conf $(AM_CFLAGS) \ +@WITH_PARALLELS_TRUE@ $(PARALLELS_SDK_CFLAGS) +@WITH_PARALLELS_TRUE@libvirt_driver_parallels_la_LIBADD = $(PARALLELS_SDK_LIBS) @WITH_PARALLELS_TRUE@libvirt_driver_parallels_la_SOURCES = $(PARALLELS_DRIVER_SOURCES) @WITH_BHYVE_TRUE@libvirt_driver_bhyve_la_SOURCES = @WITH_BHYVE_TRUE@libvirt_driver_bhyve_la_LIBADD = \ @@ -5799,6 +5808,8 @@ parallels/libvirt_driver_parallels_la-parallels_storage.lo: \ parallels/$(am__dirstamp) parallels/$(DEPDIR)/$(am__dirstamp) parallels/libvirt_driver_parallels_la-parallels_network.lo: \ parallels/$(am__dirstamp) parallels/$(DEPDIR)/$(am__dirstamp) +parallels/libvirt_driver_parallels_la-parallels_sdk.lo: \ + parallels/$(am__dirstamp) parallels/$(DEPDIR)/$(am__dirstamp) libvirt_driver_parallels.la: $(libvirt_driver_parallels_la_OBJECTS) $(libvirt_driver_parallels_la_DEPENDENCIES) $(EXTRA_libvirt_driver_parallels_la_DEPENDENCIES) $(AM_V_CCLD)$(libvirt_driver_parallels_la_LINK) $(am_libvirt_driver_parallels_la_rpath) $(libvirt_driver_parallels_la_OBJECTS) $(libvirt_driver_parallels_la_LIBADD) $(LIBS) @@ -6678,6 +6689,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@openvz/$(DEPDIR)/libvirt_driver_openvz_la-openvz_util.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_network.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_sdk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_storage.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_utils.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@phyp/$(DEPDIR)/libvirt_driver_phyp_la-phyp_driver.Plo@am__quote@ @@ -8160,6 +8172,13 @@ parallels/libvirt_driver_parallels_la-parallels_network.lo: parallels/parallels_ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvirt_driver_parallels_la_CFLAGS) $(CFLAGS) -c -o parallels/libvirt_driver_parallels_la-parallels_network.lo `test -f 'parallels/parallels_network.c' || echo '$(srcdir)/'`parallels/parallels_network.c +parallels/libvirt_driver_parallels_la-parallels_sdk.lo: parallels/parallels_sdk.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvirt_driver_parallels_la_CFLAGS) $(CFLAGS) -MT parallels/libvirt_driver_parallels_la-parallels_sdk.lo -MD -MP -MF parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_sdk.Tpo -c -o parallels/libvirt_driver_parallels_la-parallels_sdk.lo `test -f 'parallels/parallels_sdk.c' || echo '$(srcdir)/'`parallels/parallels_sdk.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_sdk.Tpo parallels/$(DEPDIR)/libvirt_driver_parallels_la-parallels_sdk.Plo +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parallels/parallels_sdk.c' object='parallels/libvirt_driver_parallels_la-parallels_sdk.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvirt_driver_parallels_la_CFLAGS) $(CFLAGS) -c -o parallels/libvirt_driver_parallels_la-parallels_sdk.lo `test -f 'parallels/parallels_sdk.c' || echo '$(srcdir)/'`parallels/parallels_sdk.c + phyp/libvirt_driver_phyp_la-phyp_driver.lo: phyp/phyp_driver.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libvirt_driver_phyp_la_CFLAGS) $(CFLAGS) -MT phyp/libvirt_driver_phyp_la-phyp_driver.lo -MD -MP -MF phyp/$(DEPDIR)/libvirt_driver_phyp_la-phyp_driver.Tpo -c -o phyp/libvirt_driver_phyp_la-phyp_driver.lo `test -f 'phyp/phyp_driver.c' || echo '$(srcdir)/'`phyp/phyp_driver.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) phyp/$(DEPDIR)/libvirt_driver_phyp_la-phyp_driver.Tpo phyp/$(DEPDIR)/libvirt_driver_phyp_la-phyp_driver.Plo diff --git a/src/access/viraccessdriverpolkit.c b/src/access/viraccessdriverpolkit.c index 2bc18429d..3136be7ea 100644 --- a/src/access/viraccessdriverpolkit.c +++ b/src/access/viraccessdriverpolkit.c @@ -87,24 +87,22 @@ virAccessDriverPolkitGetCaller(const char *actionid, actionid); return -1; } - if (virIdentityGetUNIXProcessID(identity, pid) < 0) - goto cleanup; - if (virIdentityGetUNIXProcessTime(identity, startTime) < 0) - goto cleanup; - if (virIdentityGetUNIXUserID(identity, uid) < 0) - goto cleanup; - if (!pid) { + if (virIdentityGetUNIXProcessID(identity, pid) < 0) { virAccessError(VIR_ERR_INTERNAL_ERROR, "%s", _("No UNIX process ID available")); goto cleanup; } - - if (virIdentityGetUNIXProcessTime(identity, startTime) < 0) + if (virIdentityGetUNIXProcessTime(identity, startTime) < 0) { + virAccessError(VIR_ERR_INTERNAL_ERROR, "%s", + _("No UNIX process start time available")); goto cleanup; - - if (virIdentityGetUNIXUserID(identity, uid) < 0) + } + if (virIdentityGetUNIXUserID(identity, uid) < 0) { + virAccessError(VIR_ERR_INTERNAL_ERROR, "%s", + _("No UNIX caller UID available")); goto cleanup; + } ret = 0; diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c index 116aa58e3..9b7fbb080 100644 --- a/src/conf/cpu_conf.c +++ b/src/conf/cpu_conf.c @@ -507,17 +507,19 @@ virCPUDefParseXML(xmlNodePtr node, memAccessStr = virXMLPropString(nodes[i], "memAccess"); if (memAccessStr) { - def->cells[cur_cell].memAccess = - virMemAccessTypeFromString(memAccessStr); + int rc = virMemAccessTypeFromString(memAccessStr); - if (def->cells[cur_cell].memAccess <= 0) { + if (rc <= 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("Invalid 'memAccess' attribute " "value '%s'"), memAccessStr); VIR_FREE(memAccessStr); - goto cleanup; + goto error; } + + def->cells[cur_cell].memAccess = rc; + VIR_FREE(memAccessStr); } } diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c index bf187cd36..3504b34ab 100644 --- a/src/conf/domain_event.c +++ b/src/conf/domain_event.c @@ -1798,7 +1798,7 @@ virDomainQemuMonitorEventStateRegisterID(virConnectPtr conn, if (VIR_ALLOC(data) < 0) return -1; data->flags = flags; - if (flags != -1) { + if (event && flags != -1) { int rflags = REG_NOSUB; if (flags & VIR_CONNECT_DOMAIN_QEMU_MONITOR_EVENT_REGISTER_NOCASE) diff --git a/src/libvirt.c b/src/libvirt.c index 388c040c6..245c373bc 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -21893,6 +21893,7 @@ virNodeAllocPages(virConnectPtr conn, virResetLastError(); virCheckConnectReturn(conn, -1); + virCheckReadOnlyGoto(conn->flags, error); virCheckNonZeroArgGoto(npages, error); virCheckNonNullArgGoto(pageSizes, error); virCheckNonNullArgGoto(pageCounts, error); diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 38763de1c..b3e506f9a 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -5797,7 +5797,7 @@ static virDriver lxcDriver = { .domainReboot = lxcDomainReboot, /* 1.0.1 */ .domainLxcOpenNamespace = lxcDomainLxcOpenNamespace, /* 1.0.2 */ .nodeGetFreePages = lxcNodeGetFreePages, /* 1.2.6 */ - .nodeAllocPages = lxcNodeAllocPages, /* 1.2.8 */ + .nodeAllocPages = lxcNodeAllocPages, /* 1.2.9 */ }; static virStateDriver lxcStateDriver = { diff --git a/src/lxc/lxc_monitor_protocol.c b/src/lxc/lxc_monitor_protocol.c index 69df5c860..594765ee7 100644 --- a/src/lxc/lxc_monitor_protocol.c +++ b/src/lxc/lxc_monitor_protocol.c @@ -5,6 +5,21 @@ */ #include "lxc_monitor_protocol.h" +#ifdef HAVE_XDR_U_INT64_T +# define xdr_uint64_t xdr_u_int64_t +#endif +#ifndef IXDR_PUT_INT32 +# define IXDR_PUT_INT32 IXDR_PUT_LONG +#endif +#ifndef IXDR_GET_INT32 +# define IXDR_GET_INT32 IXDR_GET_LONG +#endif +#ifndef IXDR_PUT_U_INT32 +# define IXDR_PUT_U_INT32 IXDR_PUT_U_LONG +#endif +#ifndef IXDR_GET_U_INT32 +# define IXDR_GET_U_INT32 IXDR_GET_U_LONG +#endif bool_t xdr_virLXCMonitorExitStatus (XDR *xdrs, virLXCMonitorExitStatus *objp) diff --git a/src/lxc/lxc_monitor_protocol.h b/src/lxc/lxc_monitor_protocol.h index dd7b3111e..000349c5e 100644 --- a/src/lxc/lxc_monitor_protocol.h +++ b/src/lxc/lxc_monitor_protocol.h @@ -13,6 +13,21 @@ extern "C" { #endif +#ifdef HAVE_XDR_U_INT64_T +# define xdr_uint64_t xdr_u_int64_t +#endif +#ifndef IXDR_PUT_INT32 +# define IXDR_PUT_INT32 IXDR_PUT_LONG +#endif +#ifndef IXDR_GET_INT32 +# define IXDR_GET_INT32 IXDR_GET_LONG +#endif +#ifndef IXDR_PUT_U_INT32 +# define IXDR_PUT_U_INT32 IXDR_PUT_U_LONG +#endif +#ifndef IXDR_GET_U_INT32 +# define IXDR_GET_U_INT32 IXDR_GET_U_LONG +#endif enum virLXCMonitorExitStatus { VIR_LXC_MONITOR_EXIT_STATUS_ERROR = 0, diff --git a/src/lxc/lxc_monitor_protocol.x b/src/lxc/lxc_monitor_protocol.x index 0926e26f6..3b66af5d8 100644 --- a/src/lxc/lxc_monitor_protocol.x +++ b/src/lxc/lxc_monitor_protocol.x @@ -4,6 +4,25 @@ * the libvirt_lxc helper program. */ +/* cygwin's xdr implementation defines xdr_u_int64_t instead of xdr_uint64_t + * and lacks IXDR_PUT_INT32 and IXDR_GET_INT32 + */ +%#ifdef HAVE_XDR_U_INT64_T +%# define xdr_uint64_t xdr_u_int64_t +%#endif +%#ifndef IXDR_PUT_INT32 +%# define IXDR_PUT_INT32 IXDR_PUT_LONG +%#endif +%#ifndef IXDR_GET_INT32 +%# define IXDR_GET_INT32 IXDR_GET_LONG +%#endif +%#ifndef IXDR_PUT_U_INT32 +%# define IXDR_PUT_U_INT32 IXDR_PUT_U_LONG +%#endif +%#ifndef IXDR_GET_U_INT32 +%# define IXDR_GET_U_INT32 IXDR_GET_U_LONG +%#endif + enum virLXCMonitorExitStatus { VIR_LXC_MONITOR_EXIT_STATUS_ERROR, VIR_LXC_MONITOR_EXIT_STATUS_SHUTDOWN, diff --git a/src/parallels/parallels_driver.c b/src/parallels/parallels_driver.c index 13a7d95d7..516a296eb 100644 --- a/src/parallels/parallels_driver.c +++ b/src/parallels/parallels_driver.c @@ -55,6 +55,7 @@ #include "parallels_driver.h" #include "parallels_utils.h" +#include "parallels_sdk.h" #define VIR_FROM_THIS VIR_FROM_PARALLELS @@ -929,9 +930,17 @@ parallelsOpenDefault(virConnectPtr conn) if (virMutexInit(&privconn->lock) < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("cannot initialize mutex")); - goto error; + goto err_free; + } + + if (prlsdkInit(privconn)) { + VIR_DEBUG("%s", _("Can't initialize Parallels SDK")); + goto err_free; } + if (prlsdkConnect(privconn) < 0) + goto err_free; + if (!(privconn->caps = parallelsBuildCapabilities())) goto error; @@ -953,6 +962,9 @@ parallelsOpenDefault(virConnectPtr conn) virObjectUnref(privconn->domains); virObjectUnref(privconn->caps); virStoragePoolObjListFree(&privconn->pools); + prlsdkDisconnect(privconn); + prlsdkDeinit(); + err_free: VIR_FREE(privconn); return VIR_DRV_OPEN_ERROR; } @@ -999,7 +1011,9 @@ parallelsConnectClose(virConnectPtr conn) virObjectUnref(privconn->caps); virObjectUnref(privconn->xmlopt); virObjectUnref(privconn->domains); + prlsdkDisconnect(privconn); conn->privateData = NULL; + prlsdkDeinit(); parallelsDriverUnlock(privconn); virMutexDestroy(&privconn->lock); diff --git a/src/parallels/parallels_sdk.c b/src/parallels/parallels_sdk.c new file mode 100644 index 000000000..1c77d2769 --- /dev/null +++ b/src/parallels/parallels_sdk.c @@ -0,0 +1,241 @@ +/* + * parallels_sdk.c: core driver functions for managing + * Parallels Cloud Server hosts + * + * Copyright (C) 2014 Parallels, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <config.h> + +#include "virerror.h" +#include "viralloc.h" + +#include "parallels_sdk.h" + +#define VIR_FROM_THIS VIR_FROM_PARALLELS +#define JOB_INFINIT_WAIT_TIMEOUT UINT_MAX + +PRL_UINT32 defaultJobTimeout = JOB_INFINIT_WAIT_TIMEOUT; + +/* + * Log error description + */ +static void +logPrlErrorHelper(PRL_RESULT err, const char *filename, + const char *funcname, size_t linenr) +{ + char *msg1 = NULL, *msg2 = NULL; + PRL_UINT32 len = 0; + + /* Get required buffer length */ + PrlApi_GetResultDescription(err, PRL_TRUE, PRL_FALSE, NULL, &len); + + if (VIR_ALLOC_N(msg1, len) < 0) + goto cleanup; + + /* get short error description */ + PrlApi_GetResultDescription(err, PRL_TRUE, PRL_FALSE, msg1, &len); + + PrlApi_GetResultDescription(err, PRL_FALSE, PRL_FALSE, NULL, &len); + + if (VIR_ALLOC_N(msg2, len) < 0) + goto cleanup; + + /* get long error description */ + PrlApi_GetResultDescription(err, PRL_FALSE, PRL_FALSE, msg2, &len); + + virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INTERNAL_ERROR, + filename, funcname, linenr, + _("%s %s"), msg1, msg2); + + cleanup: + VIR_FREE(msg1); + VIR_FREE(msg2); +} + +#define logPrlError(code) \ + logPrlErrorHelper(code, __FILE__, \ + __FUNCTION__, __LINE__) + +static PRL_RESULT +logPrlEventErrorHelper(PRL_HANDLE event, const char *filename, + const char *funcname, size_t linenr) +{ + PRL_RESULT ret, retCode; + char *msg1 = NULL, *msg2 = NULL; + PRL_UINT32 len = 0; + int err = -1; + + if ((ret = PrlEvent_GetErrCode(event, &retCode))) { + logPrlError(ret); + return ret; + } + + PrlEvent_GetErrString(event, PRL_TRUE, PRL_FALSE, NULL, &len); + + if (VIR_ALLOC_N(msg1, len) < 0) + goto cleanup; + + PrlEvent_GetErrString(event, PRL_TRUE, PRL_FALSE, msg1, &len); + + PrlEvent_GetErrString(event, PRL_FALSE, PRL_FALSE, NULL, &len); + + if (VIR_ALLOC_N(msg2, len) < 0) + goto cleanup; + + PrlEvent_GetErrString(event, PRL_FALSE, PRL_FALSE, msg2, &len); + + virReportErrorHelper(VIR_FROM_THIS, VIR_ERR_INTERNAL_ERROR, + filename, funcname, linenr, + _("%s %s"), msg1, msg2); + err = 0; + + cleanup: + VIR_FREE(msg1); + VIR_FREE(msg2); + + return err; +} + +#define logPrlEventError(event) \ + logPrlEventErrorHelper(event, __FILE__, \ + __FUNCTION__, __LINE__) + +static PRL_HANDLE +getJobResultHelper(PRL_HANDLE job, unsigned int timeout, + const char *filename, const char *funcname, + size_t linenr) +{ + PRL_RESULT ret, retCode; + PRL_HANDLE result = NULL; + + if ((ret = PrlJob_Wait(job, timeout))) { + logPrlErrorHelper(ret, filename, funcname, linenr); + goto cleanup; + } + + if ((ret = PrlJob_GetRetCode(job, &retCode))) { + logPrlErrorHelper(ret, filename, funcname, linenr); + goto cleanup; + } + + if (retCode) { + PRL_HANDLE err_handle; + + /* Sometimes it's possible to get additional error info. */ + if ((ret = PrlJob_GetError(job, &err_handle))) { + logPrlErrorHelper(ret, filename, funcname, linenr); + goto cleanup; + } + + if (logPrlEventErrorHelper(err_handle, filename, funcname, linenr)) + logPrlErrorHelper(retCode, filename, funcname, linenr); + + PrlHandle_Free(err_handle); + } else { + ret = PrlJob_GetResult(job, &result); + if (PRL_FAILED(ret)) { + logPrlErrorHelper(ret, filename, funcname, linenr); + PrlHandle_Free(result); + result = NULL; + goto cleanup; + } + } + + cleanup: + PrlHandle_Free(job); + return result; +} + +#define getJobResult(job, timeout) \ + getJobResultHelper(job, timeout, __FILE__, \ + __FUNCTION__, __LINE__) + +static int +waitJobHelper(PRL_HANDLE job, unsigned int timeout, + const char *filename, const char *funcname, + size_t linenr) +{ + PRL_HANDLE result = NULL; + + result = getJobResultHelper(job, timeout, filename, funcname, linenr); + if (result) + PrlHandle_Free(result); + + return result ? 0 : -1; +} + +#define waitJob(job, timeout) \ + waitJobHelper(job, timeout, __FILE__, \ + __FUNCTION__, __LINE__) + +int +prlsdkInit(parallelsConnPtr privconn) +{ + PRL_RESULT ret; + + ret = PrlApi_InitEx(PARALLELS_API_VER, PAM_SERVER, 0, 0); + if (PRL_FAILED(ret)) { + logPrlError(ret); + return -1; + } + + privconn->jobTimeout = JOB_INFINIT_WAIT_TIMEOUT; + + return 0; +}; + +void +prlsdkDeinit(void) +{ + PrlApi_Deinit(); +}; + +int +prlsdkConnect(parallelsConnPtr privconn) +{ + PRL_RESULT ret; + PRL_HANDLE job = PRL_INVALID_HANDLE; + + ret = PrlSrv_Create(&privconn->server); + if (PRL_FAILED(ret)) { + logPrlError(ret); + return -1; + } + + job = PrlSrv_LoginLocalEx(privconn->server, NULL, 0, + PSL_HIGH_SECURITY, PACF_NON_INTERACTIVE_MODE); + + if (waitJob(job, privconn->jobTimeout)) { + PrlHandle_Free(privconn->server); + return -1; + } + + return 0; +} + +void +prlsdkDisconnect(parallelsConnPtr privconn) +{ + PRL_HANDLE job; + + job = PrlSrv_Logoff(privconn->server); + waitJob(job, privconn->jobTimeout); + + PrlHandle_Free(privconn->server); +} diff --git a/src/parallels/parallels_sdk.h b/src/parallels/parallels_sdk.h new file mode 100644 index 000000000..cefe67d14 --- /dev/null +++ b/src/parallels/parallels_sdk.h @@ -0,0 +1,30 @@ +/* + * parallels_sdk.h: core driver functions for managing + * Parallels Cloud Server hosts + * + * Copyright (C) 2014 Parallels, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * <http://www.gnu.org/licenses/>. + * + */ + +#include <Parallels.h> + +#include "parallels_utils.h" + +int prlsdkInit(parallelsConnPtr privconn); +void prlsdkDeinit(void); +int prlsdkConnect(parallelsConnPtr privconn); +void prlsdkDisconnect(parallelsConnPtr privconn); diff --git a/src/parallels/parallels_utils.h b/src/parallels/parallels_utils.h index 599e2c525..aef590ff1 100644 --- a/src/parallels/parallels_utils.h +++ b/src/parallels/parallels_utils.h @@ -23,6 +23,8 @@ #ifndef PARALLELS_UTILS_H # define PARALLELS_UTILS_H +# include <Parallels.h> + # include "driver.h" # include "conf/domain_conf.h" # include "conf/storage_conf.h" @@ -40,6 +42,8 @@ struct _parallelsConn { virMutex lock; virDomainObjListPtr domains; + PRL_HANDLE server; + PRL_UINT32 jobTimeout; virStoragePoolObjList pools; virNetworkObjList networks; virCapsPtr caps; diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 49f5f7502..a409aafaa 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -3306,6 +3306,8 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps, virCommandAbort(cmd); virCommandFree(cmd); VIR_FREE(monarg); + if (monpath) + ignore_value(unlink(monpath)); VIR_FREE(monpath); virObjectUnref(vm); virObjectUnref(xmlopt); diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c index 300946a6f..bd22b7fbd 100644 --- a/src/qemu/qemu_cgroup.c +++ b/src/qemu/qemu_cgroup.c @@ -674,7 +674,8 @@ qemuSetupCpusetCgroup(virDomainObjPtr vm, static int -qemuSetupCpuCgroup(virDomainObjPtr vm) +qemuSetupCpuCgroup(virQEMUDriverPtr driver, + virDomainObjPtr vm) { qemuDomainObjPrivatePtr priv = vm->privateData; virObjectEventPtr event = NULL; @@ -703,7 +704,7 @@ qemuSetupCpuCgroup(virDomainObjPtr vm) vm->def->cputune.shares = val; if (virTypedParamsAddULLong(&eventParams, &eventNparams, &eventMaxparams, - VIR_DOMAIN_EVENT_CPUTUNE_CPU_SHARES, + VIR_DOMAIN_TUNABLE_CPU_CPU_SHARES, val) < 0) return -1; @@ -711,7 +712,7 @@ qemuSetupCpuCgroup(virDomainObjPtr vm) } if (event) - qemuDomainEventQueue(vm->privateData, event); + qemuDomainEventQueue(driver, event); } return 0; @@ -845,7 +846,7 @@ qemuSetupCgroup(virQEMUDriverPtr driver, if (qemuSetupMemoryCgroup(vm) < 0) goto cleanup; - if (qemuSetupCpuCgroup(vm) < 0) + if (qemuSetupCpuCgroup(driver, vm) < 0) goto cleanup; if (qemuSetupCpusetCgroup(vm, nodemask, caps) < 0) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 11145d199..76fcccec9 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2540,7 +2540,7 @@ qemuDomainCheckDiskPresence(virQEMUDriverPtr driver, virFileExists(virDomainDiskGetSource(disk))) continue; - if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) >= 0) + if (qemuDomainDetermineDiskChain(driver, vm, disk, true, true) >= 0) continue; if (disk->startupPolicy && diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4afd06620..6606154eb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4653,7 +4653,7 @@ qemuDomainPinVcpuFlags(virDomainPtr dom, goto cleanup; if (snprintf(paramField, VIR_TYPED_PARAM_FIELD_LENGTH, - VIR_DOMAIN_EVENT_CPUTUNE_VCPUPIN, vcpu) < 0) { + VIR_DOMAIN_TUNABLE_CPU_VCPUPIN, vcpu) < 0) { goto cleanup; } @@ -4940,7 +4940,7 @@ qemuDomainPinEmulator(virDomainPtr dom, str = virBitmapFormat(pcpumap); if (virTypedParamsAddString(&eventParams, &eventNparams, &eventMaxparams, - VIR_DOMAIN_EVENT_CPUTUNE_EMULATORIN, + VIR_DOMAIN_TUNABLE_CPU_EMULATORPIN, str) < 0) goto cleanup; @@ -9318,7 +9318,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (virTypedParamsAddULLong(&eventParams, &eventNparams, &eventMaxNparams, - VIR_DOMAIN_EVENT_CPUTUNE_CPU_SHARES, + VIR_DOMAIN_TUNABLE_CPU_CPU_SHARES, val) < 0) goto cleanup; } @@ -9341,7 +9341,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (virTypedParamsAddULLong(&eventParams, &eventNparams, &eventMaxNparams, - VIR_DOMAIN_EVENT_CPUTUNE_VCPU_PERIOD, + VIR_DOMAIN_TUNABLE_CPU_VCPU_PERIOD, value_ul) < 0) goto cleanup; } @@ -9361,7 +9361,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (virTypedParamsAddLLong(&eventParams, &eventNparams, &eventMaxNparams, - VIR_DOMAIN_EVENT_CPUTUNE_VCPU_QUOTA, + VIR_DOMAIN_TUNABLE_CPU_VCPU_QUOTA, value_l) < 0) goto cleanup; } @@ -9382,7 +9382,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (virTypedParamsAddULLong(&eventParams, &eventNparams, &eventMaxNparams, - VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_PERIOD, + VIR_DOMAIN_TUNABLE_CPU_EMULATOR_PERIOD, value_ul) < 0) goto cleanup; } @@ -9403,7 +9403,7 @@ qemuDomainSetSchedulerParametersFlags(virDomainPtr dom, if (virTypedParamsAddLLong(&eventParams, &eventNparams, &eventMaxNparams, - VIR_DOMAIN_EVENT_CPUTUNE_EMULATOR_QUOTA, + VIR_DOMAIN_TUNABLE_CPU_EMULATOR_QUOTA, value_l) < 0) goto cleanup; } @@ -16275,6 +16275,10 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, bool set_iops = false; virQEMUDriverConfigPtr cfg = NULL; virCapsPtr caps = NULL; + virObjectEventPtr event = NULL; + virTypedParameterPtr eventParams = NULL; + int eventNparams = 0; + int eventMaxparams = 0; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); @@ -16316,6 +16320,10 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, &persistentDef) < 0) goto endjob; + if (virTypedParamsAddString(&eventParams, &eventNparams, &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_DISK, disk) < 0) + goto endjob; + for (i = 0; i < nparams; i++) { virTypedParameterPtr param = ¶ms[i]; @@ -16329,26 +16337,56 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_BYTES_SEC)) { info.total_bytes_sec = param->value.ul; set_bytes = true; + if (virTypedParamsAddULLong(&eventParams, &eventNparams, + &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_BYTES_SEC, + param->value.ul) < 0) + goto endjob; } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_READ_BYTES_SEC)) { info.read_bytes_sec = param->value.ul; set_bytes = true; + if (virTypedParamsAddULLong(&eventParams, &eventNparams, + &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_READ_BYTES_SEC, + param->value.ul) < 0) + goto endjob; } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_BYTES_SEC)) { info.write_bytes_sec = param->value.ul; set_bytes = true; + if (virTypedParamsAddULLong(&eventParams, &eventNparams, + &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_BYTES_SEC, + param->value.ul) < 0) + goto endjob; } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_TOTAL_IOPS_SEC)) { info.total_iops_sec = param->value.ul; set_iops = true; + if (virTypedParamsAddULLong(&eventParams, &eventNparams, + &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_TOTAL_IOPS_SEC, + param->value.ul) < 0) + goto endjob; } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_READ_IOPS_SEC)) { info.read_iops_sec = param->value.ul; set_iops = true; + if (virTypedParamsAddULLong(&eventParams, &eventNparams, + &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_READ_IOPS_SEC, + param->value.ul) < 0) + goto endjob; } else if (STREQ(param->field, VIR_DOMAIN_BLOCK_IOTUNE_WRITE_IOPS_SEC)) { info.write_iops_sec = param->value.ul; set_iops = true; + if (virTypedParamsAddULLong(&eventParams, &eventNparams, + &eventMaxparams, + VIR_DOMAIN_TUNABLE_BLKDEV_WRITE_IOPS_SEC, + param->value.ul) < 0) + goto endjob; } } @@ -16406,6 +16444,20 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, if (ret < 0) goto endjob; vm->def->disks[idx]->blkdeviotune = info; + + ret = virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm); + if (ret < 0) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("Saving live XML config failed")); + goto endjob; + } + + if (eventNparams) { + event = virDomainEventTunableNewFromDom(dom, eventParams, eventNparams); + eventNparams = 0; + if (event) + qemuDomainEventQueue(driver, event); + } } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { @@ -16438,6 +16490,8 @@ qemuDomainSetBlockIoTune(virDomainPtr dom, VIR_FREE(device); if (vm) virObjectUnlock(vm); + if (eventNparams) + virTypedParamsFree(eventParams, eventNparams); virObjectUnref(caps); virObjectUnref(cfg); return ret; @@ -18362,7 +18416,7 @@ static virDriver qemuDriver = { .nodeGetFreePages = qemuNodeGetFreePages, /* 1.2.6 */ .connectGetDomainCapabilities = qemuConnectGetDomainCapabilities, /* 1.2.7 */ .connectGetAllDomainStats = qemuConnectGetAllDomainStats, /* 1.2.8 */ - .nodeAllocPages = qemuNodeAllocPages, /* 1.2.8 */ + .nodeAllocPages = qemuNodeAllocPages, /* 1.2.9 */ }; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index dddca3583..1b8931ea2 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -3876,6 +3876,9 @@ qemuPrepareNVRAM(virQEMUDriverConfigPtr cfg, goto cleanup; generated = true; + + if (virDomainSaveConfig(cfg->configDir, def) < 0) + goto cleanup; } if (!virFileExists(loader->nvram)) { diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index dc2d2fb64..6c49e49c1 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -7622,9 +7622,7 @@ remoteNodeGetFreePages(virConnectPtr conn, goto done; } - if (VIR_ALLOC_N(args.pages.pages_val, npages) < 0) - goto done; - memcpy(args.pages.pages_val, pages, npages * sizeof(*pages)); + args.pages.pages_val = (u_int *) pages; args.pages.pages_len = npages; args.startCell = startCell; args.cellCount = cellCount; diff --git a/src/rpc/virnetserver.c b/src/rpc/virnetserver.c index 7e3fc0a11..762c1855f 100644 --- a/src/rpc/virnetserver.c +++ b/src/rpc/virnetserver.c @@ -285,14 +285,14 @@ static int virNetServerAddClient(virNetServerPtr srv, if (srv->nclients_unauth_max && srv->nclients_unauth == srv->nclients_unauth_max) { /* Temporarily stop accepting new clients */ - VIR_DEBUG("Temporarily suspending services " - "due to max_anonymous_clients"); + VIR_INFO("Temporarily suspending services " + "due to max_anonymous_clients"); virNetServerUpdateServicesLocked(srv, false); } if (srv->nclients == srv->nclients_max) { /* Temporarily stop accepting new clients */ - VIR_DEBUG("Temporarily suspending services due to max_clients"); + VIR_INFO("Temporarily suspending services due to max_clients"); virNetServerUpdateServicesLocked(srv, false); } @@ -1080,7 +1080,7 @@ virNetServerCheckLimits(virNetServerPtr srv) (!srv->nclients_unauth_max || srv->nclients_unauth < srv->nclients_unauth_max)) { /* Now it makes sense to accept() a new client. */ - VIR_DEBUG("Re-enabling services"); + VIR_INFO("Re-enabling services"); virNetServerUpdateServicesLocked(srv, true); } } diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c index c255c07c1..2a401497b 100644 --- a/src/uml/uml_driver.c +++ b/src/uml/uml_driver.c @@ -2980,7 +2980,7 @@ static virDriver umlDriver = { .nodeGetMemoryParameters = umlNodeGetMemoryParameters, /* 0.10.2 */ .nodeSetMemoryParameters = umlNodeSetMemoryParameters, /* 0.10.2 */ .nodeGetFreePages = umlNodeGetFreePages, /* 1.2.6 */ - .nodeAllocPages = umlNodeAllocPages, /* 1.2.8 */ + .nodeAllocPages = umlNodeAllocPages, /* 1.2.9 */ }; static virStateDriver umlStateDriver = { diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c index e831255b0..7d75478ee 100644 --- a/src/vbox/vbox_common.c +++ b/src/vbox/vbox_common.c @@ -7551,7 +7551,7 @@ virDriver vboxCommonDriver = { .domainSnapshotDelete = vboxDomainSnapshotDelete, /* 0.8.0 */ .connectIsAlive = vboxConnectIsAlive, /* 0.9.8 */ .nodeGetFreePages = vboxNodeGetFreePages, /* 1.2.6 */ - .nodeAllocPages = vboxNodeAllocPages, /* 1.2.8 */ + .nodeAllocPages = vboxNodeAllocPages, /* 1.2.9 */ }; static void updateDriver(void) |