From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Lmb4Z-00048L-8h for qemu-devel@nongnu.org; Wed, 25 Mar 2009 17:55:43 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1Lmb4U-00046G-D7 for qemu-devel@nongnu.org; Wed, 25 Mar 2009 17:55:42 -0400 Received: from [199.232.76.173] (port=59994 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Lmb4U-000469-9g for qemu-devel@nongnu.org; Wed, 25 Mar 2009 17:55:38 -0400 Received: from mx2.redhat.com ([66.187.237.31]:47011) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1Lmb4T-0004P4-MA for qemu-devel@nongnu.org; Wed, 25 Mar 2009 17:55:37 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n2PLtbHi019888 for ; Wed, 25 Mar 2009 17:55:37 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n2PLtUAk019295 for ; Wed, 25 Mar 2009 17:55:31 -0400 Received: from localhost.localdomain (cleopatra.tlv.redhat.com [10.35.255.11]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n2PLtXoQ031473 for ; Wed, 25 Mar 2009 17:55:36 -0400 From: Uri Lublin Date: Wed, 25 Mar 2009 23:55:10 +0200 Message-Id: <1238018112-7569-3-git-send-email-uril@redhat.com> In-Reply-To: <1238018112-7569-2-git-send-email-uril@redhat.com> References: <1238018112-7569-1-git-send-email-uril@redhat.com> <1238018112-7569-2-git-send-email-uril@redhat.com> Subject: [Qemu-devel] [PATCH 2/4] block: support known backing format for image create and open Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Added a backing_format field to BlockDriverState. Added bdrv_create2 and drv->bdrv_create2 to create an image with a known backing file format. Upon bdrv_open2 if backing format is known use it, instead of probing the (backing) image. Signed-off-by: Uri Lublin --- block.c | 28 ++++++++++++++++++++++++---- block.h | 4 ++++ block_int.h | 7 +++++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/block.c b/block.c index fd09dff..0078dad 100644 --- a/block.c +++ b/block.c @@ -181,6 +181,20 @@ BlockDriver *bdrv_find_format(const char *format_name) return NULL; } +int bdrv_create2(BlockDriver *drv, + const char *filename, int64_t size_in_sectors, + const char *backing_file, const char *backing_format, + int flags) +{ + if (drv->bdrv_create2) + return drv->bdrv_create2(filename, size_in_sectors, backing_file, + backing_format, flags); + if (drv->bdrv_create) + return drv->bdrv_create(filename, size_in_sectors, backing_file, + flags); + return -ENOTSUP; +} + int bdrv_create(BlockDriver *drv, const char *filename, int64_t size_in_sectors, const char *backing_file, int flags) @@ -357,7 +371,7 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, /* if there is a backing file, use it */ bs1 = bdrv_new(""); - ret = bdrv_open(bs1, filename, 0); + ret = bdrv_open2(bs1, filename, 0, drv); if (ret < 0) { bdrv_delete(bs1); return ret; @@ -378,12 +392,14 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, else realpath(filename, backing_filename); - ret = bdrv_create(&bdrv_qcow2, tmp_filename, - total_size, backing_filename, 0); + ret = bdrv_create2(&bdrv_qcow2, tmp_filename, + total_size, backing_filename, + (drv ? drv->format_name : NULL), 0); if (ret < 0) { return ret; } filename = tmp_filename; + drv = &bdrv_qcow2; bs->is_temporary = 1; } @@ -429,10 +445,14 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, #endif if (bs->backing_file[0] != '\0') { /* if there is a backing file, use it */ + BlockDriver *back_drv = NULL; bs->backing_hd = bdrv_new(""); path_combine(backing_filename, sizeof(backing_filename), filename, bs->backing_file); - ret = bdrv_open(bs->backing_hd, backing_filename, open_flags); + if (bs->backing_format[0] != '\0') + back_drv = bdrv_find_format(bs->backing_format); + ret = bdrv_open2(bs->backing_hd, backing_filename, open_flags, + back_drv); if (ret < 0) { bdrv_close(bs); return ret; diff --git a/block.h b/block.h index b0c63ac..fab01e6 100644 --- a/block.h +++ b/block.h @@ -62,6 +62,10 @@ BlockDriver *bdrv_find_format(const char *format_name); int bdrv_create(BlockDriver *drv, const char *filename, int64_t size_in_sectors, const char *backing_file, int flags); +int bdrv_create2(BlockDriver *drv, + const char *filename, int64_t size_in_sectors, + const char *backing_file, const char *backing_format, + int flags); BlockDriverState *bdrv_new(const char *device_name); void bdrv_delete(BlockDriverState *bs); int bdrv_file_open(BlockDriverState **pbs, const char *filename, int flags); diff --git a/block_int.h b/block_int.h index 8b4c5fe..9f94c4c 100644 --- a/block_int.h +++ b/block_int.h @@ -98,6 +98,12 @@ struct BlockDriver { void *opaque); AIOPool aio_pool; + + /* new create with backing file format */ + int (*bdrv_create2)(const char *filename, int64_t total_sectors, + const char *backing_file, const char *backing_format, + int flags); + struct BlockDriver *next; }; @@ -120,6 +126,7 @@ struct BlockDriverState { char filename[1024]; char backing_file[1024]; /* if non zero, the image is a diff of this file image */ + char backing_format[16]; /* if non-zero and backing_file exists */ int is_temporary; int media_changed; -- 1.6.0.6