[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 02/13] block: add -drive copy-on-read=on|off
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PATCH 02/13] block: add -drive copy-on-read=on|off |
Date: |
Tue, 14 Jun 2011 19:18:20 +0100 |
This patch adds the -drive copy-on-read=on|off command-line option:
copy-on-read=on|off
copy-on-read is "on" or "off" and enables whether to copy read backing
file sectors into the image file. Copy-on-read avoids accessing the
same backing file sectors repeatedly and is useful when the backing file
is over a slow network. By default copy-on-read is off.
The new BlockDriverState.copy_on_read field indicates whether
copy-on-read is enabled. Block drivers can use this as a hint to copy
sectors read from the backing file into the image file. The point of
copy-on-read is to avoid accessing the backing file again in the future.
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
block.c | 5 +++++
block.h | 1 +
block_int.h | 1 +
blockdev.c | 6 ++++++
hmp-commands.hx | 5 +++--
qemu-config.c | 3 +++
qemu-options.hx | 9 ++++++++-
7 files changed, 27 insertions(+), 3 deletions(-)
diff --git a/block.c b/block.c
index 24a25d5..99068c9 100644
--- a/block.c
+++ b/block.c
@@ -430,6 +430,11 @@ static int bdrv_open_common(BlockDriverState *bs, const
char *filename,
/* buffer_alignment defaulted to 512, drivers can change this value */
bs->buffer_alignment = 512;
+ bs->copy_on_read = 0;
+ if (flags & BDRV_O_RDWR) {
+ bs->copy_on_read = !!(flags & BDRV_O_COPY_ON_READ);
+ }
+
pstrcpy(bs->filename, sizeof(bs->filename), filename);
if (use_bdrv_whitelist && !bdrv_is_whitelisted(drv)) {
diff --git a/block.h b/block.h
index da7d39c..deb19ec 100644
--- a/block.h
+++ b/block.h
@@ -34,6 +34,7 @@ typedef struct QEMUSnapshotInfo {
#define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool
*/
#define BDRV_O_NO_BACKING 0x0100 /* don't open the backing file */
#define BDRV_O_NO_FLUSH 0x0200 /* disable flushing on this disk */
+#define BDRV_O_COPY_ON_READ 0x0400 /* copy read backing sectors into image */
#define BDRV_O_CACHE_MASK (BDRV_O_NOCACHE | BDRV_O_CACHE_WB | BDRV_O_NO_FLUSH)
diff --git a/block_int.h b/block_int.h
index fa91337..135625a 100644
--- a/block_int.h
+++ b/block_int.h
@@ -152,6 +152,7 @@ struct BlockDriverState {
int encrypted; /* if true, the media is encrypted */
int valid_key; /* if true, a valid encryption key has been set */
int sg; /* if true, the device is a /dev/sg* */
+ int copy_on_read; /* if true, copy read backing sectors into image */
/* event callback when inserting/removing */
void (*change_cb)(void *opaque, int reason);
void *change_opaque;
diff --git a/blockdev.c b/blockdev.c
index 1502575..9dbd2fa 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -237,6 +237,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
const char *devaddr;
DriveInfo *dinfo;
int snapshot = 0;
+ int copy_on_read;
int ret;
translation = BIOS_ATA_TRANSLATION_AUTO;
@@ -261,6 +262,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
snapshot = qemu_opt_get_bool(opts, "snapshot", 0);
ro = qemu_opt_get_bool(opts, "readonly", 0);
+ copy_on_read = qemu_opt_get_bool(opts, "copy-on-read", 0);
file = qemu_opt_get(opts, "file");
serial = qemu_opt_get(opts, "serial");
@@ -521,6 +523,10 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
bdrv_flags |= (BDRV_O_SNAPSHOT|BDRV_O_CACHE_WB|BDRV_O_NO_FLUSH);
}
+ if (copy_on_read) {
+ bdrv_flags |= BDRV_O_COPY_ON_READ;
+ }
+
if (media == MEDIA_CDROM) {
/* CDROM is fine for any interface, don't check. */
ro = 1;
diff --git a/hmp-commands.hx b/hmp-commands.hx
index 6ad8806..f6cc724 100644
--- a/hmp-commands.hx
+++ b/hmp-commands.hx
@@ -863,9 +863,10 @@ ETEXI
.args_type = "pci_addr:s,opts:s",
.params = "[[<domain>:]<bus>:]<slot>\n"
"[file=file][,if=type][,bus=n]\n"
- "[,unit=m][,media=d][index=i]\n"
+ "[,unit=m][,media=d][,index=i]\n"
"[,cyls=c,heads=h,secs=s[,trans=t]]\n"
- "[snapshot=on|off][,cache=on|off]",
+ "[,snapshot=on|off][,cache=on|off]\n"
+ "[,readonly=on|off][,copy-on-read=on|off]",
.help = "add drive to PCI storage controller",
.mhandler.cmd = drive_hot_add,
},
diff --git a/qemu-config.c b/qemu-config.c
index 7558fa8..dafacb7 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -78,6 +78,9 @@ static QemuOptsList qemu_drive_opts = {
}, {
.name = "readonly",
.type = QEMU_OPT_BOOL,
+ }, {
+ .name = "copy-on-read",
+ .type = QEMU_OPT_BOOL,
},
{ /* end of list */ }
},
diff --git a/qemu-options.hx b/qemu-options.hx
index f2ef9a1..97abcd9 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -120,7 +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|unsafe][,format=f]\n"
" [,serial=s][,addr=A][,id=name][,aio=threads|native]\n"
- " [,readonly=on|off]\n"
+ " [,readonly=on|off][,copy-on-read=on|off]\n"
" use 'file' as a drive image\n", QEMU_ARCH_ALL)
STEXI
@item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
@@ -160,6 +160,9 @@ an untrusted format header.
This option specifies the serial number to assign to the device.
@item address@hidden
Specify the controller's PCI address (if=virtio only).
address@hidden address@hidden
address@hidden is "on" or "off" and enables whether to copy read backing
+file sectors into the image file.
@end table
By default, writethrough caching is used for all block device. This means that
@@ -187,6 +190,10 @@ like your host losing power, the disk storage getting
disconnected accidently,
etc. you're image will most probably be rendered unusable. When using
the @option{-snapshot} option, unsafe caching is always used.
+Copy-on-read avoids accessing the same backing file sectors repeatedly and is
+useful when the backing file is over a slow network. By default copy-on-read
+is off.
+
Instead of @option{-cdrom} you can use:
@example
qemu -drive file=file,index=2,media=cdrom
--
1.7.5.3
- [Qemu-devel] [PATCH 09/13] block: add bdrv_aio_copy_backing(), (continued)
- [Qemu-devel] [PATCH 09/13] block: add bdrv_aio_copy_backing(), Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 04/13] qed: extract qed_start_allocating_write(), Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 13/13] trace: trace bdrv_aio_readv/writev error paths, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 05/13] qed: make qed_aio_write_alloc() reusable, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 12/13] qed: intelligent streaming implementation, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 08/13] qerror: add qerror_from_args() to create qerror objects, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 10/13] qmp: add QMP support for stream commands, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 11/13] block: add -drive stream=on|off, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 03/13] qed: replace is_write with flags field, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 01/13] qemu-config: }, { -> }, { to please checkpatch.pl, Stefan Hajnoczi, 2011/06/14
- [Qemu-devel] [PATCH 02/13] block: add -drive copy-on-read=on|off,
Stefan Hajnoczi <=
- Re: [Qemu-devel] [PATCH 00/13] QED image streaming, Philipp Hahn, 2011/06/15
- [Qemu-devel] Image streaming and live block copy (was: [PATCH 00/13] QED image streaming), Kevin Wolf, 2011/06/16