[libvirt] [PATCH 2/4] Avoid create/unlink with block devs used for QEMU save

Laine Stump laine at laine.org
Sat Apr 24 04:45:13 UTC 2010


On 04/22/2010 07:43 AM, Daniel P. Berrange wrote:
> It is possible to use block devices with domain save/restore. Upon
> failure QEMU unlinks the path being saved to. This isn't good when
> it is a block device !
>
> * src/qemu/qemu_driver.c: Don't unlink block devices if save fails
> ---
>   src/qemu/qemu_driver.c |   22 ++++++++++++++++++++--
>   1 files changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 91fe963..41a516c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -4787,6 +4787,8 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
>       int rc;
>       virDomainEventPtr event = NULL;
>       qemuDomainObjPrivatePtr priv;
> +    struct stat sb;
> +    int is_reg = 0;
>
>       memset(&header, 0, sizeof(header));
>       memcpy(header.magic, QEMUD_SAVE_MAGIC, sizeof(header.magic));
> @@ -4840,6 +4842,21 @@ static int qemudDomainSaveFlag(virDomainPtr dom, const char *path,
>       }
>       header.xml_len = strlen(xml) + 1;
>
> +    /* path might be a pre-existing block dev, in which case
> +     * we need to skip the create step, and also avoid unlink
> +     * in the failure case */
> +    if (stat(path,&sb)<  0) {
> +        if (errno != ENOENT) {
>    

In the case of a target on a root-squashed NFS server, this stat() will 
fail if the directory is not marked as w+rx. In this case, it will 
return EACCES. Changing the if to also check for (errno != EACCES) 
allows it to pass this point (and shouldn't hurt in any other 
circumstances). I tried it with this small modification, and 
save/restore to root-squash NFS works properly.





More information about the libvir-list mailing list