aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchai wen <chaiw.fnst@cn.fujitsu.com>2014-06-04 11:47:37 +0800
committerStefan Hajnoczi <stefanha@redhat.com>2014-06-04 11:22:39 +0200
commit1ac362cdbd799eb8165e2e3bb5cd5aa38b1baae3 (patch)
tree3534a306f12f2fde93427d0d65c3078f1da9a672
parentb15446fdbf4ac2b29f6ee5080630a80715abfc20 (diff)
block: fix wrong order in live block migration setup
The function init_blk_migration is better to be called before set_dirty_tracking as the reasons below. If we want to track dirty blocks via dirty_maps on a BlockDriverState when doing live block-migration, its correspoding 'BlkMigDevState' should be added to block_mig_state.bmds_list first for subsequent processing. Otherwise set_dirty_tracking will do nothing on an empty list than allocating dirty_bitmaps for them. And bdrv_get_dirty_count will access the bmds->dirty_maps directly, then there would be a segfault triggered. If the set_dirty_tracking fails, qemu_savevm_state_cancel will handle the cleanup of init_blk_migration automatically. Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: chai wen <chaiw.fnst@cn.fujitsu.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r--block-migration.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/block-migration.c b/block-migration.c
index 16562709c8..25a03889f4 100644
--- a/block-migration.c
+++ b/block-migration.c
@@ -629,6 +629,7 @@ static int block_save_setup(QEMUFile *f, void *opaque)
block_mig_state.submitted, block_mig_state.transferred);
qemu_mutex_lock_iothread();
+ init_blk_migration(f);
/* start track dirty blocks */
ret = set_dirty_tracking();
@@ -638,8 +639,6 @@ static int block_save_setup(QEMUFile *f, void *opaque)
return ret;
}
- init_blk_migration(f);
-
qemu_mutex_unlock_iothread();
ret = flush_blks(f);