From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:33470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qm4QB-0007OD-Tu for qemu-devel@nongnu.org; Wed, 27 Jul 2011 09:45:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qm4Q5-0004Uj-5W for qemu-devel@nongnu.org; Wed, 27 Jul 2011 09:45:11 -0400 Received: from mtagate7.uk.ibm.com ([194.196.100.167]:39376) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qm4Q4-0004Tb-OK for qemu-devel@nongnu.org; Wed, 27 Jul 2011 09:45:05 -0400 Received: from d06nrmr1806.portsmouth.uk.ibm.com (d06nrmr1806.portsmouth.uk.ibm.com [9.149.39.193]) by mtagate7.uk.ibm.com (8.13.1/8.13.1) with ESMTP id p6RDj3kw008598 for ; Wed, 27 Jul 2011 13:45:03 GMT Received: from d06av09.portsmouth.uk.ibm.com (d06av09.portsmouth.uk.ibm.com [9.149.37.250]) by d06nrmr1806.portsmouth.uk.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p6RDj3XJ2617412 for ; Wed, 27 Jul 2011 14:45:03 +0100 Received: from d06av09.portsmouth.uk.ibm.com (loopback [127.0.0.1]) by d06av09.portsmouth.uk.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p6RDj2eq016062 for ; Wed, 27 Jul 2011 07:45:02 -0600 From: Stefan Hajnoczi Date: Wed, 27 Jul 2011 14:44:41 +0100 Message-Id: <1311774295-8696-2-git-send-email-stefanha@linux.vnet.ibm.com> In-Reply-To: <1311774295-8696-1-git-send-email-stefanha@linux.vnet.ibm.com> References: <1311774295-8696-1-git-send-email-stefanha@linux.vnet.ibm.com> Subject: [Qemu-devel] [PATCH 01/15] block: add -drive copy-on-read=on|off List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Kevin Wolf , Anthony Liguori , Stefan Hajnoczi , Adam Litke 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. Block drivers that do not honor the copy-on-read hint simply read data without populating the image file. Signed-off-by: Stefan Hajnoczi --- block.c | 5 +++++ block.h | 1 + block_int.h | 1 + blockdev.c | 6 ++++++ hmp-commands.hx | 5 +++-- qemu-config.c | 4 ++++ qemu-options.hx | 10 +++++++++- 7 files changed, 29 insertions(+), 3 deletions(-) diff --git a/block.c b/block.c index 9549b9e..3d074af 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 59cc410..f6ffa93 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 efb6803..69dd5a7 100644 --- a/block_int.h +++ b/block_int.h @@ -154,6 +154,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 0b8d3a4..b337732 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; @@ -253,6 +254,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"); @@ -517,6 +519,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 c857827..cbaa9a0 100644 --- a/hmp-commands.hx +++ b/hmp-commands.hx @@ -863,9 +863,10 @@ ETEXI .args_type = "pci_addr:s,opts:s", .params = "[[:]:]\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 b2ec40b..2e5ee3c 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -84,6 +84,10 @@ static QemuOptsList qemu_drive_opts = { .name = "readonly", .type = QEMU_OPT_BOOL, .help = "open drive file as read-only", + },{ + .name = "copy-on-read", + .type = QEMU_OPT_BOOL, + .help = "copy read data from backing file into image file", }, { /* end of list */ } }, diff --git a/qemu-options.hx b/qemu-options.hx index 1d57f64..b7e52fe 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -135,7 +135,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}[,...]]] @@ -183,6 +183,9 @@ host disk is full; report the error to the guest otherwise). The default setting is @option{werror=enospc} and @option{rerror=report}. @item readonly Open drive @option{file} as read-only. Guest write attempts will fail. +@item copy-on-read=@var{copy-on-read} +@var{copy-on-read} 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 @@ -210,6 +213,11 @@ 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. Note that copy-on-read is a hint and may by ignored by block drivers +which do not support it. + Instead of @option{-cdrom} you can use: @example qemu -drive file=file,index=2,media=cdrom -- 1.7.5.4