From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:55092) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V8nek-0001Kp-AL for qemu-devel@nongnu.org; Mon, 12 Aug 2013 04:39:20 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1V8nea-0003ZN-IT for qemu-devel@nongnu.org; Mon, 12 Aug 2013 04:39:14 -0400 Received: from cantor2.suse.de ([195.135.220.15]:52293 helo=mx2.suse.de) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1V8nea-0003ZD-97 for qemu-devel@nongnu.org; Mon, 12 Aug 2013 04:39:04 -0400 Message-ID: <52089F24.1030304@suse.de> Date: Mon, 12 Aug 2013 10:39:00 +0200 From: =?ISO-8859-15?Q?Andreas_F=E4rber?= MIME-Version: 1.0 References: <1376237638-6968-1-git-send-email-pbonzini@redhat.com> <1376237638-6968-2-git-send-email-pbonzini@redhat.com> In-Reply-To: <1376237638-6968-2-git-send-email-pbonzini@redhat.com> Content-Type: text/plain; charset=ISO-8859-15 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH 1/2] vmdk: support vmfsSparse files List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini Cc: kwolf@redhat.com, famz@redhat.com, qemu-devel@nongnu.org Am 11.08.2013 18:13, schrieb Paolo Bonzini: > VMware ESX hosts use a variant of the VMDK3 format, identified by the > vmfsSparse create type ad the VMFSSPARSE extent type. "and"? > It has 16 KB grain tables (L2) and a variable-size grain directory (L1)= . > In addition, the grain size is always 512, but that is not a problem > because it is included in the header. >=20 > The format of the extents is documented in the VMDK spec. The format > of the descriptor file is not documented precisely, but it can be > found at http://kb.vmware.com/kb/10026353 (Recreating a missing virtual > machine disk (VMDK) descriptor file for delta disks). >=20 > With these patches, vmfsSparse files only work if opened through the > descriptor file. Data files without descriptor files, as far as I > could understand, are not supported by ESX. >=20 > Signed-off-by: Paolo Bonzini > --- > block/vmdk.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 46 insertions(+), 5 deletions(-) >=20 > diff --git a/block/vmdk.c b/block/vmdk.c > index b16d509..eaf484a 100644 > --- a/block/vmdk.c > +++ b/block/vmdk.c > @@ -505,6 +505,34 @@ static int vmdk_open_vmdk3(BlockDriverState *bs, > return ret; > } > =20 > +static int vmdk_open_vmfs_sparse(BlockDriverState *bs, > + BlockDriverState *file, > + int flags) > +{ > + int ret; > + uint32_t magic; > + VMDK3Header header; > + VmdkExtent *extent; > + > + ret =3D bdrv_pread(file, sizeof(magic), &header, sizeof(header)); > + if (ret < 0) { > + return ret; > + } > + extent =3D vmdk_add_extent(bs, file, false, > + le64_to_cpu(header.disk_sectors), > + le64_to_cpu(header.l1dir_offset) << 9, > + 0, > + le64_to_cpu(header.l1dir_size) * 4, > + 4096, > + le64_to_cpu(header.granularity)); /* always = 512 */ Indentation is 3 off (guessing the variable was called ext before ;)). Andreas > + ret =3D vmdk_init_tables(bs, extent); > + if (ret) { > + /* free extent allocated by vmdk_add_extent */ > + vmdk_free_last_extent(bs); > + } > + return ret; > +} > + > static int vmdk_open_desc_file(BlockDriverState *bs, int flags, > uint64_t desc_offset); > =20 > @@ -663,7 +691,7 @@ static int vmdk_parse_description(const char *desc,= const char *opt_name, > /* Open an extent file and append to bs array */ > static int vmdk_open_sparse(BlockDriverState *bs, > BlockDriverState *file, > - int flags) > + int flags, bool vmfs_sparse) > { > uint32_t magic; > =20 > @@ -674,7 +702,11 @@ static int vmdk_open_sparse(BlockDriverState *bs, > magic =3D be32_to_cpu(magic); > switch (magic) { > case VMDK3_MAGIC: > - return vmdk_open_vmdk3(bs, file, flags); > + if (vmfs_sparse) { > + return vmdk_open_vmfs_sparse(bs, file, flags); > + } else { > + return vmdk_open_vmdk3(bs, file, flags); > + } > break; > case VMDK4_MAGIC: > return vmdk_open_vmdk4(bs, file, flags); > @@ -718,7 +750,8 @@ static int vmdk_parse_extents(const char *desc, Blo= ckDriverState *bs, > } > =20 > if (sectors <=3D 0 || > - (strcmp(type, "FLAT") && strcmp(type, "SPARSE")) || > + (strcmp(type, "FLAT") && strcmp(type, "SPARSE") && > + strcmp(type, "VMFSSPARSE")) || > (strcmp(access, "RW"))) { > goto next_line; > } > @@ -743,7 +776,14 @@ static int vmdk_parse_extents(const char *desc, Bl= ockDriverState *bs, > extent->flat_start_offset =3D flat_offset << 9; > } else if (!strcmp(type, "SPARSE")) { > /* SPARSE extent */ > - ret =3D vmdk_open_sparse(bs, extent_file, bs->open_flags); > + ret =3D vmdk_open_sparse(bs, extent_file, bs->open_flags, = false); > + if (ret) { > + bdrv_delete(extent_file); > + return ret; > + } > + } else if (!strcmp(type, "VMFSSPARSE")) { > + /* VMFSSPARSE extent */ > + ret =3D vmdk_open_sparse(bs, extent_file, bs->open_flags, = true); > if (ret) { > bdrv_delete(extent_file); > return ret; > @@ -789,6 +829,7 @@ static int vmdk_open_desc_file(BlockDriverState *bs= , int flags, > goto exit; > } > if (strcmp(ct, "monolithicFlat") && > + strcmp(ct, "vmfsSparse") && > strcmp(ct, "twoGbMaxExtentSparse") && > strcmp(ct, "twoGbMaxExtentFlat")) { > fprintf(stderr, > @@ -808,7 +849,7 @@ static int vmdk_open(BlockDriverState *bs, QDict *o= ptions, int flags) > int ret; > BDRVVmdkState *s =3D bs->opaque; > =20 > - if (vmdk_open_sparse(bs, bs->file, flags) =3D=3D 0) { > + if (vmdk_open_sparse(bs, bs->file, flags, false) =3D=3D 0) { > s->desc_offset =3D 0x200; > } else { > ret =3D vmdk_open_desc_file(bs, flags, 0); >=20 --=20 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 N=FCrnberg, Germany GF: Jeff Hawn, Jennifer Guild, Felix Imend=F6rffer; HRB 16746 AG N=FCrnbe= rg