Message ID | 1408557576-14574-4-git-send-email-mreitz@redhat.com |
---|---|
State | New |
Headers | show |
On 08/20/2014 11:59 AM, Max Reitz wrote: > Being able to set the overlap-check option to a string and then refine > it via the overlap-check.* options is a nice idea for the command line > but does not work so well for non-flattened dicts. In that case, one can > only specify either but not both, so add a field to overlap-check.* > which does the same as directly specifying overlap-check but can be used > in conjunction with the other fields in non-flattened dicts. > > Signed-off-by: Max Reitz <mreitz@redhat.com> > --- > block/qcow2.c | 24 ++++++++++++++++++++++-- > block/qcow2.h | 1 + > 2 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/block/qcow2.c b/block/qcow2.c > index c64d611..c6099b5 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -403,6 +403,12 @@ static QemuOptsList qcow2_runtime_opts = { > "templates (none, constant, cached, all)", > }, > { > + .name = QCOW2_OPT_OVERLAP_TEMPLATE, > + .type = QEMU_OPT_STRING, > + .help = "Selects which overlap checks to perform from a range of " > + "templates (none, constant, cached, all)", > + }, > + { Okay, I see where this is headed. The QMP will allow either 'overlap-check':'all' (resolve all defaults according to a template name), or 'overlap-check':{'template':'all','inactive-l1':'none'} (that is, a struct, where the struct also sets a default but also provides per-item overrides). It took me a couple of reads of this in tandem with 4/4, but it looks correct.
On 08/20/2014 01:22 PM, Eric Blake wrote: > On 08/20/2014 11:59 AM, Max Reitz wrote: >> Being able to set the overlap-check option to a string and then refine >> it via the overlap-check.* options is a nice idea for the command line >> but does not work so well for non-flattened dicts. In that case, one can >> only specify either but not both, so add a field to overlap-check.* >> which does the same as directly specifying overlap-check but can be used >> in conjunction with the other fields in non-flattened dicts. >> >> Signed-off-by: Max Reitz <mreitz@redhat.com> >> --- >> block/qcow2.c | 24 ++++++++++++++++++++++-- >> block/qcow2.h | 1 + >> 2 files changed, 23 insertions(+), 2 deletions(-) > > Okay, I see where this is headed. The QMP will allow either > 'overlap-check':'all' (resolve all defaults according to a template > name), or 'overlap-check':{'template':'all','inactive-l1':'none'} (that > is, a struct, where the struct also sets a default but also provides > per-item overrides). It took me a couple of reads of this in tandem > with 4/4, but it looks correct. Reviewed-by: Eric Blake <eblake@redhat.com>
On 20.08.2014 21:22, Eric Blake wrote: > On 08/20/2014 11:59 AM, Max Reitz wrote: >> Being able to set the overlap-check option to a string and then refine >> it via the overlap-check.* options is a nice idea for the command line >> but does not work so well for non-flattened dicts. In that case, one can >> only specify either but not both, so add a field to overlap-check.* >> which does the same as directly specifying overlap-check but can be used >> in conjunction with the other fields in non-flattened dicts. >> >> Signed-off-by: Max Reitz <mreitz@redhat.com> >> --- >> block/qcow2.c | 24 ++++++++++++++++++++++-- >> block/qcow2.h | 1 + >> 2 files changed, 23 insertions(+), 2 deletions(-) >> >> diff --git a/block/qcow2.c b/block/qcow2.c >> index c64d611..c6099b5 100644 >> --- a/block/qcow2.c >> +++ b/block/qcow2.c >> @@ -403,6 +403,12 @@ static QemuOptsList qcow2_runtime_opts = { >> "templates (none, constant, cached, all)", >> }, >> { >> + .name = QCOW2_OPT_OVERLAP_TEMPLATE, >> + .type = QEMU_OPT_STRING, >> + .help = "Selects which overlap checks to perform from a range of " >> + "templates (none, constant, cached, all)", >> + }, >> + { > Okay, I see where this is headed. The QMP will allow either > 'overlap-check':'all' (resolve all defaults according to a template > name), or 'overlap-check':{'template':'all','inactive-l1':'none'} (that > is, a struct, where the struct also sets a default but also provides > per-item overrides). Yes, it's my fault for not thinking about how well the second case would work for non-flattened dicts when I originally introduced these options. Max > It took me a couple of reads of this in tandem > with 4/4, but it looks correct.
diff --git a/block/qcow2.c b/block/qcow2.c index c64d611..c6099b5 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -403,6 +403,12 @@ static QemuOptsList qcow2_runtime_opts = { "templates (none, constant, cached, all)", }, { + .name = QCOW2_OPT_OVERLAP_TEMPLATE, + .type = QEMU_OPT_STRING, + .help = "Selects which overlap checks to perform from a range of " + "templates (none, constant, cached, all)", + }, + { .name = QCOW2_OPT_OVERLAP_MAIN_HEADER, .type = QEMU_OPT_BOOL, .help = "Check for unintended writes into the main qcow2 header", @@ -539,7 +545,7 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, Error *local_err = NULL; uint64_t ext_end; uint64_t l1_vm_state_index; - const char *opt_overlap_check; + const char *opt_overlap_check, *opt_overlap_check_template; int overlap_check_template = 0; uint64_t l2_cache_size, refcount_cache_size; @@ -919,7 +925,21 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags, s->discard_passthrough[QCOW2_DISCARD_OTHER] = qemu_opt_get_bool(opts, QCOW2_OPT_DISCARD_OTHER, false); - opt_overlap_check = qemu_opt_get(opts, "overlap-check") ?: "cached"; + opt_overlap_check = qemu_opt_get(opts, QCOW2_OPT_OVERLAP); + opt_overlap_check_template = qemu_opt_get(opts, QCOW2_OPT_OVERLAP_TEMPLATE); + if (opt_overlap_check_template && opt_overlap_check && + strcmp(opt_overlap_check_template, opt_overlap_check)) + { + error_setg(errp, "Conflicting values for qcow2 options '" + QCOW2_OPT_OVERLAP "' ('%s') and '" QCOW2_OPT_OVERLAP_TEMPLATE + "' ('%s')", opt_overlap_check, opt_overlap_check_template); + ret = -EINVAL; + goto fail; + } + if (!opt_overlap_check) { + opt_overlap_check = opt_overlap_check_template ?: "cached"; + } + if (!strcmp(opt_overlap_check, "none")) { overlap_check_template = 0; } else if (!strcmp(opt_overlap_check, "constant")) { diff --git a/block/qcow2.h b/block/qcow2.h index 6aeb7ea..7806ba1 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -83,6 +83,7 @@ #define QCOW2_OPT_DISCARD_SNAPSHOT "pass-discard-snapshot" #define QCOW2_OPT_DISCARD_OTHER "pass-discard-other" #define QCOW2_OPT_OVERLAP "overlap-check" +#define QCOW2_OPT_OVERLAP_TEMPLATE "overlap-check.template" #define QCOW2_OPT_OVERLAP_MAIN_HEADER "overlap-check.main-header" #define QCOW2_OPT_OVERLAP_ACTIVE_L1 "overlap-check.active-l1" #define QCOW2_OPT_OVERLAP_ACTIVE_L2 "overlap-check.active-l2"
Being able to set the overlap-check option to a string and then refine it via the overlap-check.* options is a nice idea for the command line but does not work so well for non-flattened dicts. In that case, one can only specify either but not both, so add a field to overlap-check.* which does the same as directly specifying overlap-check but can be used in conjunction with the other fields in non-flattened dicts. Signed-off-by: Max Reitz <mreitz@redhat.com> --- block/qcow2.c | 24 ++++++++++++++++++++++-- block/qcow2.h | 1 + 2 files changed, 23 insertions(+), 2 deletions(-)