[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/2] Add flush=off parameter to -drive
From: |
Alexander Graf |
Subject: |
[Qemu-devel] [PATCH 2/2] Add flush=off parameter to -drive |
Date: |
Mon, 10 May 2010 23:51:50 +0200 |
Usually the guest can tell the host to flush data to disk. In some cases we
don't want to flush though, but try to keep everything in cache.
So let's add a new parameter to -drive that allows us to set the flushing
behavior to "on" or "off", defaulting to enabling the guest to flush.
Signed-off-by: Alexander Graf <address@hidden>
---
block/raw-posix.c | 13 +++++++++++++
qemu-config.c | 3 +++
qemu-options.hx | 3 +++
vl.c | 3 +++
4 files changed, 22 insertions(+), 0 deletions(-)
diff --git a/block/raw-posix.c b/block/raw-posix.c
index 7541ed2..2510b1b 100644
--- a/block/raw-posix.c
+++ b/block/raw-posix.c
@@ -106,6 +106,7 @@ typedef struct BDRVRawState {
int fd;
int type;
int open_flags;
+ int bdrv_flags;
#if defined(__linux__)
/* linux floppy specific */
int64_t fd_open_time;
@@ -133,6 +134,7 @@ static int raw_open_common(BlockDriverState *bs, const char
*filename,
BDRVRawState *s = bs->opaque;
int fd, ret;
+ s->bdrv_flags = bdrv_flags;
s->open_flags = open_flags | O_BINARY;
s->open_flags &= ~O_ACCMODE;
if (bdrv_flags & BDRV_O_RDWR) {
@@ -555,6 +557,11 @@ static BlockDriverAIOCB *raw_aio_flush(BlockDriverState
*bs,
if (fd_open(bs) < 0)
return NULL;
+ /* Don't flush? */
+ if (s->bdrv_flags & BDRV_O_NOFLUSH) {
+ return bdrv_aio_noop_em(bs, cb, opaque);
+ }
+
return paio_submit(bs, s->fd, 0, NULL, 0, cb, opaque, QEMU_AIO_FLUSH);
}
@@ -726,6 +733,12 @@ static int raw_create(const char *filename,
QEMUOptionParameter *options)
static void raw_flush(BlockDriverState *bs)
{
BDRVRawState *s = bs->opaque;
+
+ /* No flush means no flush */
+ if (s->bdrv_flags & BDRV_O_NOFLUSH) {
+ return;
+ }
+
qemu_fdatasync(s->fd);
}
diff --git a/qemu-config.c b/qemu-config.c
index d500885..c358add 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -79,6 +79,9 @@ QemuOptsList qemu_drive_opts = {
},{
.name = "readonly",
.type = QEMU_OPT_BOOL,
+ },{
+ .name = "flush",
+ .type = QEMU_OPT_BOOL,
},
{ /* end if list */ }
},
diff --git a/qemu-options.hx b/qemu-options.hx
index 12f6b51..69ae8de 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -120,6 +120,7 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive,
" [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
" [,cache=writethrough|writeback|none][,format=f][,serial=s]\n"
" [,addr=A][,id=name][,aio=threads|native][,readonly=on|off]\n"
+ " [,flush=on|off]\n"
" use 'file' as a drive image\n", QEMU_ARCH_ALL)
STEXI
@item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
@@ -151,6 +152,8 @@ These options have the same definition as they have in
@option{-hdachs}.
@var{cache} is "none", "writeback", or "writethrough" and controls how the
host cache is used to access block data.
@item address@hidden
@var{aio} is "threads", or "native" and selects between pthread based disk I/O
and native Linux AIO.
address@hidden address@hidden
address@hidden is "on" (default), or "off" and select whether the guest can
trigger a host flush
@item address@hidden
Specify which disk @var{format} will be used rather than detecting
the format. Can be used to specifiy format=raw to avoid interpreting
diff --git a/vl.c b/vl.c
index 85bcc84..a7ca2c3 100644
--- a/vl.c
+++ b/vl.c
@@ -787,6 +787,7 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
int max_devs;
int index;
int ro = 0;
+ int flush = 1;
int bdrv_flags = 0;
int on_read_error, on_write_error;
const char *devaddr;
@@ -819,6 +820,7 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
snapshot = qemu_opt_get_bool(opts, "snapshot", 0);
ro = qemu_opt_get_bool(opts, "readonly", 0);
+ flush = qemu_opt_get_bool(opts, "flush", 1);
file = qemu_opt_get(opts, "file");
serial = qemu_opt_get(opts, "serial");
@@ -1118,6 +1120,7 @@ DriveInfo *drive_init(QemuOpts *opts, void *opaque,
}
bdrv_flags |= ro ? 0 : BDRV_O_RDWR;
+ bdrv_flags |= flush ? 0 : BDRV_O_NOFLUSH;
if (bdrv_open(dinfo->bdrv, file, bdrv_flags, drv) < 0) {
fprintf(stderr, "qemu: could not open disk image %s: %s\n",
--
1.6.0.2
- [Qemu-devel] [PATCH 0/2] Enable qemu block layer to not flush, Alexander Graf, 2010/05/10
- [Qemu-devel] [PATCH 1/2] Add no-op aio emulation stub, Alexander Graf, 2010/05/10
- [Qemu-devel] [PATCH 2/2] Add flush=off parameter to -drive,
Alexander Graf <=
- [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Kevin Wolf, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Christoph Hellwig, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Paul Brook, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Anthony Liguori, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Paul Brook, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Anthony Liguori, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Paul Brook, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Anthony Liguori, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Paul Brook, 2010/05/11
- Re: [Qemu-devel] Re: [PATCH 2/2] Add flush=off parameter to -drive, Anthony Liguori, 2010/05/11