Skip to content

Commit ff2fff6

Browse files
Vladimir Sementsov-Ogievskiymdroth
authored andcommitted
migration/block: fix pending() return value
Because of wrong return value of .save_live_pending() in migration/block.c, migration finishes before the whole disk is transferred. Such situation occurs when the migration process is fast enough, for example when source and dest are on the same host. If in the bulk phase we return something < max_size, we will skip transferring the tail of the device. Currently we have "set pending to BLOCK_SIZE if it is zero" for bulk phase, but there no guarantee, that it will be < max_size. True approach is to return, for example, max_size+1 when we are in the bulk phase. Signed-off-by: Vladimir Sementsov-Ogievskiy <[email protected]> Message-id: [email protected] Signed-off-by: Stefan Hajnoczi <[email protected]> (cherry picked from commit 04636dc) Signed-off-by: Michael Roth <[email protected]>
1 parent 83a6674 commit ff2fff6

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

block-migration.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -764,8 +764,8 @@ static uint64_t block_save_pending(QEMUFile *f, void *opaque, uint64_t max_size)
764764
block_mig_state.read_done * BLOCK_SIZE;
765765

766766
/* Report at least one block pending during bulk phase */
767-
if (pending == 0 && !block_mig_state.bulk_completed) {
768-
pending = BLOCK_SIZE;
767+
if (pending <= max_size && !block_mig_state.bulk_completed) {
768+
pending = max_size + BLOCK_SIZE;
769769
}
770770
blk_mig_unlock();
771771
qemu_mutex_unlock_iothread();

0 commit comments

Comments
 (0)