From: chai wen Date: Wed, 4 Jun 2014 03:47:37 +0000 (+0800) Subject: block: fix wrong order in live block migration setup X-Git-Tag: qemu-xen-4.6.0-rc1~400^2~8 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=1ac362cdbd799eb8165e2e3bb5cd5aa38b1baae3;p=qemu-xen.git 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 Signed-off-by: chai wen Signed-off-by: Stefan Hajnoczi --- 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);