block: Move 'discard' option to bdrv_open_common()
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 <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
b85114f8cf
commit
818584a43a
17
block.c
17
block.c
@ -765,7 +765,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 |
|
||||
@ -960,6 +960,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 */ }
|
||||
},
|
||||
};
|
||||
@ -976,6 +981,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;
|
||||
@ -1045,6 +1051,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 =
|
||||
|
25
blockdev.c
25
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3989,10 +3972,6 @@ QemuOptsList qemu_common_drive_opts = {
|
||||
.name = "snapshot",
|
||||
.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,
|
||||
@ -4125,10 +4104,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)",
|
||||
|
@ -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 "discard"
|
||||
|
||||
|
||||
#define BDRV_SECTOR_BITS 9
|
||||
|
Loading…
Reference in New Issue
Block a user