• I
    Implement sync modes for drive-backup. · fc5d3f84
    Ian Main 提交于
    This patch adds sync-modes to the drive-backup interface and
    implements the FULL, NONE and TOP modes of synchronization.
    
    FULL performs as before copying the entire contents of the drive
    while preserving the point-in-time using CoW.
    NONE only copies new writes to the target drive.
    TOP copies changes to the topmost drive image and preserves the
    point-in-time using CoW.
    
    For sync mode TOP are creating a new target image using the same backing
    file as the original disk image.  Then any new data that has been laid
    on top of it since creation is copied in the main backup_run() loop.
    There is an extra check in the 'TOP' case so that we don't bother to copy
    all the data of the backing file as it already exists in the target.
    This is where the bdrv_co_is_allocated() is used to determine if the
    data exists in the topmost layer or below.
    
    Also any new data being written is intercepted via the write_notifier
    hook which ends up calling backup_do_cow() to copy old data out before
    it gets overwritten.
    
    For mode 'NONE' we create the new target image and only copy in the
    original data from the disk image starting from the time the call was
    made.  This preserves the point in time data by only copying the parts
    that are *going to change* to the target image.  This way we can
    reconstruct the final image by checking to see if the given block exists
    in the new target image first, and if it does not, you can get it from
    the original image.  This is basically an optimization allowing you to
    do point-in-time snapshots with low overhead vs the 'FULL' version.
    
    Since there is no old data to copy out the loop in backup_run() for the
    NONE case just calls qemu_coroutine_yield() which only wakes up after
    an event (usually cancel in this case).  The rest is handled by the
    before_write notifier which again calls backup_do_cow() to write out
    the old data so it can be preserved.
    Signed-off-by: NIan Main <imain@redhat.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    fc5d3f84
blockdev.c 55.7 KB