[libvirt] [PATCH 8/8] Implement code to attach to external QEMU instances.
Daniel P. Berrange
berrange at redhat.com
Fri Jul 8 12:22:43 UTC 2011
On Tue, Jul 05, 2011 at 03:09:23PM +0200, Matthias Bolte wrote:
> 2011/7/4 Daniel P. Berrange <berrange at redhat.com>:
> > Given a PID, the QEMU driver reads /proc/$PID/cmdline and
> > /proc/$PID/environ to get the configuration. This is fed
> > into the ARGV->XML convertor to build an XML configuration
> > for the process.
> >
> > /proc/$PID/exe is resolved to identify the full command
> > binary path
> >
> > After checking for name/uuid uniqueness, an attempt is
> > made to connect to the monitor socket. If successful
> > then 'info status' and 'info kvm' are issued to determine
> > whether the CPUs are running and if KVM is enabled.
> >
> > * src/qemu/qemu_driver.c: Implement virDomainQemuAttach
> > * src/qemu/qemu_process.h, src/qemu/qemu_process.c: Add
> > qemuProcessAttach to connect to the monitor of an
> > existing QEMU process
> > ---
> > src/conf/domain_conf.c | 3 +-
> > src/conf/domain_conf.h | 1 +
> > src/qemu/qemu_command.c | 2 +
> > src/qemu/qemu_driver.c | 91 +++++++++++++++++++-
> > src/qemu/qemu_process.c | 218 ++++++++++++++++++++++++++++++++++++++++++++---
> > src/qemu/qemu_process.h | 8 ++
> > 6 files changed, 308 insertions(+), 15 deletions(-)
>
> > static int
> > qemuDomainOpenConsole(virDomainPtr dom,
> > const char *devname,
> > @@ -8539,6 +8625,7 @@ static virDriver qemuDriver = {
> > .domainRevertToSnapshot = qemuDomainRevertToSnapshot, /* 0.8.0 */
> > .domainSnapshotDelete = qemuDomainSnapshotDelete, /* 0.8.0 */
> > .qemuDomainMonitorCommand = qemuDomainMonitorCommand, /* 0.8.3 */
> > + .qemuDomainAttach = qemuDomainAttach, /* 0.9.3 */
>
> s/0.9.3/0.9.4/
>
> > +int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
> > + struct qemud_driver *driver,
> > + virDomainObjPtr vm,
> > + int pid,
> > + const char *pidfile,
> > + virDomainChrSourceDefPtr monConfig,
> > + bool monJSON)
> > +{
> > + char ebuf[1024];
> > + int logfile = -1;
> > + char *timestamp;
> > + qemuDomainObjPrivatePtr priv = vm->privateData;
> > + bool running = true;
> > + virSecurityLabelPtr seclabel = NULL;
> > +
> > + VIR_DEBUG("Beginning VM attach process");
> > +
> > + if (virDomainObjIsActive(vm)) {
> > + qemuReportError(VIR_ERR_OPERATION_INVALID,
> > + "%s", _("VM is already active"));
> > + return -1;
> > + }
> > +
> > + /* 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(driver->caps, vm, true) < 0)
> > + goto cleanup;
> > +
> > + vm->def->id = driver->nextvmid++;
> > +
> > + if (virFileMakePath(driver->logDir) != 0) {
> > + virReportSystemError(errno,
> > + _("cannot create log directory %s"),
> > + driver->logDir);
> > + goto cleanup;
> > + }
>
> This doesn't work as virFileMakePath doesn't set errno for all errors,
> but returns an errno value. Needs to be something like this
>
> int err;
> if ((err = virFileMakePath(driver->logDir)) != 0) {
> virReportSystemError(err,
> _("cannot create log directory %s"),
> driver->logDir);
> goto cleanup;
> }
>
> Also grep'ing for virFileMakePath shows that there are many instances
> that use virFileMakePath in the wrong way.
THis has since been fixed.
> > + if (VIR_ALLOC(priv->monConfig) < 0) {
> > + virReportOOMError();
> > + goto cleanup;
> > + }
> > +
> > + VIR_DEBUG("Preparing monitor state");
> > + priv->monConfig = monConfig;
>
> Allocating and overwriting priv->monConfig leaks memory here.
Fixed that too
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list