From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:56542) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UGYY7-0005dA-Qn for qemu-devel@nongnu.org; Fri, 15 Mar 2013 13:36:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UGYY5-0001sx-Od for qemu-devel@nongnu.org; Fri, 15 Mar 2013 13:36:11 -0400 Received: from e23smtp03.au.ibm.com ([202.81.31.145]:52203) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UGYY4-0001se-W0 for qemu-devel@nongnu.org; Fri, 15 Mar 2013 13:36:09 -0400 Received: from /spool/local by e23smtp03.au.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Sat, 16 Mar 2013 03:29:23 +1000 Received: from d23relay05.au.ibm.com (d23relay05.au.ibm.com [9.190.235.152]) by d23dlp02.au.ibm.com (Postfix) with ESMTP id DE43D2BB0051 for ; Sat, 16 Mar 2013 04:35:58 +1100 (EST) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.234.97]) by d23relay05.au.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r2FHN2en9765132 for ; Sat, 16 Mar 2013 04:23:02 +1100 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id r2FHZwdO003063 for ; Sat, 16 Mar 2013 04:35:58 +1100 From: Anthony Liguori In-Reply-To: <5143541B.3020407@redhat.com> References: <1363360465-5247-1-git-send-email-stefanha@redhat.com> <1363360465-5247-9-git-send-email-stefanha@redhat.com> <5143541B.3020407@redhat.com> Date: Fri, 15 Mar 2013 12:35:18 -0500 Message-ID: <87d2v0in1l.fsf@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: Re: [Qemu-devel] [PATCH 08/28] qcow2: Allow lazy refcounts to be enabled on the command line List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini , Stefan Hajnoczi Cc: qemu-devel@nongnu.org Paolo Bonzini writes: > Il 15/03/2013 16:14, Stefan Hajnoczi ha scritto: >> From: Kevin Wolf >> >> qcow2 images now accept a boolean lazy_refcounts options. Use it like >> this: >> >> -drive file=test.qcow2,lazy_refcounts=on >> >> If the option is specified on the command line, it overrides the default >> specified by the qcow2 header flags that were set when creating the >> image. >> >> Signed-off-by: Kevin Wolf >> Reviewed-by: Eric Blake >> Reviewed-by: Stefan Hajnoczi >> Signed-off-by: Stefan Hajnoczi >> --- >> block/qcow2-cluster.c | 2 +- >> block/qcow2.c | 37 +++++++++++++++++++++++++++++++++++++ >> block/qcow2.h | 1 + >> 3 files changed, 39 insertions(+), 1 deletion(-) >> >> diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c >> index 56fccf9..ff9ae18 100644 >> --- a/block/qcow2-cluster.c >> +++ b/block/qcow2-cluster.c >> @@ -668,7 +668,7 @@ int qcow2_alloc_cluster_link_l2(BlockDriverState *bs, QCowL2Meta *m) >> } >> >> /* Update L2 table. */ >> - if (s->compatible_features & QCOW2_COMPAT_LAZY_REFCOUNTS) { >> + if (s->use_lazy_refcounts) { >> qcow2_mark_dirty(bs); >> } >> if (qcow2_need_accurate_refcounts(s)) { >> diff --git a/block/qcow2.c b/block/qcow2.c >> index f5e4269..ad43a13 100644 >> --- a/block/qcow2.c >> +++ b/block/qcow2.c >> @@ -285,11 +285,26 @@ static int qcow2_check(BlockDriverState *bs, BdrvCheckResult *result, >> return ret; >> } >> >> +static QemuOptsList qcow2_runtime_opts = { >> + .name = "qcow2", >> + .head = QTAILQ_HEAD_INITIALIZER(qcow2_runtime_opts.head), >> + .desc = { >> + { >> + .name = "lazy_refcounts", >> + .type = QEMU_OPT_BOOL, >> + .help = "Postpone refcount updates", >> + }, >> + { /* end of list */ } >> + }, >> +}; >> + >> static int qcow2_open(BlockDriverState *bs, QDict *options, int flags) >> { >> BDRVQcowState *s = bs->opaque; >> int len, i, ret = 0; >> QCowHeader header; >> + QemuOpts *opts; >> + Error *local_err = NULL; >> uint64_t ext_end; >> >> ret = bdrv_pread(bs->file, 0, &header, sizeof(header)); >> @@ -495,6 +510,28 @@ static int qcow2_open(BlockDriverState *bs, QDict *options, int flags) >> } >> } >> >> + /* Enable lazy_refcounts according to image and command line options */ >> + opts = qemu_opts_create_nofail(&qcow2_runtime_opts); >> + qemu_opts_absorb_qdict(opts, options, &local_err); > > This breaks migration with qcow2 images: I already processed the pull unfortunately. I'm going to be offline for most of the weekend but if there's a patch in the next hour to revert or fix I can apply it. Regards, Anthony Liguori > > Program received signal SIGSEGV, Segmentation fault. > qdict_next_entry (first_bucket=0, qdict=0x0) at /home/pbonzini/work/upstream/qemu/qobject/qdict.c:371 > 371 if (!QLIST_EMPTY(&qdict->table[i])) { > (gdb) up > #1 qdict_first (qdict=qdict@entry=0x0) at /home/pbonzini/work/upstream/qemu/qobject/qdict.c:384 > 384 return qdict_next_entry(qdict, 0); > (gdb) > #2 0x00007fb8edf75ae6 in qemu_opts_absorb_qdict (opts=opts@entry=0x7fb8f0651740, qdict=qdict@entry=0x0, errp=errp@entry=0x7fb8edc36e80) > at /home/pbonzini/work/upstream/qemu/util/qemu-option.c:1078 > 1078 entry = qdict_first(qdict); > (gdb) > #3 0x00007fb8edd15074 in qcow2_open (bs=0x7fb8f041b800, options=0x0, flags=) at /home/pbonzini/work/upstream/qemu/block/qcow2.c:515 > 515 qemu_opts_absorb_qdict(opts, options, &local_err); > (gdb) > #4 0x00007fb8edd00352 in bdrv_invalidate_cache (bs=0x7fb8f041b800) at /home/pbonzini/work/upstream/qemu/block.c:4192 > 4192 bs->drv->bdrv_invalidate_cache(bs); > > Paolo > >> + if (error_is_set(&local_err)) { >> + qerror_report_err(local_err); >> + error_free(local_err); >> + ret = -EINVAL; >> + goto fail; >> + } >> + >> + s->use_lazy_refcounts = qemu_opt_get_bool(opts, "lazy_refcounts", >> + (s->compatible_features & QCOW2_COMPAT_LAZY_REFCOUNTS)); >> + >> + qemu_opts_del(opts); >> + >> + if (s->use_lazy_refcounts && s->qcow_version < 3) { >> + qerror_report(ERROR_CLASS_GENERIC_ERROR, "Lazy refcounts require " >> + "a qcow2 image with at least qemu 1.1 compatibility level"); >> + ret = -EINVAL; >> + goto fail; >> + } >> + >> #ifdef DEBUG_ALLOC >> { >> BdrvCheckResult result = {0}; >> diff --git a/block/qcow2.h b/block/qcow2.h >> index 718b52b..103abdb 100644 >> --- a/block/qcow2.h >> +++ b/block/qcow2.h >> @@ -173,6 +173,7 @@ typedef struct BDRVQcowState { >> >> int flags; >> int qcow_version; >> + bool use_lazy_refcounts; >> >> uint64_t incompatible_features; >> uint64_t compatible_features; >>