Re: [Qemu-block] [PATCH 6/7] block: Move 'discard' option to bdrv_open_common()

2016-09-21 Thread Eric Blake
On 09/20/2016 04:08 PM, Kevin Wolf wrote:
> This enables its use for nested child nodes. The compatibility
> between the 'discard' and 'detect-zeroes' setting is checked in
> bdrv_open_common() now as the former setting isn't available before
> calling bdrv_open() any more.
> 
> Signed-off-by: Kevin Wolf 
> ---
>  block.c   | 17 -
>  blockdev.c| 25 -
>  include/block/block.h |  1 +
>  3 files changed, 17 insertions(+), 26 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 6/7] block: Move 'discard' option to bdrv_open_common()

2016-09-20 Thread Kevin Wolf
This enables its use for nested child nodes. The compatibility
between the 'discard' and 'detect-zeroes' setting is checked in
bdrv_open_common() now as the former setting isn't available before
calling bdrv_open() any more.

Signed-off-by: Kevin Wolf 
---
 block.c   | 17 -
 blockdev.c| 25 -
 include/block/block.h |  1 +
 3 files changed, 17 insertions(+), 26 deletions(-)

diff --git a/block.c b/block.c
index b9c780e..5c019db 100644
--- a/block.c
+++ b/block.c
@@ -717,7 +717,7 @@ static void bdrv_inherited_options(int *child_flags, QDict 
*child_options,
 /* Our block drivers take care to send flushes and respect unmap policy,
  * so we can default to enable both on lower layers regardless of the
  * corresponding parent options. */
-flags |= BDRV_O_UNMAP;
+qdict_set_default_str(child_options, BDRV_OPT_DISCARD, "unmap");
 
 /* Clear flags that only apply to the top layer */
 flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING | BDRV_O_COPY_ON_READ |
@@ -912,6 +912,11 @@ static QemuOptsList bdrv_runtime_opts = {
 .type = QEMU_OPT_STRING,
 .help = "try to optimize zero writes (off, on, unmap)",
 },
+{
+.name = "discard",
+.type = QEMU_OPT_STRING,
+.help = "discard operation (ignore/off, unmap/on)",
+},
 { /* end of list */ }
 },
 };
@@ -928,6 +933,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 *discard;
 const char *detect_zeroes;
 QemuOpts *opts;
 BlockDriver *drv;
@@ -997,6 +1003,15 @@ static int bdrv_open_common(BlockDriverState *bs, 
BdrvChild *file,
 }
 }
 
+discard = qemu_opt_get(opts, "discard");
+if (discard != NULL) {
+if (bdrv_parse_discard_flags(discard, &bs->open_flags) != 0) {
+error_setg(errp, "Invalid discard option");
+ret = -EINVAL;
+goto fail_opts;
+}
+}
+
 detect_zeroes = qemu_opt_get(opts, "detect-zeroes");
 if (detect_zeroes) {
 BlockdevDetectZeroesOptions value =
diff --git a/blockdev.c b/blockdev.c
index 2e0bc46..34e7b2d 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -356,7 +356,6 @@ static void extract_common_blockdev_options(QemuOpts *opts, 
int *bdrv_flags,
 const char **throttling_group, ThrottleConfig *throttle_cfg,
 BlockdevDetectZeroesOptions *detect_zeroes, Error **errp)
 {
-const char *discard;
 Error *local_error = NULL;
 const char *aio;
 
@@ -365,13 +364,6 @@ static void extract_common_blockdev_options(QemuOpts 
*opts, int *bdrv_flags,
 *bdrv_flags |= BDRV_O_COPY_ON_READ;
 }
 
-if ((discard = qemu_opt_get(opts, "discard")) != NULL) {
-if (bdrv_parse_discard_flags(discard, bdrv_flags) != 0) {
-error_setg(errp, "Invalid discard option");
-return;
-}
-}
-
 if ((aio = qemu_opt_get(opts, "aio")) != NULL) {
 if (!strcmp(aio, "native")) {
 *bdrv_flags |= BDRV_O_NATIVE_AIO;
@@ -449,15 +441,6 @@ static void extract_common_blockdev_options(QemuOpts 
*opts, int *bdrv_flags,
 error_propagate(errp, local_error);
 return;
 }
-
-if (bdrv_flags &&
-*detect_zeroes == BLOCKDEV_DETECT_ZEROES_OPTIONS_UNMAP &&
-!(*bdrv_flags & BDRV_O_UNMAP))
-{
-error_setg(errp, "setting detect-zeroes to unmap is not allowed "
- "without setting discard operation to unmap");
-return;
-}
 }
 }
 
@@ -3994,10 +3977,6 @@ QemuOptsList qemu_common_drive_opts = {
 .type = QEMU_OPT_BOOL,
 .help = "enable/disable snapshot mode",
 },{
-.name = "discard",
-.type = QEMU_OPT_STRING,
-.help = "discard operation (ignore/off, unmap/on)",
-},{
 .name = "aio",
 .type = QEMU_OPT_STRING,
 .help = "host AIO implementation (threads, native)",
@@ -4129,10 +4108,6 @@ static QemuOptsList qemu_root_bds_opts = {
 .head = QTAILQ_HEAD_INITIALIZER(qemu_root_bds_opts.head),
 .desc = {
 {
-.name = "discard",
-.type = QEMU_OPT_STRING,
-.help = "discard operation (ignore/off, unmap/on)",
-},{
 .name = "aio",
 .type = QEMU_OPT_STRING,
 .help = "host AIO implementation (threads, native)",
diff --git a/include/block/block.h b/include/block/block.h
index e18233a..e572b31 100644
--- a/include/block/block.h
+++ b/include/block/block.h
@@ -108,6 +108,7 @@ typedef struct HDGeometry {
 #define BDRV_OPT_CACHE_DIRECT   "cache.direct"
 #define BDRV_OPT_CACHE_NO_FLUSH "cache.no-flush"
 #define BDRV_OPT_READ_ONLY  "read-only"
+#define BDRV_OPT_DISCARD