Re: [Qemu-devel] [PATCH 2/3] Update the blkmirror block driver

2012-02-23 Thread Federico Simoncelli
- Original Message -
 From: Paolo Bonzini pbonz...@redhat.com
 To: Federico Simoncelli fsimo...@redhat.com
 Cc: qemu-devel@nongnu.org, kw...@redhat.com, mtosa...@redhat.com
 Sent: Thursday, February 23, 2012 8:18:28 AM
 Subject: Re: [PATCH 2/3] Update the blkmirror block driver
 
 On 02/22/2012 06:13 PM, Federico Simoncelli wrote:
  @@ -46,7 +46,7 @@ static int blkmirror_open(BlockDriverState *bs,
  const char *filename, int flags)
   filename += strlen(blkmirror:);
   
   /* Parse the raw image filename */
  -filename2 = qemu_malloc(strlen(filename)+1);
  +filename2 = qemu_vmalloc(strlen(filename)+1);
   escape = 0;
   for (i = n = 0; i  strlen(filename); i++) {
   if (!escape  filename[i] == ':') {
  @@ -66,11 +66,11 @@ static int blkmirror_open(BlockDriverState *bs,
  const char *filename, int flags)
   
   m-bs[0] = bdrv_new();
   if (m-bs[0] == NULL) {
  -free(filename2);
  +qemu_vfree(filename2);
   return -ENOMEM;
   }
   ret = bdrv_open(m-bs[0], filename2, flags, NULL);
  -free(filename2);
  +qemu_vfree(filename2);
   if (ret  0) {
   return ret;
   }
 
 These should be g_malloc and g_free.

Thanks!

 Also, please squash this patch in part 1.

Yes, I sent it as a separate patch to make it easier to review my
changes (if someone already reviewed Marcelo's patch).
Any comment on the BDRV_O_NO_BACKING flag I added? That's the real
trick I'm pulling here. It basically allows to open the second image
only for writing and it doesn't complain if the backing file is not
there yet (it will be copied during step 4).

-- 
Federico



Re: [Qemu-devel] [PATCH 2/3] Update the blkmirror block driver

2012-02-23 Thread Paolo Bonzini
On 02/23/2012 10:44 AM, Federico Simoncelli wrote:
 Any comment on the BDRV_O_NO_BACKING flag I added? That's the real
 trick I'm pulling here. It basically allows to open the second image
 only for writing and it doesn't complain if the backing file is not
 there yet (it will be copied during step 4).

Yes, it makes sense to me.

Paolo



[Qemu-devel] [PATCH 2/3] Update the blkmirror block driver

2012-02-22 Thread Federico Simoncelli
Signed-off-by: Federico Simoncelli fsimo...@redhat.com
---
 block/blkmirror.c |   26 +-
 1 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/block/blkmirror.c b/block/blkmirror.c
index 1c02710..1cfd2fb 100644
--- a/block/blkmirror.c
+++ b/block/blkmirror.c
@@ -46,7 +46,7 @@ static int blkmirror_open(BlockDriverState *bs, const char 
*filename, int flags)
 filename += strlen(blkmirror:);
 
 /* Parse the raw image filename */
-filename2 = qemu_malloc(strlen(filename)+1);
+filename2 = qemu_vmalloc(strlen(filename)+1);
 escape = 0;
 for (i = n = 0; i  strlen(filename); i++) {
 if (!escape  filename[i] == ':') {
@@ -66,11 +66,11 @@ static int blkmirror_open(BlockDriverState *bs, const char 
*filename, int flags)
 
 m-bs[0] = bdrv_new();
 if (m-bs[0] == NULL) {
-free(filename2);
+qemu_vfree(filename2);
 return -ENOMEM;
 }
 ret = bdrv_open(m-bs[0], filename2, flags, NULL);
-free(filename2);
+qemu_vfree(filename2);
 if (ret  0) {
 return ret;
 }
@@ -81,7 +81,7 @@ static int blkmirror_open(BlockDriverState *bs, const char 
*filename, int flags)
 bdrv_delete(m-bs[0]);
 return -ENOMEM;
 }
-ret = bdrv_open(m-bs[1], filename, flags, NULL);
+ret = bdrv_open(m-bs[1], filename, flags | BDRV_O_NO_BACKING, NULL);
 if (ret  0) {
 bdrv_delete(m-bs[0]);
 return ret;
@@ -101,17 +101,17 @@ static void blkmirror_close(BlockDriverState *bs)
 }
 }
 
-static int blkmirror_flush(BlockDriverState *bs)
+static coroutine_fn int blkmirror_co_flush(BlockDriverState *bs)
 {
 BdrvMirrorState *m = bs-opaque;
 int ret;
 
-ret = bdrv_flush(m-bs[0]);
+ret = bdrv_co_flush(m-bs[0]);
 if (ret  0) {
 return ret;
 }
 
-return bdrv_flush(m-bs[1]);
+return bdrv_co_flush(m-bs[1]);
 }
 
 static int64_t blkmirror_getlength(BlockDriverState *bs)
@@ -242,18 +242,18 @@ static BlockDriverAIOCB 
*blkmirror_aio_flush(BlockDriverState *bs,
 return dcb-common;
 }
 
-static int blkmirror_discard(BlockDriverState *bs, int64_t sector_num,
- int nb_sectors)
+static coroutine_fn int blkmirror_co_discard(BlockDriverState *bs,
+ int64_t sector_num, int nb_sectors)
 {
 BdrvMirrorState *m = bs-opaque;
 int ret;
 
-ret = bdrv_discard(m-bs[0], sector_num, nb_sectors);
+ret = bdrv_co_discard(m-bs[0], sector_num, nb_sectors);
 if (ret  0) {
 return ret;
 }
 
-return bdrv_discard(m-bs[1], sector_num, nb_sectors);
+return bdrv_co_discard(m-bs[1], sector_num, nb_sectors);
 }
 
 
@@ -266,8 +266,8 @@ static BlockDriver bdrv_blkmirror = {
 
 .bdrv_file_open = blkmirror_open,
 .bdrv_close = blkmirror_close,
-.bdrv_flush = blkmirror_flush,
-.bdrv_discard   = blkmirror_discard,
+.bdrv_co_flush_to_disk = blkmirror_co_flush,
+.bdrv_co_discard= blkmirror_co_discard,
 
 .bdrv_aio_readv = blkmirror_aio_readv,
 .bdrv_aio_writev= blkmirror_aio_writev,
-- 
1.7.1




Re: [Qemu-devel] [PATCH 2/3] Update the blkmirror block driver

2012-02-22 Thread Paolo Bonzini
On 02/22/2012 06:13 PM, Federico Simoncelli wrote:
 @@ -46,7 +46,7 @@ static int blkmirror_open(BlockDriverState *bs, const char 
 *filename, int flags)
  filename += strlen(blkmirror:);
  
  /* Parse the raw image filename */
 -filename2 = qemu_malloc(strlen(filename)+1);
 +filename2 = qemu_vmalloc(strlen(filename)+1);
  escape = 0;
  for (i = n = 0; i  strlen(filename); i++) {
  if (!escape  filename[i] == ':') {
 @@ -66,11 +66,11 @@ static int blkmirror_open(BlockDriverState *bs, const 
 char *filename, int flags)
  
  m-bs[0] = bdrv_new();
  if (m-bs[0] == NULL) {
 -free(filename2);
 +qemu_vfree(filename2);
  return -ENOMEM;
  }
  ret = bdrv_open(m-bs[0], filename2, flags, NULL);
 -free(filename2);
 +qemu_vfree(filename2);
  if (ret  0) {
  return ret;
  }

These should be g_malloc and g_free.

Also, please squash this patch in part 1.

Paolo