|
@@ -368,7 +368,9 @@ static void unset_dirty_tracking(void)
|
|
|
BlkMigDevState *bmds;
|
|
|
|
|
|
QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
|
|
|
- bdrv_release_dirty_bitmap(bmds->dirty_bitmap);
|
|
|
+ if (bmds->dirty_bitmap) {
|
|
|
+ bdrv_release_dirty_bitmap(bmds->dirty_bitmap);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -676,13 +678,18 @@ static int64_t get_remaining_dirty(void)
|
|
|
static void block_migration_cleanup_bmds(void)
|
|
|
{
|
|
|
BlkMigDevState *bmds;
|
|
|
+ BlockDriverState *bs;
|
|
|
AioContext *ctx;
|
|
|
|
|
|
unset_dirty_tracking();
|
|
|
|
|
|
while ((bmds = QSIMPLEQ_FIRST(&block_mig_state.bmds_list)) != NULL) {
|
|
|
QSIMPLEQ_REMOVE_HEAD(&block_mig_state.bmds_list, entry);
|
|
|
- bdrv_op_unblock_all(blk_bs(bmds->blk), bmds->blocker);
|
|
|
+
|
|
|
+ bs = blk_bs(bmds->blk);
|
|
|
+ if (bs) {
|
|
|
+ bdrv_op_unblock_all(bs, bmds->blocker);
|
|
|
+ }
|
|
|
error_free(bmds->blocker);
|
|
|
|
|
|
/* Save ctx, because bmds->blk can disappear during blk_unref. */
|