Re: [Qemu-devel] [PATCH 2/2] block: resize backing image during active layer commit, if needed

2014-01-17 Thread Jeff Cody
On Wed, Jan 15, 2014 at 01:58:29PM +0800, Fam Zheng wrote:
 On Mon, 01/13 15:18, Jeff Cody wrote:
  If the top image to commit is the active layer, and also larger than
  the base image, then an I/O error will likely be returned during
  block-commit.
  
  For instance, if we have a base image with a virtual size 10G, and a
  active layer image of size 20G, then committing the snapshot via
  'block-commit' will likely fail.
  
  This will automatically attempt to resize the base image, if the
  active layer image to be committed is larger.
  
  Signed-off-by: Jeff Cody jc...@redhat.com
  ---
   block/mirror.c | 13 +
   1 file changed, 13 insertions(+)
  
  diff --git a/block/mirror.c b/block/mirror.c
  index 2932bab..c4e42fa 100644
  --- a/block/mirror.c
  +++ b/block/mirror.c
  @@ -630,9 +630,22 @@ void commit_active_start(BlockDriverState *bs, 
  BlockDriverState *base,
BlockDriverCompletionFunc *cb,
void *opaque, Error **errp)
   {
  +int64_t length;
   if (bdrv_reopen(base, bs-open_flags, errp)) {
   return;
   }
 
 base is already reopened here.
 
  +
  +length = bdrv_getlength(bs);
  +
  +if (length  bdrv_getlength(base)) {
  +if (bdrv_truncate(base, length)  0) {
  +error_setg(errp, Top image %s is larger than base image %s, 
  and 
  + resize of base image failed.,
  + bs-filename, base-filename);
  +return;
 
 Should we restore open flags for base?


Good catch.  Yes, I think we should; and I think we should also do it
after the call to mirror_start_job, if errp is set.  I'll add that in
for v2.

  +}
  +}
  +
   bdrv_ref(base);
   mirror_start_job(bs, base, speed, 0, 0,
on_error, on_error, cb, opaque, errp,
  -- 
  1.8.3.1
  



Re: [Qemu-devel] [PATCH 2/2] block: resize backing image during active layer commit, if needed

2014-01-14 Thread Fam Zheng
On Mon, 01/13 15:18, Jeff Cody wrote:
 If the top image to commit is the active layer, and also larger than
 the base image, then an I/O error will likely be returned during
 block-commit.
 
 For instance, if we have a base image with a virtual size 10G, and a
 active layer image of size 20G, then committing the snapshot via
 'block-commit' will likely fail.
 
 This will automatically attempt to resize the base image, if the
 active layer image to be committed is larger.
 
 Signed-off-by: Jeff Cody jc...@redhat.com
 ---
  block/mirror.c | 13 +
  1 file changed, 13 insertions(+)
 
 diff --git a/block/mirror.c b/block/mirror.c
 index 2932bab..c4e42fa 100644
 --- a/block/mirror.c
 +++ b/block/mirror.c
 @@ -630,9 +630,22 @@ void commit_active_start(BlockDriverState *bs, 
 BlockDriverState *base,
   BlockDriverCompletionFunc *cb,
   void *opaque, Error **errp)
  {
 +int64_t length;
  if (bdrv_reopen(base, bs-open_flags, errp)) {
  return;
  }

base is already reopened here.

 +
 +length = bdrv_getlength(bs);
 +
 +if (length  bdrv_getlength(base)) {
 +if (bdrv_truncate(base, length)  0) {
 +error_setg(errp, Top image %s is larger than base image %s, and 
 
 + resize of base image failed.,
 + bs-filename, base-filename);
 +return;

Should we restore open flags for base?

Thanks,
Fam

 +}
 +}
 +
  bdrv_ref(base);
  mirror_start_job(bs, base, speed, 0, 0,
   on_error, on_error, cb, opaque, errp,
 -- 
 1.8.3.1