From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58119) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRKoy-00047n-JC for qemu-devel@nongnu.org; Tue, 09 Sep 2014 08:47:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XRKos-0000ip-NA for qemu-devel@nongnu.org; Tue, 09 Sep 2014 08:46:56 -0400 Received: from lputeaux-656-01-25-125.w80-12.abo.wanadoo.fr ([80.12.84.125]:51290 helo=paradis.irqsave.net) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XRKos-0000ig-Cm for qemu-devel@nongnu.org; Tue, 09 Sep 2014 08:46:50 -0400 Date: Tue, 9 Sep 2014 14:45:56 +0200 From: =?iso-8859-1?Q?Beno=EEt?= Canet Message-ID: <20140909124556.GC22473@irqsave.net> References: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline In-Reply-To: Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v14 3/5] qapi: introduce PreallocMode and new PreallocModes full and falloc. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Hu Tao Cc: Kevin Wolf , Fam Zheng , "Richard W.M. Jones" , qemu-devel@nongnu.org, Max Reitz , Stefan Hajnoczi , Yasunori Goto The Tuesday 09 Sep 2014 =E0 11:54:29 (+0800), Hu Tao wrote : > This patch prepares for the subsequent patches. >=20 > Signed-off-by: Hu Tao > Reviewed-by: Max Reitz > Reviewed-by: Kevin Wolf > --- > block/qcow2.c | 23 +++++++++++++++-------- > qapi/block-core.json | 17 +++++++++++++++++ > tests/qemu-iotests/049.out | 2 +- > 3 files changed, 33 insertions(+), 9 deletions(-) >=20 > diff --git a/block/qcow2.c b/block/qcow2.c > index cf27c3f..94d1225 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -30,6 +30,7 @@ > #include "qemu/error-report.h" > #include "qapi/qmp/qerror.h" > #include "qapi/qmp/qbool.h" > +#include "qapi/util.h" > #include "trace.h" > #include "qemu/option_int.h" > =20 > @@ -1738,7 +1739,7 @@ static int preallocate(BlockDriverState *bs) > =20 > static int qcow2_create2(const char *filename, int64_t total_size, > const char *backing_file, const char *backing= _format, > - int flags, size_t cluster_size, int prealloc, > + int flags, size_t cluster_size, PreallocMode = prealloc, > QemuOpts *opts, int version, > Error **errp) below that. Carefull study of the code tell us that here prealloc will be 0 or 1 but i think you could prepare a bit sooner the next patch by doing: - if (prealloc) { = =20 + if (prealloc =3D=3D PREALLOC_MODE_METADATA) { BDRVQcowState *s =3D bs->opaque; in the same qcow2_create2 function. If you do so someone who start reading the code at this precise commit wi= ll not have to lookup the declaration order of PreallocMode in the QAPI file= . > { > @@ -1915,7 +1916,7 @@ static int qcow2_create(const char *filename, Qem= uOpts *opts, Error **errp) > uint64_t size =3D 0; > int flags =3D 0; > size_t cluster_size =3D DEFAULT_CLUSTER_SIZE; > - int prealloc =3D 0; > + PreallocMode prealloc; > int version =3D 3; > Error *local_err =3D NULL; > int ret; > @@ -1931,12 +1932,11 @@ static int qcow2_create(const char *filename, Q= emuOpts *opts, Error **errp) > cluster_size =3D qemu_opt_get_size_del(opts, BLOCK_OPT_CLUSTER_SIZ= E, > DEFAULT_CLUSTER_SIZE); > buf =3D qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC); > - if (!buf || !strcmp(buf, "off")) { > - prealloc =3D 0; > - } else if (!strcmp(buf, "metadata")) { > - prealloc =3D 1; > - } else { > - error_setg(errp, "Invalid preallocation mode: '%s'", buf); > + prealloc =3D qapi_enum_parse(PreallocMode_lookup, buf, > + PREALLOC_MODE_MAX, PREALLOC_MODE_OFF, > + &local_err); > + if (local_err) { > + error_propagate(errp, local_err); > ret =3D -EINVAL; > goto finish; > } > @@ -1958,6 +1958,13 @@ static int qcow2_create(const char *filename, Qe= muOpts *opts, Error **errp) > flags |=3D BLOCK_FLAG_LAZY_REFCOUNTS; > } > =20 > + if (prealloc && prealloc !=3D PREALLOC_MODE_METADATA) { > + ret =3D -EINVAL; > + error_setg(errp, "Unsupported preallocate mode: %s", > + PreallocMode_lookup[prealloc]); > + goto finish; > + } > + > if (backing_file && prealloc) { > error_setg(errp, "Backing file and preallocation cannot be use= d at " > "the same time"); > diff --git a/qapi/block-core.json b/qapi/block-core.json > index a685d02..a29dbe1 100644 > --- a/qapi/block-core.json > +++ b/qapi/block-core.json > @@ -1697,3 +1697,20 @@ > 'len' : 'int', > 'offset': 'int', > 'speed' : 'int' } } > + > +# @PreallocMode > +# > +# Preallocation mode of QEMU image file > +# > +# @off: no preallocation > +# @metadata: preallocate only for metadata > +# @falloc: like @full preallocation but allocate disk space by > +# posix_fallocate() rather than writing zeros. > +# @full: preallocate all data by writing zeros to device to ensure dis= k > +# space is really available. @full preallocation also sets up > +# metadata correctly. > +# > +# Since 2.2 > +## > +{ 'enum': 'PreallocMode', > + 'data': [ 'off', 'metadata', 'falloc', 'full' ] } > diff --git a/tests/qemu-iotests/049.out b/tests/qemu-iotests/049.out > index 71ca44d..09ca0ae 100644 > --- a/tests/qemu-iotests/049.out > +++ b/tests/qemu-iotests/049.out > @@ -179,7 +179,7 @@ qemu-img create -f qcow2 -o preallocation=3Dmetadat= a TEST_DIR/t.qcow2 64M > Formatting 'TEST_DIR/t.qcow2', fmt=3Dqcow2 size=3D67108864 encryption=3D= off cluster_size=3D65536 preallocation=3D'metadata' lazy_refcounts=3Doff=20 > =20 > qemu-img create -f qcow2 -o preallocation=3D1234 TEST_DIR/t.qcow2 64M > -qemu-img: TEST_DIR/t.qcow2: Invalid preallocation mode: '1234' > +qemu-img: TEST_DIR/t.qcow2: invalid parameter value: 1234 > Formatting 'TEST_DIR/t.qcow2', fmt=3Dqcow2 size=3D67108864 encryption=3D= off cluster_size=3D65536 preallocation=3D'1234' lazy_refcounts=3Doff=20 > =20 > =3D=3D Check encryption option =3D=3D > --=20 > 1.9.3 >=20 >=20