• K
    mirror: Drop permissions on s->target on completion · 63c8ef28
    Kevin Wolf 提交于
    This fixes an assertion failure that was triggered by qemu-iotests 129
    on some CI host, while the same test case didn't seem to fail on other
    hosts.
    
    Essentially the problem is that the blk_unref(s->target) in
    mirror_exit() doesn't necessarily mean that the BlockBackend goes away
    immediately. It is possible that the job completion was triggered nested
    in mirror_drain(), which looks like this:
    
        BlockBackend *target = s->target;
        blk_ref(target);
        blk_drain(target);
        blk_unref(target);
    
    In this case, the write permissions for s->target are retained until
    after blk_drain(), which makes removing mirror_top_bs fail for the
    active commit case (can't have a writable backing file in the chain
    without the filter driver).
    
    Explicitly dropping the permissions first means that the additional
    reference doesn't hurt and the job can complete successfully even if
    called from the nested blk_drain().
    
    Cc: qemu-stable@nongnu.org
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    Acked-by: NPaolo Bonzini <pbonzini@redhat.com>
    Reviewed-by: NMax Reitz <mreitz@redhat.com>
    63c8ef28
mirror.c 44.9 KB