[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