From nobody Wed Oct 29 20:29:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525845726924309.9023008936739; Tue, 8 May 2018 23:02:06 -0700 (PDT) Received: from localhost ([::1]:54672 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGIAw-0000G5-3C for importer@patchew.org; Wed, 09 May 2018 02:02:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49570) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGI7M-0005iV-UV for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fGI7J-0000ok-Uu for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:25 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:40250 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fGI7F-0000fQ-DL; Wed, 09 May 2018 01:58:17 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E5E35818F6EC; Wed, 9 May 2018 05:58:16 +0000 (UTC) Received: from lemon.usersys.redhat.com (ovpn-12-170.pek2.redhat.com [10.72.12.170]) by smtp.corp.redhat.com (Postfix) with ESMTP id 99CC910F1BF7; Wed, 9 May 2018 05:58:13 +0000 (UTC) From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 9 May 2018 13:57:58 +0800 Message-Id: <20180509055802.28423-2-famz@redhat.com> In-Reply-To: <20180509055802.28423-1-famz@redhat.com> References: <20180509055802.28423-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 09 May 2018 05:58:16 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 09 May 2018 05:58:16 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'famz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH 1/5] qapi: Add qapi_enum_parse_full X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Michael Roth , qemu-block@nongnu.org, Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This variant of qapi_enum_parse can do case insensitive compare. Signed-off-by: Fam Zheng --- include/qapi/util.h | 2 ++ qapi/qapi-util.c | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/include/qapi/util.h b/include/qapi/util.h index a7c3c64148..2cec231919 100644 --- a/include/qapi/util.h +++ b/include/qapi/util.h @@ -19,6 +19,8 @@ typedef struct QEnumLookup { const char *qapi_enum_lookup(const QEnumLookup *lookup, int val); int qapi_enum_parse(const QEnumLookup *lookup, const char *buf, int def, Error **errp); +int qapi_enum_parse_full(const QEnumLookup *lookup, const char *buf, + int def, bool ignore_case, Error **errp); =20 int parse_qapi_name(const char *name, bool complete); =20 diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c index e9b266bb70..6180957edb 100644 --- a/qapi/qapi-util.c +++ b/qapi/qapi-util.c @@ -21,8 +21,8 @@ const char *qapi_enum_lookup(const QEnumLookup *lookup, i= nt val) return lookup->array[val]; } =20 -int qapi_enum_parse(const QEnumLookup *lookup, const char *buf, - int def, Error **errp) +int qapi_enum_parse_full(const QEnumLookup *lookup, const char *buf, + int def, bool ignore_case, Error **errp) { int i; =20 @@ -31,8 +31,14 @@ int qapi_enum_parse(const QEnumLookup *lookup, const cha= r *buf, } =20 for (i =3D 0; i < lookup->size; i++) { - if (!strcmp(buf, lookup->array[i])) { - return i; + if (ignore_case) { + if (!strcasecmp(buf, lookup->array[i])) { + return i; + } + } else { + if (!strcmp(buf, lookup->array[i])) { + return i; + } } } =20 @@ -40,6 +46,12 @@ int qapi_enum_parse(const QEnumLookup *lookup, const cha= r *buf, return def; } =20 +int qapi_enum_parse(const QEnumLookup *lookup, const char *buf, + int def, Error **errp) +{ + return qapi_enum_parse_full(lookup, buf, def, false, errp); +} + /* * Parse a valid QAPI name from @str. * A valid name consists of letters, digits, hyphen and underscore. --=20 2.14.3 From nobody Wed Oct 29 20:29:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525845777697303.88872307117924; Tue, 8 May 2018 23:02:57 -0700 (PDT) Received: from localhost ([::1]:54674 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGIBk-0000nB-Tk for importer@patchew.org; Wed, 09 May 2018 02:02:56 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49598) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGI7P-0005md-6G for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fGI7O-0000xI-AC for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:27 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:59956 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fGI7K-0000og-0n; Wed, 09 May 2018 01:58:22 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 821C64067F19; Wed, 9 May 2018 05:58:21 +0000 (UTC) Received: from lemon.usersys.redhat.com (ovpn-12-170.pek2.redhat.com [10.72.12.170]) by smtp.corp.redhat.com (Postfix) with ESMTP id B440D10F1BF7; Wed, 9 May 2018 05:58:17 +0000 (UTC) From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 9 May 2018 13:57:59 +0800 Message-Id: <20180509055802.28423-3-famz@redhat.com> In-Reply-To: <20180509055802.28423-1-famz@redhat.com> References: <20180509055802.28423-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Wed, 09 May 2018 05:58:21 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.7]); Wed, 09 May 2018 05:58:21 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'famz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH 2/5] vmdk: Refactor vmdk_create_extent X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Michael Roth , qemu-block@nongnu.org, Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" The extracted vmdk_init_extent takes a BlockBackend object and initializes the format metadata. It is the common part between "qemu-img create" and "blockdev-create". Add a "BlockBackend *pbb" parameter to vmdk_create_extent, to return the opened BB to the caller in the next patch. Signed-off-by: Fam Zheng --- block/vmdk.c | 71 +++++++++++++++++++++++++++++++++++++-------------------= ---- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 84f8bbe480..083942f806 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1714,35 +1714,17 @@ static int coroutine_fn vmdk_co_pwrite_zeroes(Block= DriverState *bs, return ret; } =20 -static int vmdk_create_extent(const char *filename, int64_t filesize, - bool flat, bool compress, bool zeroed_grain, - QemuOpts *opts, Error **errp) +static int vmdk_init_extent(BlockBackend *blk, + int64_t filesize, bool flat, + bool compress, bool zeroed_grain, + Error **errp) { int ret, i; - BlockBackend *blk =3D NULL; VMDK4Header header; - Error *local_err =3D NULL; uint32_t tmp, magic, grains, gd_sectors, gt_size, gt_count; uint32_t *gd_buf =3D NULL; int gd_buf_size; =20 - ret =3D bdrv_create_file(filename, opts, &local_err); - if (ret < 0) { - error_propagate(errp, local_err); - goto exit; - } - - blk =3D blk_new_open(filename, NULL, NULL, - BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, - &local_err); - if (blk =3D=3D NULL) { - error_propagate(errp, local_err); - ret =3D -EIO; - goto exit; - } - - blk_set_allow_write_beyond_eof(blk, true); - if (flat) { ret =3D blk_truncate(blk, filesize, PREALLOC_MODE_OFF, errp); goto exit; @@ -1836,18 +1818,53 @@ static int vmdk_create_extent(const char *filename,= int64_t filesize, gd_buf, gd_buf_size, 0); if (ret < 0) { error_setg(errp, QERR_IO_ERROR); - goto exit; } =20 ret =3D 0; exit: - if (blk) { - blk_unref(blk); - } g_free(gd_buf); return ret; } =20 +static int vmdk_create_extent(const char *filename, int64_t filesize, + bool flat, bool compress, bool zeroed_grain, + BlockBackend **pbb, + QemuOpts *opts, Error **errp) +{ + int ret; + BlockBackend *blk =3D NULL; + Error *local_err =3D NULL; + + ret =3D bdrv_create_file(filename, opts, &local_err); + if (ret < 0) { + error_propagate(errp, local_err); + goto exit; + } + + blk =3D blk_new_open(filename, NULL, NULL, + BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, + &local_err); + if (blk =3D=3D NULL) { + error_propagate(errp, local_err); + ret =3D -EIO; + goto exit; + } + + blk_set_allow_write_beyond_eof(blk, true); + + ret =3D vmdk_init_extent(blk, filesize, flat, compress, zeroed_grain, = errp); +exit: + if (blk) { + if (pbb) { + *pbb =3D blk; + } else { + blk_unref(blk); + blk =3D NULL; + } + } + return ret; +} + static int filename_decompose(const char *filename, char *path, char *pref= ix, char *postfix, size_t buf_len, Error **errp) { @@ -2067,7 +2084,7 @@ static int coroutine_fn vmdk_co_create_opts(const cha= r *filename, QemuOpts *opts snprintf(ext_filename, PATH_MAX, "%s%s", path, desc_filename); =20 if (vmdk_create_extent(ext_filename, size, - flat, compress, zeroed_grain, opts, errp)) { + flat, compress, zeroed_grain, NULL, opts, e= rrp)) { ret =3D -EINVAL; goto exit; } --=20 2.14.3 From nobody Wed Oct 29 20:29:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (208.118.235.17 [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525845637691285.5882763724684; Tue, 8 May 2018 23:00:37 -0700 (PDT) Received: from localhost ([::1]:54656 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGI9N-0007as-RV for importer@patchew.org; Wed, 09 May 2018 02:00:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49633) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGI7Y-0005tT-32 for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fGI7U-00015X-Ur for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:36 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:55138 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fGI7P-0000xn-CJ; Wed, 09 May 2018 01:58:27 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D29808D6EC; Wed, 9 May 2018 05:58:26 +0000 (UTC) Received: from lemon.usersys.redhat.com (ovpn-12-170.pek2.redhat.com [10.72.12.170]) by smtp.corp.redhat.com (Postfix) with ESMTP id 1F82310F1BF7; Wed, 9 May 2018 05:58:21 +0000 (UTC) From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 9 May 2018 13:58:00 +0800 Message-Id: <20180509055802.28423-4-famz@redhat.com> In-Reply-To: <20180509055802.28423-1-famz@redhat.com> References: <20180509055802.28423-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Wed, 09 May 2018 05:58:26 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.2]); Wed, 09 May 2018 05:58:26 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'famz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH 3/5] vmdk: Implement .bdrv_co_create callback X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Michael Roth , qemu-block@nongnu.org, Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This makes VMDK support x-blockdev-create. The implementation reuses the image creation code in vmdk_co_create_opts which now acceptes a callback pointer to "retrieve" BlockBackend pointers from the caller. This way we separate the logic between file/extent acquisition and initialization. The QAPI command parameters are mostly the same as the old create_opts except the dropped legacy @compat6 switch, which is redundant with @hwversion. Signed-off-by: Fam Zheng --- block/vmdk.c | 481 +++++++++++++++++++++++++++++++++++++----------= ---- qapi/block-core.json | 67 ++++++- 2 files changed, 418 insertions(+), 130 deletions(-) diff --git a/block/vmdk.c b/block/vmdk.c index 083942f806..e16b04e26a 100644 --- a/block/vmdk.c +++ b/block/vmdk.c @@ -1905,38 +1905,87 @@ static int filename_decompose(const char *filename,= char *path, char *prefix, return VMDK_OK; } =20 -static int coroutine_fn vmdk_co_create_opts(const char *filename, QemuOpts= *opts, - Error **errp) +/* Stringify BlockdevVmdkSubformat enum in the faimiliar camelCase. */ +static const char *vmdk_subformat_str(BlockdevVmdkSubformat subformat) { - int idx =3D 0; - BlockBackend *new_blk =3D NULL; + switch (subformat) { + case BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICSPARSE: + return "monolithicSparse"; + case BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICFLAT: + return "monolithicFlat"; + case BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT: + return "twoGbMaxExtentFlat"; + case BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTSPARSE: + return "twoGbMaxExtentSparse"; + case BLOCKDEV_VMDK_SUBFORMAT_STREAMOPTIMIZED: + return "streamOptimized"; + default: + abort(); + } +} + +/* + * idx =3D=3D 0: get or create the descriptor file (also the image file if= in a + * non-split format. + * idx >=3D 1: get the n-th extent if in a split subformat + */ +typedef BlockBackend *(*vmdk_create_extent_fn)(int64_t size, + int idx, + bool flat, + bool split, + bool compress, + bool zeroed_grain, + void *opaque, + Error **errp); + +static void vmdk_desc_add_extent(GString *desc, + const char *extent_line_fmt, + int64_t size, const char *filename) +{ + char *desc_line =3D g_malloc0(BUF_SIZE); + const char *basename =3D strrchr(filename, '/'); + if (!basename) { + basename =3D filename; + } else { + basename +=3D 1; + } + snprintf(desc_line, BUF_SIZE, extent_line_fmt, + DIV_ROUND_UP(size, BDRV_SECTOR_SIZE), + basename); + g_string_append(desc, desc_line); + g_free(desc_line); +} + +static int coroutine_fn vmdk_co_do_create(int64_t size, + BlockdevVmdkSubformat subformat, + BlockdevVmdkAdapterType adapter_= type, + const char *backing_file, + const char *hw_version, + bool compat6, + bool zeroed_grain, + vmdk_create_extent_fn extent_fn, + void *opaque, + Error **errp) +{ + int extent_idx; + BlockBackend *blk; Error *local_err =3D NULL; char *desc =3D NULL; - int64_t total_size =3D 0, filesize; - char *adapter_type =3D NULL; - char *backing_file =3D NULL; - char *hw_version =3D NULL; - char *fmt =3D NULL; int ret =3D 0; bool flat, split, compress; GString *ext_desc_lines; - char *path =3D g_malloc0(PATH_MAX); - char *prefix =3D g_malloc0(PATH_MAX); - char *postfix =3D g_malloc0(PATH_MAX); - char *desc_line =3D g_malloc0(BUF_SIZE); - char *ext_filename =3D g_malloc0(PATH_MAX); - char *desc_filename =3D g_malloc0(PATH_MAX); const int64_t split_size =3D 0x80000000; /* VMDK has constant split s= ize */ - const char *desc_extent_line; + int64_t extent_size; + int64_t created_size =3D 0; + const char *extent_line_fmt; char *parent_desc_line =3D g_malloc0(BUF_SIZE); uint32_t parent_cid =3D 0xffffffff; uint32_t number_heads =3D 16; - bool zeroed_grain =3D false; uint32_t desc_offset =3D 0, desc_len; const char desc_template[] =3D "# Disk DescriptorFile\n" "version=3D1\n" - "CID=3D%" PRIx32 "\n" + "CID=3D%08" PRIx32 "\n" "parentCID=3D%" PRIx32 "\n" "createType=3D\"%s\"\n" "%s" @@ -1955,71 +2004,35 @@ static int coroutine_fn vmdk_co_create_opts(const c= har *filename, QemuOpts *opts =20 ext_desc_lines =3D g_string_new(NULL); =20 - if (filename_decompose(filename, path, prefix, postfix, PATH_MAX, errp= )) { - ret =3D -EINVAL; - goto exit; - } /* Read out options */ - total_size =3D ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0), - BDRV_SECTOR_SIZE); - adapter_type =3D qemu_opt_get_del(opts, BLOCK_OPT_ADAPTER_TYPE); - backing_file =3D qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE); - hw_version =3D qemu_opt_get_del(opts, BLOCK_OPT_HWVERSION); - if (qemu_opt_get_bool_del(opts, BLOCK_OPT_COMPAT6, false)) { - if (strcmp(hw_version, "undefined")) { + if (compat6) { + if (hw_version) { error_setg(errp, "compat6 cannot be enabled with hwversion set"); ret =3D -EINVAL; goto exit; } - g_free(hw_version); - hw_version =3D g_strdup("6"); + hw_version =3D "6"; } - if (strcmp(hw_version, "undefined") =3D=3D 0) { - g_free(hw_version); - hw_version =3D g_strdup("4"); - } - fmt =3D qemu_opt_get_del(opts, BLOCK_OPT_SUBFMT); - if (qemu_opt_get_bool_del(opts, BLOCK_OPT_ZEROED_GRAIN, false)) { - zeroed_grain =3D true; + if (!hw_version) { + hw_version =3D "4"; } =20 - if (!adapter_type) { - adapter_type =3D g_strdup("ide"); - } else if (strcmp(adapter_type, "ide") && - strcmp(adapter_type, "buslogic") && - strcmp(adapter_type, "lsilogic") && - strcmp(adapter_type, "legacyESX")) { - error_setg(errp, "Unknown adapter type: '%s'", adapter_type); - ret =3D -EINVAL; - goto exit; - } - if (strcmp(adapter_type, "ide") !=3D 0) { + if (adapter_type !=3D BLOCKDEV_VMDK_ADAPTER_TYPE_IDE) { /* that's the number of heads with which vmware operates when creating, exporting, etc. vmdk files with a non-ide adapter typ= e */ number_heads =3D 255; } - if (!fmt) { - /* Default format to monolithicSparse */ - fmt =3D g_strdup("monolithicSparse"); - } else if (strcmp(fmt, "monolithicFlat") && - strcmp(fmt, "monolithicSparse") && - strcmp(fmt, "twoGbMaxExtentSparse") && - strcmp(fmt, "twoGbMaxExtentFlat") && - strcmp(fmt, "streamOptimized")) { - error_setg(errp, "Unknown subformat: '%s'", fmt); - ret =3D -EINVAL; - goto exit; - } - split =3D !(strcmp(fmt, "twoGbMaxExtentFlat") && - strcmp(fmt, "twoGbMaxExtentSparse")); - flat =3D !(strcmp(fmt, "monolithicFlat") && - strcmp(fmt, "twoGbMaxExtentFlat")); - compress =3D !strcmp(fmt, "streamOptimized"); + split =3D (subformat =3D=3D BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT= ) || + (subformat =3D=3D BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTSPARSE= ); + flat =3D (subformat =3D=3D BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICFLAT) || + (subformat =3D=3D BLOCKDEV_VMDK_SUBFORMAT_TWOGBMAXEXTENTFLAT); + compress =3D subformat =3D=3D BLOCKDEV_VMDK_SUBFORMAT_STREAMOPTIMIZED; + if (flat) { - desc_extent_line =3D "RW %" PRId64 " FLAT \"%s\" 0\n"; + extent_line_fmt =3D "RW %" PRId64 " FLAT \"%s\" 0\n"; } else { - desc_extent_line =3D "RW %" PRId64 " SPARSE \"%s\"\n"; + extent_line_fmt =3D "RW %" PRId64 " SPARSE \"%s\"\n"; } if (flat && backing_file) { error_setg(errp, "Flat image can't have backing file"); @@ -2031,10 +2044,34 @@ static int coroutine_fn vmdk_co_create_opts(const c= har *filename, QemuOpts *opts ret =3D -ENOTSUP; goto exit; } + + /* Create extents */ + if (split) { + extent_size =3D split_size; + } else { + extent_size =3D size; + } + if (!split && !flat) { + created_size =3D extent_size; + } else { + created_size =3D 0; + } + /* Get the descriptor file BDS */ + blk =3D extent_fn(created_size, 0, flat, split, compress, zeroed_grain, + opaque, errp); + if (!blk) { + ret =3D -EIO; + goto exit; + } + if (!split && !flat) { + vmdk_desc_add_extent(ext_desc_lines, extent_line_fmt, created_size, + blk_bs(blk)->filename); + } + if (backing_file) { - BlockBackend *blk; + BlockBackend *backing; char *full_backing =3D g_new0(char, PATH_MAX); - bdrv_get_full_backing_filename_from_filename(filename, backing_fil= e, + bdrv_get_full_backing_filename_from_filename(blk_bs(blk)->filename= , backing_file, full_backing, PATH_MA= X, &local_err); if (local_err) { @@ -2044,93 +2081,65 @@ static int coroutine_fn vmdk_co_create_opts(const c= har *filename, QemuOpts *opts goto exit; } =20 - blk =3D blk_new_open(full_backing, NULL, NULL, - BDRV_O_NO_BACKING, errp); + backing =3D blk_new_open(full_backing, NULL, NULL, + BDRV_O_NO_BACKING, errp); g_free(full_backing); - if (blk =3D=3D NULL) { + if (backing =3D=3D NULL) { ret =3D -EIO; goto exit; } - if (strcmp(blk_bs(blk)->drv->format_name, "vmdk")) { - blk_unref(blk); + if (strcmp(blk_bs(backing)->drv->format_name, "vmdk")) { + error_setg(errp, "Invalid backing file format: %s. Must be vmd= k", + blk_bs(backing)->drv->format_name); + blk_unref(backing); ret =3D -EINVAL; goto exit; } - ret =3D vmdk_read_cid(blk_bs(blk), 0, &parent_cid); - blk_unref(blk); + ret =3D vmdk_read_cid(blk_bs(backing), 0, &parent_cid); + blk_unref(backing); if (ret) { + error_setg(errp, "Failed to read parent CID"); goto exit; } snprintf(parent_desc_line, BUF_SIZE, "parentFileNameHint=3D\"%s\"", backing_file); } - - /* Create extents */ - filesize =3D total_size; - while (filesize > 0) { - int64_t size =3D filesize; - - if (split && size > split_size) { - size =3D split_size; - } - if (split) { - snprintf(desc_filename, PATH_MAX, "%s-%c%03d%s", - prefix, flat ? 'f' : 's', ++idx, postfix); - } else if (flat) { - snprintf(desc_filename, PATH_MAX, "%s-flat%s", prefix, postfix= ); - } else { - snprintf(desc_filename, PATH_MAX, "%s%s", prefix, postfix); - } - snprintf(ext_filename, PATH_MAX, "%s%s", path, desc_filename); - - if (vmdk_create_extent(ext_filename, size, - flat, compress, zeroed_grain, NULL, opts, e= rrp)) { + extent_idx =3D 1; + while (created_size < size) { + BlockBackend *extent_blk; + int64_t cur_size =3D MIN(size - created_size, extent_size); + extent_blk =3D extent_fn(cur_size, extent_idx, flat, split, compre= ss, + zeroed_grain, opaque, errp); + if (!extent_blk) { ret =3D -EINVAL; goto exit; } - filesize -=3D size; - - /* Format description line */ - snprintf(desc_line, BUF_SIZE, - desc_extent_line, size / BDRV_SECTOR_SIZE, desc_filena= me); - g_string_append(ext_desc_lines, desc_line); + vmdk_desc_add_extent(ext_desc_lines, extent_line_fmt, cur_size, + blk_bs(extent_blk)->filename); + created_size +=3D cur_size; + extent_idx++; + blk_unref(extent_blk); } /* generate descriptor file */ desc =3D g_strdup_printf(desc_template, g_random_int(), parent_cid, - fmt, + vmdk_subformat_str(subformat), parent_desc_line, ext_desc_lines->str, hw_version, - total_size / + size / (int64_t)(63 * number_heads * BDRV_SECTOR_S= IZE), number_heads, - adapter_type); + qapi_enum_lookup(&BlockdevVmdkAdapterType_looku= p, + adapter_type)); desc_len =3D strlen(desc); /* the descriptor offset =3D 0x200 */ if (!split && !flat) { desc_offset =3D 0x200; - } else { - ret =3D bdrv_create_file(filename, opts, &local_err); - if (ret < 0) { - error_propagate(errp, local_err); - goto exit; - } } =20 - new_blk =3D blk_new_open(filename, NULL, NULL, - BDRV_O_RDWR | BDRV_O_RESIZE | BDRV_O_PROTOCOL, - &local_err); - if (new_blk =3D=3D NULL) { - error_propagate(errp, local_err); - ret =3D -EIO; - goto exit; - } - - blk_set_allow_write_beyond_eof(new_blk, true); - - ret =3D blk_pwrite(new_blk, desc_offset, desc, desc_len, 0); + ret =3D blk_pwrite(blk, desc_offset, desc, desc_len, 0); if (ret < 0) { error_setg_errno(errp, -ret, "Could not write description"); goto exit; @@ -2138,12 +2147,148 @@ static int coroutine_fn vmdk_co_create_opts(const = char *filename, QemuOpts *opts /* bdrv_pwrite write padding zeros to align to sector, we don't need t= hat * for description file */ if (desc_offset =3D=3D 0) { - ret =3D blk_truncate(new_blk, desc_len, PREALLOC_MODE_OFF, errp); + ret =3D blk_truncate(blk, desc_len, PREALLOC_MODE_OFF, errp); } exit: - if (new_blk) { - blk_unref(new_blk); + if (blk) { + blk_unref(blk); } + g_free(desc); + g_free(parent_desc_line); + g_string_free(ext_desc_lines, true); + return ret; +} + +typedef struct { + char *path; + char *prefix; + char *postfix; + QemuOpts *opts; +} VMDKCreateOptsData; + +static BlockBackend *vmdk_co_create_opts_cb(int64_t size, int idx, + bool flat, bool split, bool co= mpress, + bool zeroed_grain, void *opaqu= e, + Error **errp) +{ + BlockBackend *blk =3D NULL; + BlockDriverState *bs =3D NULL; + VMDKCreateOptsData *data =3D opaque; + char *ext_filename =3D NULL; + char *rel_filename =3D NULL; + + if (idx =3D=3D 0) { + rel_filename =3D g_strdup_printf("%s%s", data->prefix, data->postf= ix); + } else if (split) { + rel_filename =3D g_strdup_printf("%s-%c%03d%s", + data->prefix, + flat ? 'f' : 's', idx, data->postfi= x); + } else { + assert(idx =3D=3D 1); + rel_filename =3D g_strdup_printf("%s-flat%s", data->prefix, data->= postfix); + } + + ext_filename =3D g_strdup_printf("%s%s", data->path, rel_filename); + g_free(rel_filename); + + if (vmdk_create_extent(ext_filename, size, + flat, compress, zeroed_grain, &blk, data->opts, + errp)) { + goto exit; + } + bdrv_unref(bs); +exit: + g_free(ext_filename); + return blk; +} + +static int coroutine_fn vmdk_co_create_opts(const char *filename, QemuOpts= *opts, + Error **errp) +{ + Error *local_err =3D NULL; + char *desc =3D NULL; + int64_t total_size =3D 0; + char *adapter_type =3D NULL; + BlockdevVmdkAdapterType adapter_type_enum; + char *backing_file =3D NULL; + char *hw_version =3D NULL; + char *fmt =3D NULL; + BlockdevVmdkSubformat subformat; + int ret =3D 0; + char *path =3D g_malloc0(PATH_MAX); + char *prefix =3D g_malloc0(PATH_MAX); + char *postfix =3D g_malloc0(PATH_MAX); + char *desc_line =3D g_malloc0(BUF_SIZE); + char *ext_filename =3D g_malloc0(PATH_MAX); + char *desc_filename =3D g_malloc0(PATH_MAX); + char *parent_desc_line =3D g_malloc0(BUF_SIZE); + bool zeroed_grain; + bool compat6; + int i; + VMDKCreateOptsData data; + + if (filename_decompose(filename, path, prefix, postfix, PATH_MAX, errp= )) { + ret =3D -EINVAL; + goto exit; + } + /* Read out options */ + total_size =3D ROUND_UP(qemu_opt_get_size_del(opts, BLOCK_OPT_SIZE, 0), + BDRV_SECTOR_SIZE); + adapter_type =3D qemu_opt_get_del(opts, BLOCK_OPT_ADAPTER_TYPE); + backing_file =3D qemu_opt_get_del(opts, BLOCK_OPT_BACKING_FILE); + hw_version =3D qemu_opt_get_del(opts, BLOCK_OPT_HWVERSION); + compat6 =3D qemu_opt_get_bool_del(opts, BLOCK_OPT_COMPAT6, false); + if (strcmp(hw_version, "undefined") =3D=3D 0) { + g_free(hw_version); + hw_version =3D g_strdup("4"); + } + fmt =3D qemu_opt_get_del(opts, BLOCK_OPT_SUBFMT); + zeroed_grain =3D qemu_opt_get_bool_del(opts, BLOCK_OPT_ZEROED_GRAIN, f= alse); + + if (adapter_type) { + for (i =3D 0; i < strlen(adapter_type); ++i) { + adapter_type[i] =3D qemu_tolower(adapter_type[i]); + } + adapter_type_enum =3D qapi_enum_parse_full(&BlockdevVmdkAdapterTyp= e_lookup, + adapter_type, + BLOCKDEV_VMDK_ADAPTER_TYP= E_IDE, + true, + &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto exit; + } + } else { + adapter_type_enum =3D BLOCKDEV_VMDK_ADAPTER_TYPE_IDE; + } + + if (!fmt) { + /* Default format to monolithicSparse */ + subformat =3D BLOCKDEV_VMDK_SUBFORMAT_MONOLITHICSPARSE; + } else { + subformat =3D qapi_enum_parse_full(&BlockdevVmdkSubformat_lookup, + fmt, + BLOCKDEV_VMDK_SUBFORMAT_MONOLITHI= CSPARSE, + true, + &local_err); + if (local_err) { + error_propagate(errp, local_err); + ret =3D -EINVAL; + goto exit; + } + } + data =3D (VMDKCreateOptsData){ + .prefix =3D prefix, + .postfix =3D postfix, + .path =3D path, + .opts =3D opts, + }; + ret =3D vmdk_co_do_create(total_size, subformat, adapter_type_enum, + backing_file, hw_version, compat6, zeroed_grai= n, + vmdk_co_create_opts_cb, &data, errp); + +exit: g_free(adapter_type); g_free(backing_file); g_free(hw_version); @@ -2156,7 +2301,84 @@ exit: g_free(ext_filename); g_free(desc_filename); g_free(parent_desc_line); - g_string_free(ext_desc_lines, true); + return ret; +} + +static BlockBackend *vmdk_co_create_cb(int64_t size, int idx, + bool flat, bool split, bool compres= s, + bool zeroed_grain, void *opaque, + Error **errp) +{ + int ret; + BlockDriverState *bs; + BlockBackend *blk; + BlockdevCreateOptionsVmdk *opts =3D opaque; + + if (idx =3D=3D 0) { + bs =3D bdrv_open_blockdev_ref(opts->file, errp); + } else { + int i; + BlockdevRefList *list =3D opts->extents; + for (i =3D 1; i < idx; i++) { + if (!list || !list->next) { + error_setg(errp, "Extent [%d] not specified", i); + return NULL; + } + list =3D list->next; + } + if (!list) { + error_setg(errp, "Extent [%d] not specified", idx - 1); + return NULL; + } + bs =3D bdrv_open_blockdev_ref(list->value, errp); + } + if (!bs) { + return NULL; + } + blk =3D blk_new(BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE | BLK_PERM_R= ESIZE, + BLK_PERM_ALL); + if (blk_insert_bs(blk, bs, errp)) { + bdrv_unref(bs); + return NULL; + } + blk_set_allow_write_beyond_eof(blk, true); + bdrv_unref(bs); + + ret =3D vmdk_init_extent(blk, size, flat, compress, zeroed_grain, errp= ); + if (ret) { + blk_unref(blk); + blk =3D NULL; + } + return blk; +} + +static int coroutine_fn vmdk_co_create(BlockdevCreateOptions *create_optio= ns, + Error **errp) +{ + int ret; + BlockdevCreateOptionsVmdk *opts; + + opts =3D &create_options->u.vmdk; + + /* Validate options */ + if (!QEMU_IS_ALIGNED(opts->size, BDRV_SECTOR_SIZE)) { + error_setg(errp, "Image size must be a multiple of 512 bytes"); + ret =3D -EINVAL; + goto out; + } + + ret =3D vmdk_co_do_create(opts->size, + opts->subformat, + opts->adapter_type, + opts->backing_file, + opts->hwversion, + false, + opts->zeroed_grain, + vmdk_co_create_cb, + opts, errp); + return ret; + +out: return ret; } =20 @@ -2424,6 +2646,7 @@ static BlockDriver bdrv_vmdk =3D { .bdrv_co_pwrite_zeroes =3D vmdk_co_pwrite_zeroes, .bdrv_close =3D vmdk_close, .bdrv_co_create_opts =3D vmdk_co_create_opts, + .bdrv_co_create =3D vmdk_co_create, .bdrv_co_flush_to_disk =3D vmdk_co_flush, .bdrv_co_block_status =3D vmdk_co_block_status, .bdrv_get_allocated_file_size =3D vmdk_get_allocated_file_size, diff --git a/qapi/block-core.json b/qapi/block-core.json index c50517bff3..df3903b54d 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -3855,6 +3855,71 @@ 'size': 'size', '*cluster-size' : 'size' } } =20 +## +# @BlockdevVmdkSubformat: +# +# Subformat options for VMDK images +# +# @monolithicsparse: Single file image with sparse cluster allocation +# @monolithicflat: Single flat data image and a descriptor file +# @twogbmaxextentsparse: Data is split into 2GB (per virtual LBA) sparse e= xtent +# files, in addition to a descriptor file +# @twogbmaxextentflat: Data is split into 2GB (per virtual LBA) flat extent +# files, in addition to a descriptor file +# @streamoptimized: Single file image sparse cluster allocation, optimized= for +# streaming over network. +# +# Since: 2.13 +## +{ 'enum': 'BlockdevVmdkSubformat', + 'data': [ 'monolithicsparse', 'monolithicflat', 'twogbmaxextentsparse', + 'twogbmaxextentflat', 'streamoptimized'] } + +## +# @BlockdevVmdkAdapterType: +# +# Adapter type info for VMDK images +# +# Since: 2.13 +## +{ 'enum': 'BlockdevVmdkAdapterType', + 'data': [ 'ide', 'buslogic', 'lsilogic', 'legacyesx'] } + +## +# @BlockdevCreateOptionsVmdk: +# +# Driver specific image creation options for VMDK. +# +# @file Where to store the new image file. This refers to the image +# file for monolithcSparse and streamOptimized format, or the +# descriptor file for other formats. +# @size Size of the virtual disk in bytes +# @extents Where to store the data extents. Required for monolithcfla= t, +# twoGbMaxExtentSparse and twoGbMaxExtentFlat formats. For +# monolithicflat, only one entry is required; for +# twoGbMaxExtent* formats, the number of entries required is +# calculated as extent_number =3D virtual_size / 2GB. +# @subformat The subformat of the VMDK image. Default: "monolithicspars= e". +# @backing-file The path of backing file. Default: no backing file is used. +# @adapter-type The adapter type used to fill in the descriptor. Default: = ide. +# @hwversion Hardware version. The meaningful options are "4" or "6". +# Defaulted to "4". +# @zeroed-grain Whether to enable zeroed-grain feature for sparse subforma= ts. +# Default: false. +# +# Since: 2.13 +## +{ 'struct': 'BlockdevCreateOptionsVmdk', + 'data': { 'file': 'BlockdevRef', + 'size': 'size', + '*extents': ['BlockdevRef'], + '*subformat': 'BlockdevVmdkSubformat', + '*backing-file': 'str', + '*adapter-type': 'BlockdevVmdkAdapterType', + '*hwversion': 'str', + '*zeroed-grain': 'bool' } } + + ## # @SheepdogRedundancyType: # @@ -4078,7 +4143,7 @@ 'throttle': 'BlockdevCreateNotSupported', 'vdi': 'BlockdevCreateOptionsVdi', 'vhdx': 'BlockdevCreateOptionsVhdx', - 'vmdk': 'BlockdevCreateNotSupported', + 'vmdk': 'BlockdevCreateOptionsVmdk', 'vpc': 'BlockdevCreateOptionsVpc', 'vvfat': 'BlockdevCreateNotSupported', 'vxhs': 'BlockdevCreateNotSupported' --=20 2.14.3 From nobody Wed Oct 29 20:29:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525845924706966.403406197109; Tue, 8 May 2018 23:05:24 -0700 (PDT) Received: from localhost ([::1]:54686 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGIE8-0002xG-0H for importer@patchew.org; Wed, 09 May 2018 02:05:24 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49650) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGI7a-0005vH-0K for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fGI7Z-0001Bv-5k for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:38 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:48344 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fGI7X-000185-3Q; Wed, 09 May 2018 01:58:35 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 9A03D406C74A; Wed, 9 May 2018 05:58:34 +0000 (UTC) Received: from lemon.usersys.redhat.com (ovpn-12-170.pek2.redhat.com [10.72.12.170]) by smtp.corp.redhat.com (Postfix) with ESMTP id 86A5010F1BF7; Wed, 9 May 2018 05:58:27 +0000 (UTC) From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 9 May 2018 13:58:01 +0800 Message-Id: <20180509055802.28423-5-famz@redhat.com> In-Reply-To: <20180509055802.28423-1-famz@redhat.com> References: <20180509055802.28423-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Wed, 09 May 2018 05:58:34 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.5]); Wed, 09 May 2018 05:58:34 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'famz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH 4/5] iotests: Filter cid numbers in VMDK extent info X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Michael Roth , qemu-block@nongnu.org, Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Fam Zheng --- tests/qemu-iotests/common.filter | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/qemu-iotests/common.filter b/tests/qemu-iotests/common.f= ilter index c5f4bcf578..0debefed18 100644 --- a/tests/qemu-iotests/common.filter +++ b/tests/qemu-iotests/common.filter @@ -164,6 +164,7 @@ _filter_img_info() -e "/table_size: [0-9]\\+/d" \ -e "/compat: '[^']*'/d" \ -e "/compat6: \\(on\\|off\\)/d" \ + -e "s/cid: [0-9]\+/cid: XXXXXXXXXX/" \ -e "/static: \\(on\\|off\\)/d" \ -e "/zeroed_grain: \\(on\\|off\\)/d" \ -e "/subformat: '[^']*'/d" \ --=20 2.14.3 From nobody Wed Oct 29 20:29:41 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=redhat.com Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1525845908820206.2144866369307; Tue, 8 May 2018 23:05:08 -0700 (PDT) Received: from localhost ([::1]:54685 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGIDr-0002ZM-SZ for importer@patchew.org; Wed, 09 May 2018 02:05:07 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49690) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fGI7j-00063M-Ed for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:49 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fGI7h-0001No-Eg for qemu-devel@nongnu.org; Wed, 09 May 2018 01:58:47 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:40258 helo=mx1.redhat.com) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fGI7b-0001ES-KW; Wed, 09 May 2018 01:58:39 -0400 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2078E818F6EC; Wed, 9 May 2018 05:58:39 +0000 (UTC) Received: from lemon.usersys.redhat.com (ovpn-12-170.pek2.redhat.com [10.72.12.170]) by smtp.corp.redhat.com (Postfix) with ESMTP id 5073310F1BF7; Wed, 9 May 2018 05:58:34 +0000 (UTC) From: Fam Zheng To: qemu-devel@nongnu.org Date: Wed, 9 May 2018 13:58:02 +0800 Message-Id: <20180509055802.28423-6-famz@redhat.com> In-Reply-To: <20180509055802.28423-1-famz@redhat.com> References: <20180509055802.28423-1-famz@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.3 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 09 May 2018 05:58:39 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 09 May 2018 05:58:39 +0000 (UTC) for IP:'10.11.54.3' DOMAIN:'int-mx03.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'famz@redhat.com' RCPT:'' X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 66.187.233.73 Subject: [Qemu-devel] [PATCH 5/5] iotests: Add VMDK tests for blockdev-create X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , Michael Roth , qemu-block@nongnu.org, Markus Armbruster , Max Reitz Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Fam Zheng --- tests/qemu-iotests/214 | 268 +++++++++++++++++++++++++++++++++++++++ tests/qemu-iotests/214.out | 304 +++++++++++++++++++++++++++++++++++++++++= ++++ tests/qemu-iotests/group | 1 + 3 files changed, 573 insertions(+) create mode 100755 tests/qemu-iotests/214 create mode 100644 tests/qemu-iotests/214.out diff --git a/tests/qemu-iotests/214 b/tests/qemu-iotests/214 new file mode 100755 index 0000000000..d089859b7f --- /dev/null +++ b/tests/qemu-iotests/214 @@ -0,0 +1,268 @@ +#!/bin/bash +# +# Test vmdk and file image creation +# +# Copyright (C) 2018 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +# creator +owner=3Dfamz@redhat.com + +seq=3D`basename $0` +echo "QA output created by $seq" + +here=3D`pwd` +status=3D1 # failure is the default! + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +_supported_fmt vmdk +_supported_proto file +_supported_os Linux + +function do_run_qemu() +{ + $QEMU -nographic -qmp stdio -serial none "$@" + echo +} + +function run_qemu() +{ + do_run_qemu "$@" 2>&1 | _filter_testdir | _filter_qmp \ + | _filter_qemu | _filter_imgfmt \ + | _filter_actual_image_size +} + +echo +echo "=3D=3D=3D Successful image creation (defaults) =3D=3D=3D" +echo + +size=3D$((5 * 1024 * 1024 * 1024)) + +run_qemu <