Re: [Qemu-block] [PATCH v2 4/7] block: Parse 'detect-zeroes' in bdrv_open_common()

2016-09-23 Thread Eric Blake
On 09/23/2016 09:32 AM, Kevin Wolf wrote:
> Amongst others, this means that you can now use the 'detect-zeroes'
> option for non-top-level nodes in blockdev-add, like the QAPI schema
> promises.
> 
> Signed-off-by: Kevin Wolf 
> ---
>  block.c| 33 +
>  blockdev.c |  9 +
>  2 files changed, 34 insertions(+), 8 deletions(-)
> 

Reviewed-by: Eric Blake 

-- 
Eric Blake   eblake redhat com+1-919-301-3266
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature


[Qemu-block] [PATCH v2 4/7] block: Parse 'detect-zeroes' in bdrv_open_common()

2016-09-23 Thread Kevin Wolf
Amongst others, this means that you can now use the 'detect-zeroes'
option for non-top-level nodes in blockdev-add, like the QAPI schema
promises.

Signed-off-by: Kevin Wolf 
---
 block.c| 33 +
 blockdev.c |  9 +
 2 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/block.c b/block.c
index 493ecf3..1f10457 100644
--- a/block.c
+++ b/block.c
@@ -42,6 +42,7 @@
 #include "qapi-event.h"
 #include "qemu/cutils.h"
 #include "qemu/id.h"
+#include "qapi/util.h"
 
 #ifdef CONFIG_BSD
 #include 
@@ -954,6 +955,11 @@ static QemuOptsList bdrv_runtime_opts = {
 .type = QEMU_OPT_BOOL,
 .help = "Node is opened in read-only mode",
 },
+{
+.name = "detect-zeroes",
+.type = QEMU_OPT_STRING,
+.help = "try to optimize zero writes (off, on, unmap)",
+},
 { /* end of list */ }
 },
 };
@@ -970,6 +976,7 @@ static int bdrv_open_common(BlockDriverState *bs, BdrvChild 
*file,
 const char *filename;
 const char *driver_name = NULL;
 const char *node_name = NULL;
+const char *detect_zeroes;
 QemuOpts *opts;
 BlockDriver *drv;
 Error *local_err = NULL;
@@ -1038,6 +1045,32 @@ static int bdrv_open_common(BlockDriverState *bs, 
BdrvChild *file,
 }
 }
 
+detect_zeroes = qemu_opt_get(opts, "detect-zeroes");
+if (detect_zeroes) {
+BlockdevDetectZeroesOptions value =
+qapi_enum_parse(BlockdevDetectZeroesOptions_lookup,
+detect_zeroes,
+BLOCKDEV_DETECT_ZEROES_OPTIONS__MAX,
+BLOCKDEV_DETECT_ZEROES_OPTIONS_OFF,
+_err);
+if (local_err) {
+error_propagate(errp, local_err);
+ret = -EINVAL;
+goto fail_opts;
+}
+
+if (value == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP &&
+!(bs->open_flags & BDRV_O_UNMAP))
+{
+error_setg(errp, "setting detect-zeroes to unmap is not allowed "
+ "without setting discard operation to unmap");
+ret = -EINVAL;
+goto fail_opts;
+}
+
+bs->detect_zeroes = value;
+}
+
 if (filename != NULL) {
 pstrcpy(bs->filename, sizeof(bs->filename), filename);
 } else {
diff --git a/blockdev.c b/blockdev.c
index 3508ff3..7baf5bb 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -658,7 +658,6 @@ static BlockDriverState *bds_tree_init(QDict *bs_opts, 
Error **errp)
 BlockDriverState *bs;
 QemuOpts *opts;
 Error *local_error = NULL;
-BlockdevDetectZeroesOptions detect_zeroes;
 int bdrv_flags = 0;
 
 opts = qemu_opts_create(_root_bds_opts, NULL, 1, errp);
@@ -673,7 +672,7 @@ static BlockDriverState *bds_tree_init(QDict *bs_opts, 
Error **errp)
 }
 
 extract_common_blockdev_options(opts, _flags, NULL, NULL,
-_zeroes, _error);
+NULL, _error);
 if (local_error) {
 error_propagate(errp, local_error);
 goto fail;
@@ -695,8 +694,6 @@ static BlockDriverState *bds_tree_init(QDict *bs_opts, 
Error **errp)
 goto fail_no_bs_opts;
 }
 
-bs->detect_zeroes = detect_zeroes;
-
 fail_no_bs_opts:
 qemu_opts_del(opts);
 return bs;
@@ -4136,10 +4133,6 @@ static QemuOptsList qemu_root_bds_opts = {
 .name = "copy-on-read",
 .type = QEMU_OPT_BOOL,
 .help = "copy read data from backing file into image file",
-},{
-.name = "detect-zeroes",
-.type = QEMU_OPT_STRING,
-.help = "try to optimize zero writes (off, on, unmap)",
 },
 { /* end of list */ }
 },
-- 
1.8.3.1