On 11/22/2010 11:09 AM, Daniel P. Berrange wrote:
Perform a handshake during QEMU startup to allow file relabelling
to be performed after QEMU has been forked, but before it has
been exec'd. This is to allow the lock manager to acquire locks
against the QEMU pid, before relabelling takes place
* src/qemu/qemu_driver.c: Handshake during QEMU startup
---
src/qemu/qemu_driver.c | 23 ++++++++++++++---------
1 files changed, 14 insertions(+), 9 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 0b0b6fe..bf6cd0e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3683,9 +3683,6 @@ static int qemudSecurityHook(void *data) {
if (virSecurityManagerSetProcessLabel(h->driver->securityManager, h->vm)
< 0)
goto cleanup;
- /* XXX temp hack to let disk labelling complete */
- sleep(10);
-
ret = 0;
cleanup:
@@ -4097,28 +4094,36 @@ static int qemudStartVMDaemon(virConnectPtr conn,
virCommandSetErrorFD(cmd, &logfile);
virCommandSetPidFile(cmd, pidfile);
virCommandDaemonize(cmd);
+ virCommandRequireHandshake(cmd);
ret = virCommandRun(cmd, NULL);
Oh, I see - you want to daemonize, require handshake, AND do a blocking
virCommandRun. I see now - __virExec does two forks when daemonize is
requested, and only runs the callback hook in the second (daemon) child,
rather than in the (short-lived) intermediary. That answers some of my
questions in the previous patch.
- VIR_WARN("Executing done %s",
vm->def->emulator);
VIR_FREE(pidfile);
- /* XXX this is bollocks. Need a sync point */
- sleep(5);
+ VIR_WARN0("Waiting for handshake from child");
+ if (virCommandHandshakeWait(cmd) < 0) {
But it still probably requires virCommand to do some sanity checking
that HandshakeWait is called after the child has been spawned.
+ VIR_WARN0("Labelling done, completing hanshake to child");
s/hanshake/handshake/
Definitely an improvement.
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library
http://libvirt.org