Skip to content
  • Eric Blake's avatar
    14f16bf9
    qemu-img: Support bitmap --merge into backing image · 14f16bf9
    Eric Blake authored
    If you have the chain 'base.qcow2 <- top.qcow2' and want to merge a
    bitmap from top into base, qemu-img was failing with:
    
    qemu-img: Could not open 'top.qcow2': Could not open backing file: Failed to get shared "write" lock
    Is another process using the image [base.qcow2]?
    
    The easiest fix is to not open the entire backing chain of either
    image (source or destination); after all, the point of 'qemu-img
    bitmap' is solely to manipulate bitmaps directly within a single qcow2
    image, and this is made more precise if we don't pay attention to
    other images in the chain that may happen to have a bitmap by the same
    name.
    
    However, note that on a case-by-case analysis, there _are_ times where
    we treat it as a feature that we can access a bitmap from a backing
    layer in association with an overlay BDS.  A demonstration of this is
    using NBD to expose both an overlay BDS (for constant contents) and a
    bitmap (for learning which blocks are interesting) during an
    incremental backup:
    
    Base <- Active <- Temporary
              \--block job ->/
    
    where Temporary is being fed by a backup 'sync=none' job.  When
    exposing Temporary over NBD, referring to a bitmap that lives only in
    Active is less effort than having to copy a bitmap into Temporary [1].
    So the testsuite additions in this patch check both where bitmaps get
    allocated (the qemu-img info output), and that qemu-nbd is indeed able
    to access a bitmap inherited from the backing chain since it is a
    different use case than 'qemu-img bitmap'.
    
    [1] Full disclosure: prior to the recent commit 374eedd1 and
    friends, we were NOT able to see bitmaps through filters, which meant
    that we actually did not have nice clean semantics for uniformly being
    able to pick up bitmaps from anywhere in the backing chain (seen as a
    change in behavior between qemu 4.1 and 4.2 at commit 00e30f05, when
    block-copy swapped from a one-off to a filter).  Which means libvirt
    was already coded to copy bitmaps around for the sake of older qemu,
    even though modern qemu no longer needs it.  Oh well.
    
    Fixes: http://bugzilla.redhat.com/1877209
    
    
    Reported-by: default avatarEyal Shenitzky <eshenitz@redhat.com>
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Message-Id: <20200914191009.644842-1-eblake@redhat.com>
    [eblake: more commit message tweaks, per Max Reitz review]
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
    14f16bf9
    qemu-img: Support bitmap --merge into backing image
    Eric Blake authored
    If you have the chain 'base.qcow2 <- top.qcow2' and want to merge a
    bitmap from top into base, qemu-img was failing with:
    
    qemu-img: Could not open 'top.qcow2': Could not open backing file: Failed to get shared "write" lock
    Is another process using the image [base.qcow2]?
    
    The easiest fix is to not open the entire backing chain of either
    image (source or destination); after all, the point of 'qemu-img
    bitmap' is solely to manipulate bitmaps directly within a single qcow2
    image, and this is made more precise if we don't pay attention to
    other images in the chain that may happen to have a bitmap by the same
    name.
    
    However, note that on a case-by-case analysis, there _are_ times where
    we treat it as a feature that we can access a bitmap from a backing
    layer in association with an overlay BDS.  A demonstration of this is
    using NBD to expose both an overlay BDS (for constant contents) and a
    bitmap (for learning which blocks are interesting) during an
    incremental backup:
    
    Base <- Active <- Temporary
              \--block job ->/
    
    where Temporary is being fed by a backup 'sync=none' job.  When
    exposing Temporary over NBD, referring to a bitmap that lives only in
    Active is less effort than having to copy a bitmap into Temporary [1].
    So the testsuite additions in this patch check both where bitmaps get
    allocated (the qemu-img info output), and that qemu-nbd is indeed able
    to access a bitmap inherited from the backing chain since it is a
    different use case than 'qemu-img bitmap'.
    
    [1] Full disclosure: prior to the recent commit 374eedd1 and
    friends, we were NOT able to see bitmaps through filters, which meant
    that we actually did not have nice clean semantics for uniformly being
    able to pick up bitmaps from anywhere in the backing chain (seen as a
    change in behavior between qemu 4.1 and 4.2 at commit 00e30f05, when
    block-copy swapped from a one-off to a filter).  Which means libvirt
    was already coded to copy bitmaps around for the sake of older qemu,
    even though modern qemu no longer needs it.  Oh well.
    
    Fixes: http://bugzilla.redhat.com/1877209
    
    
    Reported-by: default avatarEyal Shenitzky <eshenitz@redhat.com>
    Signed-off-by: default avatarEric Blake <eblake@redhat.com>
    Message-Id: <20200914191009.644842-1-eblake@redhat.com>
    [eblake: more commit message tweaks, per Max Reitz review]
    Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
    Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Loading