On Wed, Mar 09, 2011 at 06:45:46PM -0700, Eric Blake wrote: > This allows direct saves (no compression, no root-squash NFS) to use > the more efficient fd: migration, which in turn avoids a race where > qemu exec: migration can sometimes fail because qemu does a generic > waitpid() that conflicts with the pclose() used by exec:. Further > patches will solve compression and root-squash NFS. > > * src/qemu/qemu_driver.c (qemudDomainSaveFlag): Use new function > when there is no compression. > --- > src/qemu/qemu_driver.c | 26 +++++++++++++++++++++++--- > 1 files changed, 23 insertions(+), 3 deletions(-) > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c > index 2d11da8..c4d3c85 100644 > --- a/src/qemu/qemu_driver.c > +++ b/src/qemu/qemu_driver.c > @@ -1790,6 +1790,7 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver, virDomainPtr dom, > int is_reg = 0; > unsigned long long offset; > virCgroupPtr cgroup = NULL; > + virBitmapPtr qemuCaps = NULL; > > memset(&header, 0, sizeof(header)); > memcpy(header.magic, QEMUD_SAVE_MAGIC, sizeof(header.magic)); > @@ -1820,6 +1821,11 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver, virDomainPtr dom, > } > } > > + if (qemuCapsExtractVersionInfo(vm->def->emulator, vm->def->os.arch, > + NULL, > + &qemuCaps) < 0) > + goto endjob; > + > /* Get XML for the domain */ > xml = virDomainDefFormat(vm->def, VIR_DOMAIN_XML_SECURE); > if (!xml) { > @@ -1980,10 +1986,23 @@ static int qemudDomainSaveFlag(struct qemud_driver *driver, virDomainPtr dom, > > if (header.compressed == QEMUD_SAVE_FORMAT_RAW) { > const char *args[] = { "cat", NULL }; > + /* XXX gross - why don't we reuse the fd already opened earlier */ > + int fd = -1; > + > + if (qemuCapsGet(qemuCaps, QEMU_CAPS_MIGRATE_QEMU_FD) && > + priv->monConfig->type == VIR_DOMAIN_CHR_TYPE_UNIX) > + fd = open(path, O_WRONLY); Ok, so this is the bit which causes a regression on NFS rootsquash, if the path isn't readable by root. > qemuDomainObjEnterMonitorWithDriver(driver, vm); > - rc = qemuMonitorMigrateToFile(priv->mon, > - QEMU_MONITOR_MIGRATE_BACKGROUND, > - args, path, offset); > + if (fd >= 0 && lseek(fd, offset, SEEK_SET) == offset) { > + rc = qemuMonitorMigrateToFd(priv->mon, > + QEMU_MONITOR_MIGRATE_BACKGROUND, > + fd); > + } else { > + rc = qemuMonitorMigrateToFile(priv->mon, > + QEMU_MONITOR_MIGRATE_BACKGROUND, > + args, path, offset); > + } > + VIR_FORCE_CLOSE(fd); > qemuDomainObjExitMonitorWithDriver(driver, vm); > } else { > const char *prog = qemudSaveCompressionTypeToString(header.compressed); 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 :| -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list