[libvirt] [PATCH 00/10] qemu: remove json fields from domain and monitor objects

Applies on top of Peter's removal of commandline parsing https://www.redhat.com/archives/libvir-list/2019-June/msg00405.html After removal of qemuProcessAttach there is no codepath that could possibly set monJSON to false (not that libvirt would be able to much with such domain), so we can finish cleaning it up. Ján Tomko (10): qemu: also delete qemuProcessAttach qemu: assume monJSON is always true qemu: domain: remove monJSON field qemu: stop formatting json='1' in status XML qemu: remove json argument from qemuMonitorOpen qemu: monitor: assume JSON in QEMU_CHECK_MONITOR macro qemu: monitor: remove mon->json checks qemu: monitor: remove the json field qemu: monitor: use VIR_AUTOFREE in qemuMonitor*VideoSize qemu: monitor: s/ret/rc/ in UpdateVideoSize functions src/qemu/qemu_command.c | 8 +- src/qemu/qemu_domain.c | 12 +- src/qemu/qemu_domain.h | 1 - src/qemu/qemu_driver.c | 3 +- src/qemu/qemu_migration.c | 21 +- src/qemu/qemu_monitor.c | 109 ++------ src/qemu/qemu_monitor.h | 2 - src/qemu/qemu_process.c | 247 +----------------- src/qemu/qemu_process.h | 8 - tests/qemuhotplugtest.c | 2 - tests/qemumonitortestutils.c | 1 - .../blockjob-mirror-in.xml | 2 +- .../disk-secinfo-upgrade-out.xml | 2 +- .../migration-in-params-in.xml | 2 +- .../migration-out-nbd-out.xml | 2 +- .../migration-out-nbd-tls-out.xml | 2 +- .../migration-out-params-in.xml | 2 +- tests/qemustatusxml2xmldata/modern-in.xml | 2 +- .../qemustatusxml2xmldata/vcpus-multi-in.xml | 2 +- 19 files changed, 52 insertions(+), 378 deletions(-) -- 2.20.1

Now that the virDomainQemuAttach API returns an error, we can remove the unused qemuProcessAttach function as well, deleting the only user that possibly could have requested to open a non-JSON monitor. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_process.c | 243 ---------------------------------------- src/qemu/qemu_process.h | 8 -- 2 files changed, 251 deletions(-) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 1626796c19..473b7c2fe2 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -7508,249 +7508,6 @@ void qemuProcessStop(virQEMUDriverPtr driver, } -int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED, - virQEMUDriverPtr driver, - virDomainObjPtr vm, - pid_t pid, - const char *pidfile, - virDomainChrSourceDefPtr monConfig, - bool monJSON) -{ - size_t i; - qemuDomainLogContextPtr logCtxt = NULL; - char *timestamp; - qemuDomainObjPrivatePtr priv = vm->privateData; - bool running = true; - virDomainPausedReason reason; - virSecurityLabelPtr seclabel = NULL; - virSecurityLabelDefPtr seclabeldef = NULL; - bool seclabelgen = false; - virSecurityManagerPtr* sec_managers = NULL; - const char *model; - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - virCapsPtr caps = NULL; - bool active = false; - virDomainVirtType virtType; - - VIR_DEBUG("Beginning VM attach process"); - - if (virDomainObjIsActive(vm)) { - virReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("VM is already active")); - virObjectUnref(cfg); - return -1; - } - - if (!(caps = virQEMUDriverGetCapabilities(driver, false))) - goto error; - - /* Do this upfront, so any part of the startup process can add - * runtime state to vm->def that won't be persisted. This let's us - * report implicit runtime defaults in the XML, like vnc listen/socket - */ - VIR_DEBUG("Setting current domain def as transient"); - if (virDomainObjSetDefTransient(caps, driver->xmlopt, vm) < 0) - goto error; - - vm->def->id = qemuDriverAllocateID(driver); - - if (virAtomicIntInc(&driver->nactive) == 1 && driver->inhibitCallback) - driver->inhibitCallback(true, driver->inhibitOpaque); - active = true; - - if (virFileMakePath(cfg->logDir) < 0) { - virReportSystemError(errno, - _("cannot create log directory %s"), - cfg->logDir); - goto error; - } - - VIR_FREE(priv->pidfile); - if (VIR_STRDUP(priv->pidfile, pidfile) < 0) - goto error; - - vm->pid = pid; - - VIR_DEBUG("Detect security driver config"); - sec_managers = qemuSecurityGetNested(driver->securityManager); - if (sec_managers == NULL) - goto error; - - for (i = 0; sec_managers[i]; i++) { - seclabelgen = false; - model = qemuSecurityGetModel(sec_managers[i]); - seclabeldef = virDomainDefGetSecurityLabelDef(vm->def, model); - if (seclabeldef == NULL) { - if (!(seclabeldef = virSecurityLabelDefNew(model))) - goto error; - seclabelgen = true; - } - seclabeldef->type = VIR_DOMAIN_SECLABEL_STATIC; - if (VIR_ALLOC(seclabel) < 0) - goto error; - if (qemuSecurityGetProcessLabel(sec_managers[i], vm->def, - vm->pid, seclabel) < 0) - goto error; - - if (VIR_STRDUP(seclabeldef->model, model) < 0) - goto error; - - if (VIR_STRDUP(seclabeldef->label, seclabel->label) < 0) - goto error; - VIR_FREE(seclabel); - - if (seclabelgen) { - if (VIR_APPEND_ELEMENT(vm->def->seclabels, vm->def->nseclabels, seclabeldef) < 0) - goto error; - seclabelgen = false; - } - } - - if (qemuSecurityCheckAllLabel(driver->securityManager, vm->def) < 0) - goto error; - if (qemuSecurityGenLabel(driver->securityManager, vm->def) < 0) - goto error; - - if (qemuDomainPerfRestart(vm) < 0) - goto error; - - VIR_DEBUG("Creating domain log file"); - if (!(logCtxt = qemuDomainLogContextNew(driver, vm, - QEMU_DOMAIN_LOG_CONTEXT_MODE_ATTACH))) - goto error; - - VIR_DEBUG("Determining emulator version"); - if (qemuDomainUpdateQEMUCaps(vm, driver->qemuCapsCache) < 0) - goto error; - - VIR_DEBUG("Preparing monitor state"); - priv->monConfig = virObjectRef(monConfig); - priv->monJSON = monJSON; - - /* Attaching to running QEMU so we need to detect whether it was started - * with -no-reboot. */ - qemuProcessPrepareAllowReboot(vm); - - /* - * Normally PCI addresses are assigned in the virDomainCreate - * or virDomainDefine methods. We might still need to assign - * some here to cope with the question of upgrades. Regardless - * we also need to populate the PCI address set cache for later - * use in hotplug - */ - VIR_DEBUG("Assigning domain PCI addresses"); - if ((qemuDomainAssignAddresses(vm->def, priv->qemuCaps, - driver, vm, false)) < 0) { - goto error; - } - - if ((timestamp = virTimeStringNow()) == NULL) - goto error; - - qemuDomainLogContextWrite(logCtxt, "%s: attaching\n", timestamp); - VIR_FREE(timestamp); - - qemuDomainObjTaint(driver, vm, VIR_DOMAIN_TAINT_EXTERNAL_LAUNCH, logCtxt); - - VIR_DEBUG("Waiting for monitor to show up"); - if (qemuProcessWaitForMonitor(driver, vm, QEMU_ASYNC_JOB_NONE, NULL) < 0) - goto error; - - if (qemuConnectAgent(driver, vm) < 0) - goto error; - - VIR_DEBUG("Detecting VCPU PIDs"); - if (qemuDomainRefreshVcpuInfo(driver, vm, QEMU_ASYNC_JOB_NONE, false) < 0) - goto error; - - if (qemuDomainValidateVcpuInfo(vm) < 0) - goto error; - - VIR_DEBUG("Detecting IOThread PIDs"); - if (qemuProcessDetectIOThreadPIDs(driver, vm, QEMU_ASYNC_JOB_NONE) < 0) - goto error; - - VIR_DEBUG("Getting initial memory amount"); - qemuDomainObjEnterMonitor(driver, vm); - if (qemuMonitorGetBalloonInfo(priv->mon, &vm->def->mem.cur_balloon) < 0) - goto exit_monitor; - if (qemuMonitorGetStatus(priv->mon, &running, &reason) < 0) - goto exit_monitor; - if (qemuMonitorGetVirtType(priv->mon, &virtType) < 0) - goto exit_monitor; - vm->def->virtType = virtType; - if (qemuDomainObjExitMonitor(driver, vm) < 0) - goto error; - - if (running) { - virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, - VIR_DOMAIN_RUNNING_UNPAUSED); - if (virDomainDefHasMemballoon(vm->def) && - vm->def->memballoon->period) { - qemuDomainObjEnterMonitor(driver, vm); - qemuMonitorSetMemoryStatsPeriod(priv->mon, vm->def->memballoon, - vm->def->memballoon->period); - if (qemuDomainObjExitMonitor(driver, vm) < 0) - goto error; - } - } else { - virDomainObjSetState(vm, VIR_DOMAIN_PAUSED, reason); - } - - VIR_DEBUG("Writing domain status to disk"); - if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) - goto error; - - /* Run an hook to allow admins to do some magic */ - if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { - char *xml = qemuDomainDefFormatXML(driver, vm->def, 0); - int hookret; - - hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name, - VIR_HOOK_QEMU_OP_ATTACH, VIR_HOOK_SUBOP_BEGIN, - NULL, xml, NULL); - VIR_FREE(xml); - - /* - * If the script raised an error abort the launch - */ - if (hookret < 0) - goto error; - } - - virObjectUnref(logCtxt); - VIR_FREE(seclabel); - VIR_FREE(sec_managers); - virObjectUnref(cfg); - virObjectUnref(caps); - - return 0; - - exit_monitor: - ignore_value(qemuDomainObjExitMonitor(driver, vm)); - error: - /* We jump here if we failed to attach to the VM for any reason. - * Leave the domain running, but pretend we never attempted to - * attach to it. */ - if (active && virAtomicIntDecAndTest(&driver->nactive) && - driver->inhibitCallback) - driver->inhibitCallback(false, driver->inhibitOpaque); - - qemuMonitorClose(priv->mon); - priv->mon = NULL; - virObjectUnref(logCtxt); - VIR_FREE(seclabel); - VIR_FREE(sec_managers); - if (seclabelgen) - virSecurityLabelDefFree(seclabeldef); - virObjectUnref(priv->monConfig); - priv->monConfig = NULL; - virObjectUnref(cfg); - virObjectUnref(caps); - return -1; -} - - static void qemuProcessAutoDestroy(virDomainObjPtr dom, virConnectPtr conn, diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h index d20bd5306e..8a6cb94a1e 100644 --- a/src/qemu/qemu_process.h +++ b/src/qemu/qemu_process.h @@ -154,14 +154,6 @@ void qemuProcessStop(virQEMUDriverPtr driver, qemuDomainAsyncJob asyncJob, unsigned int flags); -int qemuProcessAttach(virConnectPtr conn, - virQEMUDriverPtr driver, - virDomainObjPtr vm, - pid_t pid, - const char *pidfile, - virDomainChrSourceDefPtr monConfig, - bool monJSON); - typedef enum { VIR_QEMU_PROCESS_KILL_FORCE = 1 << 0, VIR_QEMU_PROCESS_KILL_NOWAIT = 1 << 1, -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:30 +0200, Ján Tomko wrote:
Now that the virDomainQemuAttach API returns an error, we can remove the unused qemuProcessAttach function as well, deleting the only user that possibly could have requested to open a non-JSON monitor.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_process.c | 243 ---------------------------------------- src/qemu/qemu_process.h | 8 -- 2 files changed, 251 deletions(-)
ACK

Now that we no longer support the HMP monitor, remove some dead code. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_command.c | 8 +++----- src/qemu/qemu_domain.c | 10 ++++------ src/qemu/qemu_driver.c | 3 +-- src/qemu/qemu_migration.c | 21 +++++++-------------- src/qemu/qemu_process.c | 2 +- 5 files changed, 16 insertions(+), 28 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 59dc134785..e5dad5f7ab 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5911,9 +5911,7 @@ qemuBuildMonitorCommandLine(virLogManagerPtr logManager, VIR_FREE(chrdev); virCommandAddArg(cmd, "-mon"); - virCommandAddArgFormat(cmd, - "chardev=charmonitor,id=monitor,mode=%s", - priv->monJSON ? "control" : "readline"); + virCommandAddArg(cmd, "chardev=charmonitor,id=monitor,mode=control"); return 0; } @@ -10668,9 +10666,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver, virQEMUCapsPtr qemuCaps = priv->qemuCaps; bool chardevStdioLogd = priv->chardevStdioLogd; - VIR_DEBUG("driver=%p def=%p mon=%p json=%d " + VIR_DEBUG("driver=%p def=%p mon=%p " "qemuCaps=%p migrateURI=%s snapshot=%p vmop=%d", - driver, def, priv->monConfig, priv->monJSON, + driver, def, priv->monConfig, qemuCaps, migrateURI, snapshot, vmop); if (qemuBuildCommandLineValidate(driver, def) < 0) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8f754fbf06..84c777827a 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2483,8 +2483,7 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, } virBufferEscapeString(buf, "<monitor path='%s'", monitorpath); - if (priv->monJSON) - virBufferAddLit(buf, " json='1'"); + virBufferAddLit(buf, " json='1'"); virBufferAsprintf(buf, " type='%s'/>\n", virDomainChrTypeToString(priv->monConfig->type)); } @@ -14251,9 +14250,8 @@ qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason) /* qemuDomainIsUsingNoShutdown: * @priv: Domain private data * - * If JSON monitor is enabled, we can receive an event when QEMU stops. If - * we use no-shutdown, then we can watch for this event and do a soft/warm - * reboot. + * We can receive an event when QEMU stops. If we use no-shutdown, then + * we can watch for this event and do a soft/warm reboot. * * Returns: @true when -no-shutdown either should be or was added to the * command line. @@ -14261,7 +14259,7 @@ qemuDomainRunningReasonToResumeEvent(virDomainRunningReason reason) bool qemuDomainIsUsingNoShutdown(qemuDomainObjPrivatePtr priv) { - return priv->monJSON && priv->allowReboot == VIR_TRISTATE_BOOL_YES; + return priv->allowReboot == VIR_TRISTATE_BOOL_YES; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7279b20d2e..082871c38d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4729,8 +4729,7 @@ processMonitorEOFEvent(virQEMUDriverPtr driver, goto endjob; } - if (priv->monJSON && - virDomainObjGetState(vm, NULL) != VIR_DOMAIN_SHUTDOWN) { + if (virDomainObjGetState(vm, NULL) != VIR_DOMAIN_SHUTDOWN) { VIR_DEBUG("Monitor connection to '%s' closed without SHUTDOWN event; " "assuming the domain crashed", vm->def->name); eventReason = VIR_DOMAIN_EVENT_STOPPED_FAILED; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 83035df5b0..2436f5051b 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3604,21 +3604,14 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver, } /* When migration completed, QEMU will have paused the CPUs for us. - * Wait for the STOP event to be processed or explicitly stop CPUs - * (for old QEMU which does not send events) to release the lock state. + * Wait for the STOP event to be processed to release the lock state. */ - if (priv->monJSON) { - while (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { - priv->signalStop = true; - rc = virDomainObjWait(vm); - priv->signalStop = false; - if (rc < 0) - goto error; - } - } else if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING && - qemuProcessStopCPUs(driver, vm, VIR_DOMAIN_PAUSED_MIGRATION, - QEMU_ASYNC_JOB_MIGRATION_OUT) < 0) { - goto error; + while (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) { + priv->signalStop = true; + rc = virDomainObjWait(vm); + priv->signalStop = false; + if (rc < 0) + goto error; } if (mig->nbd && diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 473b7c2fe2..bf6b76413c 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1895,7 +1895,7 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob, mon = qemuMonitorOpen(vm, monConfig, - priv->monJSON, + true, retry, timeout, &monitorCallbacks, -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:31 +0200, Ján Tomko wrote:
Now that we no longer support the HMP monitor, remove some dead code.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_command.c | 8 +++----- src/qemu/qemu_domain.c | 10 ++++------ src/qemu/qemu_driver.c | 3 +-- src/qemu/qemu_migration.c | 21 +++++++-------------- src/qemu/qemu_process.c | 2 +- 5 files changed, 16 insertions(+), 28 deletions(-)
ACK

If we have a monitor, it is a JSON monitor. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_domain.c | 3 --- src/qemu/qemu_domain.h | 1 - src/qemu/qemu_process.c | 1 - tests/qemuhotplugtest.c | 2 -- 4 files changed, 7 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 84c777827a..0b88b1b98b 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2904,9 +2904,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, priv->monConfig->type = VIR_DOMAIN_CHR_TYPE_PTY; VIR_FREE(tmp); - priv->monJSON = virXPathBoolean("count(./monitor[@json = '1']) > 0", - ctxt) > 0; - switch (priv->monConfig->type) { case VIR_DOMAIN_CHR_TYPE_PTY: priv->monConfig->data.file.path = monitorpath; diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index f92f0dbc27..a9d36ff5a5 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -281,7 +281,6 @@ struct _qemuDomainObjPrivate { qemuMonitorPtr mon; virDomainChrSourceDefPtr monConfig; - bool monJSON; bool monError; unsigned long long monStart; diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index bf6b76413c..def60596b0 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -6177,7 +6177,6 @@ qemuProcessPrepareDomain(virQEMUDriverPtr driver, if (qemuProcessPrepareMonitorChr(priv->monConfig, priv->libDir) < 0) goto cleanup; - priv->monJSON = true; priv->monError = false; priv->monStart = 0; priv->runningReason = VIR_DOMAIN_RUNNING_UNKNOWN; diff --git a/tests/qemuhotplugtest.c b/tests/qemuhotplugtest.c index bfbf32baa4..e162b1d8db 100644 --- a/tests/qemuhotplugtest.c +++ b/tests/qemuhotplugtest.c @@ -298,7 +298,6 @@ testQemuHotplug(const void *data) priv = vm->privateData; priv->mon = qemuMonitorTestGetMonitor(test_mon); - priv->monJSON = true; /* XXX We need to unlock the monitor here, as * qemuDomainObjEnterMonitorInternal (called from qemuDomainChangeGraphics) @@ -441,7 +440,6 @@ testQemuHotplugCpuPrepare(const char *test, goto error; priv->mon = qemuMonitorTestGetMonitor(data->mon); - priv->monJSON = true; virObjectUnlock(priv->mon); if (qemuDomainRefreshVcpuInfo(&driver, data->vm, 0, false) < 0) -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:32 +0200, Ján Tomko wrote:
If we have a monitor, it is a JSON monitor.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_domain.c | 3 --- src/qemu/qemu_domain.h | 1 - src/qemu/qemu_process.c | 1 - tests/qemuhotplugtest.c | 2 -- 4 files changed, 7 deletions(-)
ACK

For quite some time now it is impossible to connect to a domain using a HMP monitor, so there is no point in formatting it in the status XML. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_domain.c | 1 - tests/qemustatusxml2xmldata/blockjob-mirror-in.xml | 2 +- tests/qemustatusxml2xmldata/disk-secinfo-upgrade-out.xml | 2 +- tests/qemustatusxml2xmldata/migration-in-params-in.xml | 2 +- tests/qemustatusxml2xmldata/migration-out-nbd-out.xml | 2 +- tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml | 2 +- tests/qemustatusxml2xmldata/migration-out-params-in.xml | 2 +- tests/qemustatusxml2xmldata/modern-in.xml | 2 +- tests/qemustatusxml2xmldata/vcpus-multi-in.xml | 2 +- 9 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0b88b1b98b..61778481f3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2483,7 +2483,6 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, } virBufferEscapeString(buf, "<monitor path='%s'", monitorpath); - virBufferAddLit(buf, " json='1'"); virBufferAsprintf(buf, " type='%s'/>\n", virDomainChrTypeToString(priv->monConfig->type)); } diff --git a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml index df23ac00aa..0fba3b69e7 100644 --- a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml +++ b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml @@ -1,6 +1,6 @@ <domstatus state='running' reason='booted' pid='3803518'> <taint flag='high-privileges'/> - <monitor path='/var/lib/libvirt/qemu/test.monitor' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/test.monitor' type='unix'/> <vcpus> <vcpu id='0' pid='3803519'/> </vcpus> diff --git a/tests/qemustatusxml2xmldata/disk-secinfo-upgrade-out.xml b/tests/qemustatusxml2xmldata/disk-secinfo-upgrade-out.xml index 7a26e93aa4..3d5e8f1438 100644 --- a/tests/qemustatusxml2xmldata/disk-secinfo-upgrade-out.xml +++ b/tests/qemustatusxml2xmldata/disk-secinfo-upgrade-out.xml @@ -1,5 +1,5 @@ <domstatus state='running' reason='booted' pid='195139'> - <monitor path='/var/lib/libvirt/qemu/domain-1-upstream/monitor.sock' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/domain-1-upstream/monitor.sock' type='unix'/> <namespaces> <mount/> </namespaces> diff --git a/tests/qemustatusxml2xmldata/migration-in-params-in.xml b/tests/qemustatusxml2xmldata/migration-in-params-in.xml index 03f18b4f3d..80cc4b4666 100644 --- a/tests/qemustatusxml2xmldata/migration-in-params-in.xml +++ b/tests/qemustatusxml2xmldata/migration-in-params-in.xml @@ -1,7 +1,7 @@ <domstatus state='paused' reason='migration' pid='2296'> <taint flag='high-privileges'/> <taint flag='host-cpu'/> - <monitor path='/var/lib/libvirt/qemu/domain-1-nest/monitor.sock' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/domain-1-nest/monitor.sock' type='unix'/> <namespaces> <mount/> </namespaces> diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml index 315d8e4c1a..455c30be85 100644 --- a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml +++ b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml @@ -1,6 +1,6 @@ <domstatus state='running' reason='booted' pid='15433'> <taint flag='high-privileges'/> - <monitor path='/var/lib/libvirt/qemu/domain-4-upstream/monitor.sock' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/domain-4-upstream/monitor.sock' type='unix'/> <vcpus> <vcpu id='0' pid='15449'/> <vcpu id='1' pid='15450'/> diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml index 869f37d488..409e97a918 100644 --- a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml +++ b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml @@ -1,6 +1,6 @@ <domstatus state='running' reason='booted' pid='68472'> <taint flag='high-privileges'/> - <monitor path='/var/lib/libvirt/qemu/domain-3-upstream/monitor.sock' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/domain-3-upstream/monitor.sock' type='unix'/> <namespaces> <mount/> </namespaces> diff --git a/tests/qemustatusxml2xmldata/migration-out-params-in.xml b/tests/qemustatusxml2xmldata/migration-out-params-in.xml index ae2064830a..4a660281d2 100644 --- a/tests/qemustatusxml2xmldata/migration-out-params-in.xml +++ b/tests/qemustatusxml2xmldata/migration-out-params-in.xml @@ -1,7 +1,7 @@ <domstatus state='paused' reason='migration' pid='21586'> <taint flag='high-privileges'/> <taint flag='host-cpu'/> - <monitor path='/var/lib/libvirt/qemu/domain-7-nest/monitor.sock' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/domain-7-nest/monitor.sock' type='unix'/> <namespaces> <mount/> </namespaces> diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml index 08f7f40761..6ce0f96f54 100644 --- a/tests/qemustatusxml2xmldata/modern-in.xml +++ b/tests/qemustatusxml2xmldata/modern-in.xml @@ -1,6 +1,6 @@ <domstatus state='running' reason='booted' pid='195139'> <taint flag='high-privileges'/> - <monitor path='/var/lib/libvirt/qemu/domain-1-upstream/monitor.sock' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/domain-1-upstream/monitor.sock' type='unix'/> <namespaces> <mount/> </namespaces> diff --git a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml index c99046ce8d..b8ec650714 100644 --- a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml +++ b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml @@ -1,6 +1,6 @@ <domstatus state='running' reason='booted' pid='3803518'> <taint flag='high-privileges'/> - <monitor path='/var/lib/libvirt/qemu/test.monitor' json='1' type='unix'/> + <monitor path='/var/lib/libvirt/qemu/test.monitor' type='unix'/> <vcpus> <vcpu id='0' pid='3803519'/> <vcpu id='1' pid='3803520'/> -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:33 +0200, Ján Tomko wrote:
For quite some time now it is impossible to connect to a domain using a HMP monitor, so there is no point in formatting it in the status XML.
Signed-off-by: Ján Tomko <jtomko@redhat.com> ---
ACK but please push it in the next release cycle so that we have some time when we can use "downgrade". It's not supported but helps when developing when switching between the released and git version.

On Thu, Jun 20, 2019 at 12:51:57PM +0200, Peter Krempa wrote:
On Sat, Jun 15, 2019 at 14:11:33 +0200, Ján Tomko wrote:
For quite some time now it is impossible to connect to a domain using a HMP monitor, so there is no point in formatting it in the status XML.
Signed-off-by: Ján Tomko <jtomko@redhat.com> ---
ACK but please push it in the next release cycle so that we have some time when we can use "downgrade". It's not supported but helps when developing when switching between the released and git version.
Now pushed. Jano

Always assume JSON monitor was requested, since all the callers pass true anyway. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 13 ++++--------- src/qemu/qemu_monitor.h | 2 -- src/qemu/qemu_process.c | 3 +-- tests/qemumonitortestutils.c | 1 - 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index d9d076633d..87804e0956 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -809,7 +809,6 @@ static qemuMonitorPtr qemuMonitorOpenInternal(virDomainObjPtr vm, int fd, bool hasSendFD, - bool json, qemuMonitorCallbacksPtr cb, void *opaque) { @@ -840,9 +839,8 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, mon->fd = fd; mon->hasSendFD = hasSendFD; mon->vm = virObjectRef(vm); - mon->json = json; - if (json) - mon->waitGreeting = true; + mon->json = true; + mon->waitGreeting = true; mon->cb = cb; mon->callbackOpaque = opaque; @@ -893,7 +891,6 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, * 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 @@ -909,7 +906,6 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, virDomainChrSourceDefPtr config, - bool json, bool retry, unsigned long long timeout, qemuMonitorCallbacksPtr cb, @@ -941,7 +937,7 @@ qemuMonitorOpen(virDomainObjPtr vm, return NULL; } - ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, json, cb, opaque); + ret = qemuMonitorOpenInternal(vm, fd, hasSendFD, cb, opaque); if (!ret) VIR_FORCE_CLOSE(fd); return ret; @@ -951,11 +947,10 @@ qemuMonitorOpen(virDomainObjPtr vm, qemuMonitorPtr qemuMonitorOpenFD(virDomainObjPtr vm, int sockfd, - bool json, qemuMonitorCallbacksPtr cb, void *opaque) { - return qemuMonitorOpenInternal(vm, sockfd, true, json, cb, opaque); + return qemuMonitorOpenInternal(vm, sockfd, true, cb, opaque); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index a19d6069c6..cab13c9e6e 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -340,7 +340,6 @@ char *qemuMonitorUnescapeArg(const char *in); qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, virDomainChrSourceDefPtr config, - bool json, bool retry, unsigned long long timeout, qemuMonitorCallbacksPtr cb, @@ -348,7 +347,6 @@ qemuMonitorPtr qemuMonitorOpen(virDomainObjPtr vm, ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(6); qemuMonitorPtr qemuMonitorOpenFD(virDomainObjPtr vm, int sockfd, - bool json, qemuMonitorCallbacksPtr cb, void *opaque) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(4); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index def60596b0..cf0566a517 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -1895,7 +1895,6 @@ qemuConnectMonitor(virQEMUDriverPtr driver, virDomainObjPtr vm, int asyncJob, mon = qemuMonitorOpen(vm, monConfig, - true, retry, timeout, &monitorCallbacks, @@ -8447,7 +8446,7 @@ qemuProcessQMPConnectMonitor(qemuProcessQMPPtr proc) proc->vm->pid = proc->pid; - if (!(proc->mon = qemuMonitorOpen(proc->vm, &monConfig, true, true, + if (!(proc->mon = qemuMonitorOpen(proc->vm, &monConfig, true, 0, &callbacks, NULL))) goto cleanup; diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c index 8d7c503c6e..e8bcd892ad 100644 --- a/tests/qemumonitortestutils.c +++ b/tests/qemumonitortestutils.c @@ -1263,7 +1263,6 @@ qemuMonitorTestNew(bool json, test->qapischema = schema; if (!(test->mon = qemuMonitorOpen(test->vm, &src, - json, true, 0, &qemuMonitorTestCallbacks, -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:34 +0200, Ján Tomko wrote:
Always assume JSON monitor was requested, since all the callers pass true anyway.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 13 ++++--------- src/qemu/qemu_monitor.h | 2 -- src/qemu/qemu_process.c | 3 +-- tests/qemumonitortestutils.c | 1 - 4 files changed, 5 insertions(+), 14 deletions(-)
ACK

In preparation to removing the json field from qemuMonitor, stop checking for it in QEMU_CHECK_MONITOR. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 87804e0956..30c1b1e596 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -133,13 +133,7 @@ struct _qemuMonitor { _("monitor must not be NULL")); \ exit; \ } \ - VIR_DEBUG("mon:%p vm:%p json:%d fd:%d", \ - mon, mon->vm, mon->json, mon->fd); \ - if (!mon->json) { \ - virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", \ - _("JSON monitor is required")); \ - exit; \ - } \ + VIR_DEBUG("mon:%p vm:%p fd:%d", mon, mon->vm, mon->fd); \ } while (0) /* Check monitor and return NULL on error */ -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:35 +0200, Ján Tomko wrote:
In preparation to removing the json field from qemuMonitor, stop checking for it in QEMU_CHECK_MONITOR.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-)
ACK

Remove all the mon->json checks in qemuMonitor functions. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 84 ++++++++++++----------------------------- 1 file changed, 25 insertions(+), 59 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 30c1b1e596..ab2b54e002 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1197,7 +1197,7 @@ qemuMonitorInitBalloonObjectPath(qemuMonitorPtr mon, /** * To update video memory size in status XML we need to load correct values from - * QEMU. This is supported only with JSON monitor. + * QEMU. * * Returns 0 on success, -1 on failure and sets proper error message. */ @@ -1211,29 +1211,25 @@ qemuMonitorUpdateVideoMemorySize(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) { - ret = qemuMonitorJSONFindLinkPath(mon, videoName, - video->info.alias, &path); - if (ret < 0) { - if (ret == -2) - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to find QOM Object path for " - "device '%s'"), videoName); - return -1; - } - - ret = qemuMonitorJSONUpdateVideoMemorySize(mon, video, path); - VIR_FREE(path); - return ret; + ret = qemuMonitorJSONFindLinkPath(mon, videoName, + video->info.alias, &path); + if (ret < 0) { + if (ret == -2) + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to find QOM Object path for " + "device '%s'"), videoName); + return -1; } - return 0; + ret = qemuMonitorJSONUpdateVideoMemorySize(mon, video, path); + VIR_FREE(path); + return ret; } /** * To update video vram64 size in status XML we need to load correct value from - * QEMU. This is supported only with JSON monitor. + * QEMU. * * Returns 0 on success, -1 on failure and sets proper error message. */ @@ -1247,23 +1243,19 @@ qemuMonitorUpdateVideoVram64Size(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (mon->json) { - ret = qemuMonitorJSONFindLinkPath(mon, videoName, - video->info.alias, &path); - if (ret < 0) { - if (ret == -2) - virReportError(VIR_ERR_INTERNAL_ERROR, - _("Failed to find QOM Object path for " - "device '%s'"), videoName); - return -1; - } - - ret = qemuMonitorJSONUpdateVideoVram64Size(mon, video, path); - VIR_FREE(path); - return ret; + ret = qemuMonitorJSONFindLinkPath(mon, videoName, + video->info.alias, &path); + if (ret < 0) { + if (ret == -2) + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Failed to find QOM Object path for " + "device '%s'"), videoName); + return -1; } - return 0; + ret = qemuMonitorJSONUpdateVideoVram64Size(mon, video, path); + VIR_FREE(path); + return ret; } @@ -1700,9 +1692,6 @@ qemuMonitorSetCapabilities(qemuMonitorPtr mon) { QEMU_CHECK_MONITOR(mon); - if (!mon->json) - return 0; - return qemuMonitorJSONSetCapabilities(mon); } @@ -2015,9 +2004,6 @@ qemuMonitorGetCPUInfo(qemuMonitorPtr mon, if (VIR_ALLOC_N(info, maxvcpus) < 0) return -1; - if (!mon->json) - hotplug = false; - /* initialize a few non-zero defaults */ qemuMonitorCPUInfoClear(info, maxvcpus); @@ -2168,9 +2154,6 @@ qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon, if (!mon) return -1; - if (!mon->json) - return -1; - if (period < 0) return -1; @@ -2696,10 +2679,6 @@ qemuMonitorGetDumpGuestMemoryCapability(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - /* No capability is supported without JSON monitor */ - if (!mon->json) - return 0; - return qemuMonitorJSONGetDumpGuestMemoryCapability(mon, capability); } @@ -3303,7 +3282,7 @@ qemuMonitorBlockCommit(qemuMonitorPtr mon, const char *device, bool qemuMonitorSupportsActiveCommit(qemuMonitorPtr mon) { - if (!mon || !mon->json) + if (!mon) return false; return qemuMonitorJSONSupportsActiveCommit(mon); @@ -3854,10 +3833,6 @@ qemuMonitorGetMigrationCapabilities(qemuMonitorPtr mon, { QEMU_CHECK_MONITOR(mon); - /* No capability is supported without JSON monitor */ - if (!mon->json) - return 0; - return qemuMonitorJSONGetMigrationCapabilities(mon, capabilities); } @@ -4139,12 +4114,6 @@ qemuMonitorGetIOThreads(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - /* Requires JSON to make the query */ - if (!mon->json) { - *iothreads = NULL; - return 0; - } - return qemuMonitorJSONGetIOThreads(mon, iothreads); } @@ -4191,9 +4160,6 @@ qemuMonitorGetMemoryDeviceInfo(qemuMonitorPtr mon, QEMU_CHECK_MONITOR(mon); - if (!mon->json) - return -2; - if (!(*info = virHashCreate(10, virHashValueFree))) return -1; -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:36 +0200, Ján Tomko wrote:
Remove all the mon->json checks in qemuMonitor functions.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 84 ++++++++++++----------------------------- 1 file changed, 25 insertions(+), 59 deletions(-)
ACK

Now that it is no longer used, remove it. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index ab2b54e002..f19bbea8b9 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -101,7 +101,6 @@ struct _qemuMonitor { int nextSerial; - bool json; bool waitGreeting; /* cache of query-command-line-options results */ @@ -833,7 +832,6 @@ qemuMonitorOpenInternal(virDomainObjPtr vm, mon->fd = fd; mon->hasSendFD = hasSendFD; mon->vm = virObjectRef(vm); - mon->json = true; mon->waitGreeting = true; mon->cb = cb; mon->callbackOpaque = opaque; -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:37 +0200, Ján Tomko wrote:
Now that it is no longer used, remove it.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 2 -- 1 file changed, 2 deletions(-)
ACK

Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index f19bbea8b9..1b2773c60a 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1205,7 +1205,7 @@ qemuMonitorUpdateVideoMemorySize(qemuMonitorPtr mon, const char *videoName) { int ret = -1; - char *path = NULL; + VIR_AUTOFREE(char *) path = NULL; QEMU_CHECK_MONITOR(mon); @@ -1219,9 +1219,7 @@ qemuMonitorUpdateVideoMemorySize(qemuMonitorPtr mon, return -1; } - ret = qemuMonitorJSONUpdateVideoMemorySize(mon, video, path); - VIR_FREE(path); - return ret; + return qemuMonitorJSONUpdateVideoMemorySize(mon, video, path); } @@ -1237,7 +1235,7 @@ qemuMonitorUpdateVideoVram64Size(qemuMonitorPtr mon, const char *videoName) { int ret = -1; - char *path = NULL; + VIR_AUTOFREE(char *) path = NULL; QEMU_CHECK_MONITOR(mon); @@ -1251,9 +1249,7 @@ qemuMonitorUpdateVideoVram64Size(qemuMonitorPtr mon, return -1; } - ret = qemuMonitorJSONUpdateVideoVram64Size(mon, video, path); - VIR_FREE(path); - return ret; + return qemuMonitorJSONUpdateVideoVram64Size(mon, video, path); } -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:38 +0200, Ján Tomko wrote:
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
ACK

Use 'rc' to temporarily store the subfunction return values, instead of ret. Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 1b2773c60a..d79e6e921c 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1204,15 +1204,15 @@ qemuMonitorUpdateVideoMemorySize(qemuMonitorPtr mon, virDomainVideoDefPtr video, const char *videoName) { - int ret = -1; + int rc = -1; VIR_AUTOFREE(char *) path = NULL; QEMU_CHECK_MONITOR(mon); - ret = qemuMonitorJSONFindLinkPath(mon, videoName, - video->info.alias, &path); - if (ret < 0) { - if (ret == -2) + rc = qemuMonitorJSONFindLinkPath(mon, videoName, + video->info.alias, &path); + if (rc < 0) { + if (rc == -2) virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to find QOM Object path for " "device '%s'"), videoName); @@ -1234,15 +1234,15 @@ qemuMonitorUpdateVideoVram64Size(qemuMonitorPtr mon, virDomainVideoDefPtr video, const char *videoName) { - int ret = -1; + int rc = -1; VIR_AUTOFREE(char *) path = NULL; QEMU_CHECK_MONITOR(mon); - ret = qemuMonitorJSONFindLinkPath(mon, videoName, - video->info.alias, &path); - if (ret < 0) { - if (ret == -2) + rc = qemuMonitorJSONFindLinkPath(mon, videoName, + video->info.alias, &path); + if (rc < 0) { + if (rc == -2) virReportError(VIR_ERR_INTERNAL_ERROR, _("Failed to find QOM Object path for " "device '%s'"), videoName); -- 2.20.1

On Sat, Jun 15, 2019 at 14:11:39 +0200, Ján Tomko wrote:
Use 'rc' to temporarily store the subfunction return values, instead of ret.
Signed-off-by: Ján Tomko <jtomko@redhat.com> --- src/qemu/qemu_monitor.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
ACK
participants (2)
-
Ján Tomko
-
Peter Krempa