Skip to content
  • Alberto Garcia's avatar
    block: Update BlockDriverState.inherits_from on bdrv_drop_intermediate() · 6bd858b3
    Alberto Garcia authored
    
    
    The previous patch fixed the inherits_from pointer after block-stream,
    and this one does the same for block-commit.
    
    When block-commit finishes and the 'top' node is not the topmost one
    from the backing chain then all nodes above 'base' up to and including
    'top' are removed from the chain.
    
    The bdrv_drop_intermediate() call converts a chain like this one:
    
        base <- intermediate <- top <- active
    
    into this one:
    
        base <- active
    
    In a simple scenario each backing file from the first chain has the
    inherits_from attribute pointing to its parent. This means that
    reopening 'active' will recursively reopen all its children, whose
    options can be changed in the process.
    
    However after the 'block-commit' call base.inherits_from is NULL and
    the chain is broken, so 'base' does not inherit from 'active' and will
    not be reopened automatically:
    
       $ qemu-img create -f qcow2 hd0.qcow2 1M
       $ qemu-img create -f qcow2 -b hd0.qcow2 hd1.qcow2
       $ qemu-img create -f qcow2 -b hd1.qcow2 hd2.qcow2
       $ $QEMU -drive if=none,file=hd2.qcow2
    
       { 'execute': 'block-commit',
         'arguments': {
           'device': 'none0',
           'top': 'hd1.qcow2' } }
    
       { 'execute': 'human-monitor-command',
         'arguments': {
            'command-line':
              'qemu-io none0 "reopen -o backing.l2-cache-size=2M"' } }
    
       { "return": "Cannot change the option 'backing.l2-cache-size'\r\n"}
    
    This patch updates base.inherits_from in this scenario, and adds a
    test case.
    
    Signed-off-by: default avatarAlberto Garcia <berto@igalia.com>
    Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
    6bd858b3