From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LnckU-0007TE-Qf for qemu-devel@nongnu.org; Sat, 28 Mar 2009 13:55:14 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LnckU-0007Sm-5T for qemu-devel@nongnu.org; Sat, 28 Mar 2009 13:55:14 -0400 Received: from [199.232.76.173] (port=39378 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LnckT-0007SU-TD for qemu-devel@nongnu.org; Sat, 28 Mar 2009 13:55:13 -0400 Received: from savannah.gnu.org ([199.232.41.3]:34362 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LnckS-0001g6-CL for qemu-devel@nongnu.org; Sat, 28 Mar 2009 13:55:12 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1LnckR-00019j-OL for qemu-devel@nongnu.org; Sat, 28 Mar 2009 17:55:11 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.69) (envelope-from ) id 1LnckR-00019a-Bl for qemu-devel@nongnu.org; Sat, 28 Mar 2009 17:55:11 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Sat, 28 Mar 2009 17:55:11 +0000 Subject: [Qemu-devel] [6908] block: support known backing format for image create and open ( Uri Lublin) 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 Revision: 6908 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6908 Author: aliguori Date: 2009-03-28 17:55:10 +0000 (Sat, 28 Mar 2009) Log Message: ----------- block: support known backing format for image create and open (Uri Lublin) 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 Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/block.c trunk/block.h trunk/block_int.h Modified: trunk/block.c =================================================================== --- trunk/block.c 2009-03-28 17:55:06 UTC (rev 6907) +++ trunk/block.c 2009-03-28 17:55:10 UTC (rev 6908) @@ -181,6 +181,20 @@ 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 @@ /* 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 @@ 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 @@ #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; Modified: trunk/block.h =================================================================== --- trunk/block.h 2009-03-28 17:55:06 UTC (rev 6907) +++ trunk/block.h 2009-03-28 17:55:10 UTC (rev 6908) @@ -62,6 +62,10 @@ 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); Modified: trunk/block_int.h =================================================================== --- trunk/block_int.h 2009-03-28 17:55:06 UTC (rev 6907) +++ trunk/block_int.h 2009-03-28 17:55:10 UTC (rev 6908) @@ -91,6 +91,12 @@ BlockDriverCompletionFunc *cb, 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; }; @@ -113,6 +119,7 @@ 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;