• K
    block: Inactivate BDS when migration completes · 76b1c7fe
    Kevin Wolf 提交于
    So far, live migration with shared storage meant that the image is in a
    not-really-ready don't-touch-me state on the destination while the
    source is still actively using it, but after completing the migration,
    the image was fully opened on both sides. This is bad.
    
    This patch adds a block driver callback to inactivate images on the
    source before completing the migration. Inactivation means that it goes
    to a state as if it was just live migrated to the qemu instance on the
    source (i.e. BDRV_O_INACTIVE is set). You're then supposed to continue
    either on the source or on the destination, which takes ownership of the
    image.
    
    A typical migration looks like this now with respect to disk images:
    
    1. Destination qemu is started, the image is opened with
       BDRV_O_INACTIVE. The image is fully opened on the source.
    
    2. Migration is about to complete. The source flushes the image and
       inactivates it. Now both sides have the image opened with
       BDRV_O_INACTIVE and are expecting the other side to still modify it.
    
    3. One side (the destination on success) continues and calls
       bdrv_invalidate_all() in order to take ownership of the image again.
       This removes BDRV_O_INACTIVE on the resuming side; the flag remains
       set on the other side.
    
    This ensures that the same image isn't written to by both instances
    (unless both are resumed, but then you get what you deserve). This is
    important because .bdrv_close for non-BDRV_O_INACTIVE images could write
    to the image file, which is definitely forbidden while another host is
    using the image.
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    Reviewed-by: NEric Blake <eblake@redhat.com>
    Reviewed-by: NJohn Snow <jsnow@redhat.com>
    76b1c7fe
block_int.h 27.1 KB