[Top][All Lists]
[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