From 8ac4e41e7503b77e3fe12f0123915c0d11bc020a Mon Sep 17 00:00:00 2001 From: Uri Lublin <uril@redhat.com> Date: Mon, 30 Mar 2009 23:15:49 +0300 Subject: [PATCH 08/12] 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 <uril@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com> Bugzilla: 489964 RH-Upstream-status: applied(qemu/trunk) Acked-by: Eduardo Habkost <ehabkost@redhat.com> Acked-by: john cooper <john.cooper@redhat.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6908 c046a42c-6fe2-441c-8c8c-71466251a162 --- qemu/block.c | 31 +++++++++++++++++++++++++++---- qemu/block.h | 4 ++++ qemu/block_int.h | 7 +++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/qemu/block.c b/qemu/block.c index a4b3b2c..106270c 100644 --- a/qemu/block.c +++ b/qemu/block.c @@ -229,6 +229,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) @@ -412,7 +426,8 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, if (!bs1) { return -ENOMEM; } - if (bdrv_open(bs1, filename, 0) < 0) { + ret = bdrv_open2(bs1, filename, 0, drv); + if (ret < 0) { bdrv_delete(bs1); return -1; } @@ -432,11 +447,14 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, else realpath(filename, backing_filename); - if (bdrv_create(&bdrv_qcow2, tmp_filename, - total_size, backing_filename, 0) < 0) { + ret = bdrv_create2(&bdrv_qcow2, tmp_filename, + total_size, backing_filename, + (drv ? drv->format_name : NULL), 0); + if (ret < 0) { return -1; } filename = tmp_filename; + drv = &bdrv_qcow2; bs->is_temporary = 1; } @@ -484,6 +502,7 @@ 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(""); if (!bs->backing_hd) { fail: @@ -492,7 +511,11 @@ int bdrv_open2(BlockDriverState *bs, const char *filename, int flags, } path_combine(backing_filename, sizeof(backing_filename), filename, bs->backing_file); - if (bdrv_open(bs->backing_hd, backing_filename, open_flags) < 0) + 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) goto fail; } diff --git a/qemu/block.h b/qemu/block.h index 5c09113..d74f388 100644 --- a/qemu/block.h +++ b/qemu/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/qemu/block_int.h b/qemu/block_int.h index 139397e..a4629ef 100644 --- a/qemu/block_int.h +++ b/qemu/block_int.h @@ -86,6 +86,12 @@ struct BlockDriver { int (*bdrv_ioctl)(BlockDriverState *bs, unsigned long int req, void *buf); BlockDriverAIOCB *free_aiocb; + + /* 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; }; @@ -108,6 +114,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.1