[Libguestfs] [PATCH] Don't use cache=off if device is on tmpfs

Matthew Booth mbooth at redhat.com
Thu Aug 13 09:58:59 UTC 2009


On 12/08/09 22:14, Richard W.M. Jones wrote:
> diff --git a/src/generator.ml b/src/generator.ml
> index b9544ff..fa1f483 100755
> --- a/src/generator.ml
> +++ b/src/generator.ml
> @@ -454,6 +454,8 @@ image).
>
>   This is equivalent to the qemu parameter
>   C<-drive file=filename,cache=off,if=...>.
> +C<cache=off>  is omitted in cases where it is not supported by
> +the underlying filesystem.
>
>   Note that this call checks for the existence of C<filename>.  This
>   stops you from specifying other types of drive which are supported
> diff --git a/src/guestfs.c b/src/guestfs.c
> index 37869e8..7f309c9 100644
> --- a/src/guestfs.c
> +++ b/src/guestfs.c
> @@ -793,20 +793,38 @@ guestfs_add_drive (guestfs_h *g, const char *filename)
>   {
>     size_t len = strlen (filename) + 64;
>     char buf[len];
> +  int fd;
>

I thought we'd decided to go with 'inline' declarations, whatever the 
appropriate term for those is.

>     if (strchr (filename, ',') != NULL) {
>       error (g, _("filename cannot contain ',' (comma) character"));
>       return -1;
>     }
>
> -  if (access (filename, F_OK) == -1) {
> -    perrorf (g, "%s", filename);
> -    return -1;
> +  /* cache=off improves reliability in the event of a host crash.
> +   *
> +   * However this option causes qemu to try to open the file with
> +   * O_DIRECT.  This fails on some filesystem types (notably tmpfs).
> +   * So we check if we can open the file with or without O_DIRECT,
> +   * and use cache=off (or not) accordingly.
> +   *
> +   * This test also checks for the presence of the file, which
> +   * is a documented semantic of this interface.
> +   */
> +  fd = open (filename, O_RDONLY|O_DIRECT);
> +  if (fd>= 0) {
> +    close (fd);
> +    snprintf (buf, len, "file=%s,cache=off,if=" DRIVE_IF, filename);
> +  } else {
> +    fd = open (filename, O_RDONLY);
> +    if (fd>= 0) {
> +      close (fd);
> +      snprintf (buf, len, "file=%s,if=" DRIVE_IF, filename);
> +    } else {
> +      perrorf (g, "%s", filename);
> +      return -1;
> +    }
>     }
>
> -  /* cache=off improves reliability in the event of a host crash. */
> -  snprintf (buf, len, "file=%s,cache=off,if=%s", filename, DRIVE_IF);
> -
>     return guestfs_config (g, "-drive", buf);
>   }
>
> -- 1.6.2.5

ACK.

Matt
-- 
Matthew Booth, RHCA, RHCSS
Red Hat Engineering, Virtualisation Team

M:       +44 (0)7977 267231
GPG ID:  D33C3490
GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490




More information about the Libguestfs mailing list