qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH] QEMU: Change default disk caching to nocache


From: Jes . Sorensen
Subject: [Qemu-devel] [PATCH] QEMU: Change default disk caching to nocache
Date: Thu, 20 May 2010 11:32:04 +0200

From: Jes Sorensen <address@hidden>

Change default disk image caching to nocache (O_DIRECT). However in
case it fails (ramfs, NFS etc.). fall back and retry with write-back.

Signed-off-by: Jes Sorensen <address@hidden>
---
 vl.c |   25 +++++++++++++++++++------
 1 files changed, 19 insertions(+), 6 deletions(-)

diff --git a/vl.c b/vl.c
index d77b47c..f3a7d63 100644
--- a/vl.c
+++ b/vl.c
@@ -787,7 +787,7 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
     int max_devs;
     int index;
     int ro = 0;
-    int bdrv_flags = 0;
+    int bdrv_flags = BDRV_O_NOCACHE;
     int on_read_error, on_write_error;
     const char *devaddr;
     DriveInfo *dinfo;
@@ -910,11 +910,11 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
 
     if ((buf = qemu_opt_get(opts, "cache")) != NULL) {
         if (!strcmp(buf, "off") || !strcmp(buf, "none")) {
-            bdrv_flags |= BDRV_O_NOCACHE;
+            /* default */
         } else if (!strcmp(buf, "writeback")) {
             bdrv_flags |= BDRV_O_CACHE_WB;
         } else if (!strcmp(buf, "writethrough")) {
-            /* this is the default */
+            bdrv_flags &= ~BDRV_O_CACHE_MASK;
         } else {
            fprintf(stderr, "qemu: invalid cache option\n");
            return NULL;
@@ -1120,15 +1120,28 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
     bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
 
     if (bdrv_open(dinfo->bdrv, file, bdrv_flags, drv) < 0) {
-        fprintf(stderr, "qemu: could not open disk image %s: %s\n",
-                        file, strerror(errno));
-        return NULL;
+        if (bdrv_flags & BDRV_O_NOCACHE) {
+            fprintf(stderr, "qemu: failed to open disk image %s as "
+                    "nocache (O_DIRECT) retrying as write-back\n", file);
+            bdrv_flags &= BDRV_O_NOCACHE;
+            bdrv_flags |= BDRV_O_CACHE_WB;
+            if (bdrv_open(dinfo->bdrv, file, bdrv_flags, drv) < 0)
+                goto error_open;
+        } else {
+            goto error_open;
+        }
     }
 
     if (bdrv_key_required(dinfo->bdrv))
         autostart = 0;
     *fatal_error = 0;
     return dinfo;
+
+error_open:
+    fprintf(stderr, "qemu: could not open disk image %s: %s\n",
+            file, strerror(errno));
+    return NULL;
+
 }
 
 static int drive_init_func(QemuOpts *opts, void *opaque)
-- 
1.6.5.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]