[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

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



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


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]