1. 01 9月, 2013 1 次提交
  2. 23 8月, 2013 1 次提交
  3. 27 7月, 2013 1 次提交
    • 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
  4. 28 6月, 2013 1 次提交
    • D
      block: add basic backup support to block driver · 98d2c6f2
      Dietmar Maurer 提交于
      backup_start() creates a block job that copies a point-in-time snapshot
      of a block device to a target block device.
      
      We call backup_do_cow() for each write during backup. That function
      reads the original data from the block device before it gets
      overwritten.  The data is then written to the target device.
      
      Currently backup cluster size is hardcoded to 65536 bytes.
      
      [I made a number of changes to Dietmar's original patch and folded them
      in to make code review easy.  Here is the full list:
      
       * Drop BackupDumpFunc interface in favor of a target block device
       * Detect zero clusters with buffer_is_zero() and use bdrv_co_write_zeroes()
       * Use 0 delay instead of 1us, like other block jobs
       * Unify creation/start functions into backup_start()
       * Simplify cleanup, free bitmap in backup_run() instead of cb
       * function
       * Use HBitmap to avoid duplicating bitmap code
       * Use bdrv_getlength() instead of accessing ->total_sectors
       * directly
       * Delete the backup.h header file, it is no longer necessary
       * Move ./backup.c to block/backup.c
       * Remove #ifdefed out code
       * Coding style and whitespace cleanups
       * Use bdrv_add_before_write_notifier() instead of blockjob-specific hooks
       * Keep our own in-flight CowRequest list instead of using block.c
         tracked requests.  This means a little code duplication but is much
         simpler than trying to share the tracked requests list and use the
         backup block size.
       * Add on_source_error and on_target_error error handling.
       * Use trace events instead of DPRINTF()
      
      -- stefanha]
      Signed-off-by: NDietmar Maurer <dietmar@proxmox.com>
      Signed-off-by: NStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      98d2c6f2