block: add -drive copy-on-read=on|off

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.

Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
Stefan Hajnoczi 2011-11-17 13:40:32 +00:00 committed by Kevin Wolf
parent ab1859218a
commit fb0490f69f
4 changed files with 21 additions and 3 deletions

View File

@ -257,6 +257,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
DriveInfo *dinfo; DriveInfo *dinfo;
BlockIOLimit io_limits; BlockIOLimit io_limits;
int snapshot = 0; int snapshot = 0;
bool copy_on_read;
int ret; int ret;
translation = BIOS_ATA_TRANSLATION_AUTO; translation = BIOS_ATA_TRANSLATION_AUTO;
@ -273,6 +274,7 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
snapshot = qemu_opt_get_bool(opts, "snapshot", 0); snapshot = qemu_opt_get_bool(opts, "snapshot", 0);
ro = qemu_opt_get_bool(opts, "readonly", 0); ro = qemu_opt_get_bool(opts, "readonly", 0);
copy_on_read = qemu_opt_get_bool(opts, "copy-on-read", false);
file = qemu_opt_get(opts, "file"); file = qemu_opt_get(opts, "file");
serial = qemu_opt_get(opts, "serial"); serial = qemu_opt_get(opts, "serial");
@ -546,6 +548,10 @@ DriveInfo *drive_init(QemuOpts *opts, int default_to_scsi)
bdrv_flags |= (BDRV_O_SNAPSHOT|BDRV_O_CACHE_WB|BDRV_O_NO_FLUSH); 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) { if (media == MEDIA_CDROM) {
/* CDROM is fine for any interface, don't check. */ /* CDROM is fine for any interface, don't check. */
ro = 1; ro = 1;

View File

@ -860,9 +860,10 @@ ETEXI
.args_type = "pci_addr:s,opts:s", .args_type = "pci_addr:s,opts:s",
.params = "[[<domain>:]<bus>:]<slot>\n" .params = "[[<domain>:]<bus>:]<slot>\n"
"[file=file][,if=type][,bus=n]\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" "[,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", .help = "add drive to PCI storage controller",
.mhandler.cmd = drive_hot_add, .mhandler.cmd = drive_hot_add,
}, },

View File

@ -109,6 +109,10 @@ static QemuOptsList qemu_drive_opts = {
.name = "bps_wr", .name = "bps_wr",
.type = QEMU_OPT_NUMBER, .type = QEMU_OPT_NUMBER,
.help = "limit write bytes per second", .help = "limit write bytes per second",
},{
.name = "copy-on-read",
.type = QEMU_OPT_BOOL,
.help = "copy read data from backing file into image file",
}, },
{ /* end of list */ } { /* end of list */ }
}, },

View File

@ -135,7 +135,7 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive,
" [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n" " [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
" [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n" " [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]\n"
" [,serial=s][,addr=A][,id=name][,aio=threads|native]\n" " [,serial=s][,addr=A][,id=name][,aio=threads|native]\n"
" [,readonly=on|off]\n" " [,readonly=on|off][,copy-on-read=on|off]\n"
" [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]][[,iops=i]|[[,iops_rd=r][,iops_wr=w]]\n" " [[,bps=b]|[[,bps_rd=r][,bps_wr=w]]][[,iops=i]|[[,iops_rd=r][,iops_wr=w]]\n"
" use 'file' as a drive image\n", QEMU_ARCH_ALL) " use 'file' as a drive image\n", QEMU_ARCH_ALL)
STEXI STEXI
@ -187,6 +187,9 @@ host disk is full; report the error to the guest otherwise).
The default setting is @option{werror=enospc} and @option{rerror=report}. The default setting is @option{werror=enospc} and @option{rerror=report}.
@item readonly @item readonly
Open drive @option{file} as read-only. Guest write attempts will fail. 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 @end table
By default, writethrough caching is used for all block device. This means that By default, writethrough caching is used for all block device. This means that
@ -218,6 +221,10 @@ like your host losing power, the disk storage getting disconnected accidently,
etc. you're image will most probably be rendered unusable. When using etc. you're image will most probably be rendered unusable. When using
the @option{-snapshot} option, unsafe caching is always used. 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: Instead of @option{-cdrom} you can use:
@example @example
qemu -drive file=file,index=2,media=cdrom qemu -drive file=file,index=2,media=cdrom