From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39954) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VlHbK-0005mR-Er for qemu-devel@nongnu.org; Tue, 26 Nov 2013 07:18:51 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VlHbF-0008Kx-DC for qemu-devel@nongnu.org; Tue, 26 Nov 2013 07:18:46 -0500 Message-ID: <52949198.8080907@redhat.com> Date: Tue, 26 Nov 2013 20:18:32 +0800 From: Fam Zheng MIME-Version: 1.0 References: <1385462881-12290-1-git-send-email-kwolf@redhat.com> In-Reply-To: <1385462881-12290-1-git-send-email-kwolf@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [Qemu-stable] [PATCH] qcow2: Zero-initialise first cluster for new images List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kevin Wolf , qemu-devel@nongnu.org Cc: qemu-stable@nongnu.org, stefanha@redhat.com On 2013=E5=B9=B411=E6=9C=8826=E6=97=A5 18:48, Kevin Wolf wrote: > Strictly speaking, this is only required for has_zero_init() =3D=3D fal= se, > but it's easy enough to just do a cluster-aligned write that is padded > with zeros after the header. > > This fixes that after 'qemu-img create' header extensions are attempted > to be parsed that are really just random leftover data. > > Cc: qemu-stable@nongnu.org > Signed-off-by: Kevin Wolf > --- > block/qcow2.c | 37 +++++++++++++++++++++---------------- > 1 file changed, 21 insertions(+), 16 deletions(-) > > diff --git a/block/qcow2.c b/block/qcow2.c > index 6e5d98d..7c18587 100644 > --- a/block/qcow2.c > +++ b/block/qcow2.c > @@ -1471,7 +1471,7 @@ static int qcow2_create2(const char *filename, in= t64_t total_size, > * size for any qcow2 image. > */ > BlockDriverState* bs; > - QCowHeader header; > + QCowHeader *header; > uint8_t* refcount_table; > Error *local_err =3D NULL; > int ret; > @@ -1489,30 +1489,35 @@ static int qcow2_create2(const char *filename, = int64_t total_size, > } > > /* Write the header */ > - memset(&header, 0, sizeof(header)); > - header.magic =3D cpu_to_be32(QCOW_MAGIC); > - header.version =3D cpu_to_be32(version); > - header.cluster_bits =3D cpu_to_be32(cluster_bits); > - header.size =3D cpu_to_be64(0); > - header.l1_table_offset =3D cpu_to_be64(0); > - header.l1_size =3D cpu_to_be32(0); > - header.refcount_table_offset =3D cpu_to_be64(cluster_size); > - header.refcount_table_clusters =3D cpu_to_be32(1); > - header.refcount_order =3D cpu_to_be32(3 + REFCOUNT_SHIFT); > - header.header_length =3D cpu_to_be32(sizeof(header)); > + QEMU_BUILD_BUG_ON((1 << MIN_CLUSTER_BITS) < sizeof(*header)); > + header =3D g_malloc(cluster_size); > + memset(header, 0, cluster_size); Could just be: header =3D g_malloc0(cluster_size); But either way, Reviewed-by: Fam Zheng > + *header =3D (QCowHeader) { > + .magic =3D cpu_to_be32(QCOW_MAGIC), > + .version =3D cpu_to_be32(version), > + .cluster_bits =3D cpu_to_be32(cluster_bits), > + .size =3D cpu_to_be64(0), > + .l1_table_offset =3D cpu_to_be64(0), > + .l1_size =3D cpu_to_be32(0), > + .refcount_table_offset =3D cpu_to_be64(cluster_size), > + .refcount_table_clusters =3D cpu_to_be32(1), > + .refcount_order =3D cpu_to_be32(3 + REFCOUNT_SHIFT= ), > + .header_length =3D cpu_to_be32(sizeof(*header)), > + }; > > if (flags & BLOCK_FLAG_ENCRYPT) { > - header.crypt_method =3D cpu_to_be32(QCOW_CRYPT_AES); > + header->crypt_method =3D cpu_to_be32(QCOW_CRYPT_AES); > } else { > - header.crypt_method =3D cpu_to_be32(QCOW_CRYPT_NONE); > + header->crypt_method =3D cpu_to_be32(QCOW_CRYPT_NONE); > } > > if (flags & BLOCK_FLAG_LAZY_REFCOUNTS) { > - header.compatible_features |=3D > + header->compatible_features |=3D > cpu_to_be64(QCOW2_COMPAT_LAZY_REFCOUNTS); > } > > - ret =3D bdrv_pwrite(bs, 0, &header, sizeof(header)); > + ret =3D bdrv_pwrite(bs, 0, header, cluster_size); > + g_free(header); > if (ret < 0) { > error_setg_errno(errp, -ret, "Could not write qcow2 header"); > goto out; >