[libvirt] [PATCH 7/8] Perform a handshake during QEMU startup to sync with relabelling

Eric Blake eblake at redhat.com
Fri Dec 10 00:30:09 UTC 2010


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 at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20101209/ea4b6799/attachment-0001.sig>


More information about the libvir-list mailing list