[Libguestfs] [PATCH v2 1/4] api: add_drive - add QEMU detect-zeroes support
Richard W.M. Jones
rjones at redhat.com
Mon Apr 27 14:16:48 UTC 2015
On Fri, Apr 24, 2015 at 02:51:48PM +0200, Maros Zatko wrote:
> See: https://lists.gnu.org/archive/html/qemu-devel/2012-07/msg03747.html
> Related do RHBZ#1130506.
> ---
> generator/actions.ml | 2 +-
> src/drives.c | 11 +++++++++--
> src/guestfs-internal.h | 1 +
> src/launch-direct.c | 8 +++++---
> 4 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/generator/actions.ml b/generator/actions.ml
> index 1a89869..4447de6 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -1322,7 +1322,7 @@ not all belong to a single logical operating system
>
> { defaults with
> name = "add_drive";
> - style = RErr, [String "filename"], [OBool "readonly"; OString "format"; OString "iface"; OString "name"; OString "label"; OString "protocol"; OStringList "server"; OString "username"; OString "secret"; OString "cachemode"; OString "discard"; OBool "copyonread"];
> + style = RErr, [String "filename"], [OBool "readonly"; OString "format"; OString "iface"; OString "name"; OString "label"; OString "protocol"; OStringList "server"; OString "username"; OString "secret"; OString "cachemode"; OString "discard"; OBool "copyonread"; OBool "detectzeros"];
> once_had_no_optargs = true;
> blocking = false;
> fish_alias = ["add"];
This needs a change to the API documentation too.
Rich.
> diff --git a/src/drives.c b/src/drives.c
> index ad747ab..d1e680a 100644
> --- a/src/drives.c
> +++ b/src/drives.c
> @@ -63,6 +63,7 @@ struct drive_create_data {
> const char *cachemode;
> enum discard discard;
> bool copyonread;
> + bool detectzeros;
> };
>
> COMPILE_REGEXP (re_hostname_port, "(.*):(\\d+)$", 0)
> @@ -116,6 +117,7 @@ create_drive_file (guestfs_h *g,
> drv->cachemode = data->cachemode ? safe_strdup (g, data->cachemode) : NULL;
> drv->discard = data->discard;
> drv->copyonread = data->copyonread;
> + drv->detectzeros = data->detectzeros;
>
> if (data->readonly) {
> if (create_overlay (g, drv) == -1) {
> @@ -152,6 +154,7 @@ create_drive_non_file (guestfs_h *g,
> drv->cachemode = data->cachemode ? safe_strdup (g, data->cachemode) : NULL;
> drv->discard = data->discard;
> drv->copyonread = data->copyonread;
> + drv->detectzeros = data->detectzeros;
>
> if (data->readonly) {
> if (create_overlay (g, drv) == -1) {
> @@ -504,7 +507,7 @@ static char *
> drive_to_string (guestfs_h *g, const struct drive *drv)
> {
> return safe_asprintf
> - (g, "%s%s%s%s protocol=%s%s%s%s%s%s%s%s%s%s%s",
> + (g, "%s%s%s%s protocol=%s%s%s%s%s%s%s%s%s%s%s%s",
> drv->src.u.path,
> drv->readonly ? " readonly" : "",
> drv->src.format ? " format=" : "",
> @@ -520,7 +523,8 @@ drive_to_string (guestfs_h *g, const struct drive *drv)
> drv->cachemode ? : "",
> drv->discard == discard_disable ? "" :
> drv->discard == discard_enable ? " discard=enable" : " discard=besteffort",
> - drv->copyonread ? " copyonread" : "");
> + drv->copyonread ? " copyonread" : "",
> + drv->detectzeros ? " detect-zeroes=on" : "");
> }
>
> /* Add struct drive to the g->drives vector at the given index. */
> @@ -746,6 +750,9 @@ guestfs_impl_add_drive_opts (guestfs_h *g, const char *filename,
> data.servers = NULL;
> data.exportname = filename;
>
> + data.detectzeros = optargs->bitmask & GUESTFS_ADD_DRIVE_OPTS_DETECTZEROS_BITMASK
> + ? optargs->detectzeros : false;
> +
> data.readonly = optargs->bitmask & GUESTFS_ADD_DRIVE_OPTS_READONLY_BITMASK
> ? optargs->readonly : false;
> data.format = optargs->bitmask & GUESTFS_ADD_DRIVE_OPTS_FORMAT_BITMASK
> diff --git a/src/guestfs-internal.h b/src/guestfs-internal.h
> index 414a634..ea0b716 100644
> --- a/src/guestfs-internal.h
> +++ b/src/guestfs-internal.h
> @@ -269,6 +269,7 @@ struct drive {
> char *cachemode;
> enum discard discard;
> bool copyonread;
> + bool detectzeros;
> };
>
> /* Extra hv parameters (from guestfs_config). */
> diff --git a/src/launch-direct.c b/src/launch-direct.c
> index ea67ec9..7118db8 100644
> --- a/src/launch-direct.c
> +++ b/src/launch-direct.c
> @@ -512,7 +512,7 @@ launch_direct (guestfs_h *g, void *datav, const char *arg)
> * the if=... at the end.
> */
> param = safe_asprintf
> - (g, "file=%s%s,cache=%s%s%s%s%s%s%s,id=hd%zu",
> + (g, "file=%s%s,cache=%s%s%s%s%s%s%s%s,id=hd%zu",
> escaped_file,
> drv->readonly ? ",snapshot=on" : "",
> drv->cachemode ? drv->cachemode : "writeback",
> @@ -521,6 +521,7 @@ launch_direct (guestfs_h *g, void *datav, const char *arg)
> drv->src.format ? drv->src.format : "",
> drv->disk_label ? ",serial=" : "",
> drv->disk_label ? drv->disk_label : "",
> + drv->detectzeros ? ",detect-zeroes=on" : "",
> drv->copyonread ? ",copy-on-read=on" : "",
> i);
> }
> @@ -528,11 +529,12 @@ launch_direct (guestfs_h *g, void *datav, const char *arg)
> /* Writable qcow2 overlay on top of read-only drive. */
> escaped_file = qemu_escape_param (g, drv->overlay);
> param = safe_asprintf
> - (g, "file=%s,cache=unsafe,format=qcow2%s%s,id=hd%zu",
> + (g, "file=%s,cache=unsafe,format=qcow2%s%s,id=hd%zu,detect-zeroes=%s",
> escaped_file,
> drv->disk_label ? ",serial=" : "",
> drv->disk_label ? drv->disk_label : "",
> - i);
> + i,
> + drv->detectzeros ? "on" : "off");
> }
>
> /* If there's an explicit 'iface', use it. Otherwise default to
> --
> 1.9.3
>
> _______________________________________________
> Libguestfs mailing list
> Libguestfs at redhat.com
> https://www.redhat.com/mailman/listinfo/libguestfs
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html
More information about the Libguestfs
mailing list