diff mbox

[2/5] block: add bdrv_open_conversion_target

Message ID 1309840884-32409-2-git-send-email-devin122@gmail.com
State New
Headers show

Commit Message

Devin Nakamura July 5, 2011, 4:41 a.m. UTC
Signed-off-by: Devin Nakamura <devin122@gmail.com>
---
 block.c |   19 +++++++++++++++++++
 block.h |    2 ++
 2 files changed, 21 insertions(+), 0 deletions(-)

Comments

Kevin Wolf July 5, 2011, 4:17 p.m. UTC | #1
Am 05.07.2011 06:41, schrieb Devin Nakamura:
> Signed-off-by: Devin Nakamura <devin122@gmail.com>
> ---
>  block.c |   19 +++++++++++++++++++
>  block.h |    2 ++
>  2 files changed, 21 insertions(+), 0 deletions(-)
> 
> diff --git a/block.c b/block.c
> index 24a25d5..e7699a6 100644
> --- a/block.c
> +++ b/block.c
> @@ -3018,3 +3018,22 @@ out:
>  
>      return ret;
>  }
> +
> +
> +int bdrv_open_conversion_target(BlockDriverState **bs,
> +        char *filename, char *target_fmt, QEMUOptionParameter *options)
> +{
> +    BlockDriver *drv;
> +
> +    drv = bdrv_find_format(target_fmt);
> +    if(!drv){

I'll comment on it here, but you need to fix the coding style in the
whole series. You may want to try scripts/checkpatch.pl.

> +        return -ENOENT;
> +    }
> +
> +    if(!drv->bdrv_open_conversion_target){
> +        return -ENOTSUP;
> +    }
> +    *bs = bdrv_new("");
> +    (*bs)->opaque = qemu_malloc(drv->instance_size);
> +    return drv->bdrv_open_conversion_target(*bs, filename, options);

Is this actually enough? The normal bdrv_open() sets much more fields of
the BlockDriverState, and I would expect that the block drivers rely on
at least some of them.

Kevin
Stefan Hajnoczi July 5, 2011, 6:18 p.m. UTC | #2
On Tue, Jul 05, 2011 at 12:41:21AM -0400, Devin Nakamura wrote:
> +int bdrv_open_conversion_target(BlockDriverState **bs,
> +        char *filename, char *target_fmt, QEMUOptionParameter *options)
> +{
> +    BlockDriver *drv;
> +
> +    drv = bdrv_find_format(target_fmt);
> +    if(!drv){

Please run scripts/checkpatch.pl before submitting patches.  It will
report coding style issues.

> +        return -ENOENT;
> +    }
> +
> +    if(!drv->bdrv_open_conversion_target){
> +        return -ENOTSUP;
> +    }
> +    *bs = bdrv_new("");
> +    (*bs)->opaque = qemu_malloc(drv->instance_size);

Please use qemu_mallocz() like bdrv_open_common() does.  This is safer
in case a block driver relies on the memory being zeroed (which is a
useful property).

> +    return drv->bdrv_open_conversion_target(*bs, filename, options);

Have you considered using bdrv_open_common() with a flag to avoid
duplicating bs initialization code?  You have not dealt with several
fields that bdrv_open_common() initializes.

Stefan
diff mbox

Patch

diff --git a/block.c b/block.c
index 24a25d5..e7699a6 100644
--- a/block.c
+++ b/block.c
@@ -3018,3 +3018,22 @@  out:
 
     return ret;
 }
+
+
+int bdrv_open_conversion_target(BlockDriverState **bs,
+        char *filename, char *target_fmt, QEMUOptionParameter *options)
+{
+    BlockDriver *drv;
+
+    drv = bdrv_find_format(target_fmt);
+    if(!drv){
+        return -ENOENT;
+    }
+
+    if(!drv->bdrv_open_conversion_target){
+        return -ENOTSUP;
+    }
+    *bs = bdrv_new("");
+    (*bs)->opaque = qemu_malloc(drv->instance_size);
+    return drv->bdrv_open_conversion_target(*bs, filename, options);
+}
diff --git a/block.h b/block.h
index 859d1d9..da87afb 100644
--- a/block.h
+++ b/block.h
@@ -250,6 +250,8 @@  int64_t bdrv_get_dirty_count(BlockDriverState *bs);
 void bdrv_set_in_use(BlockDriverState *bs, int in_use);
 int bdrv_in_use(BlockDriverState *bs);
 
+int bdrv_open_conversion_target(BlockDriverState **bs, char *filename,
+                                char *target_fmt, QEMUOptionParameter *options);
 typedef enum {
     BLKDBG_L1_UPDATE,