[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