mirror of https://github.com/xemu-project/xemu.git
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:
parent
ab1859218a
commit
fb0490f69f
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
|
@ -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 */ }
|
||||||
},
|
},
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue