Skip to content

Commit

Permalink
block-migration: Ensure we don't crash during migration cleanup
Browse files Browse the repository at this point in the history
We can fail the blk_insert_bs() at init_blk_migration(), leaving the
BlkMigDevState without a dirty_bitmap and BlockDriverState. Account
for the possibly missing elements when doing cleanup.

Fix the following crashes:

Thread 1 "qemu-system-x86" received signal SIGSEGV, Segmentation fault.
0x0000555555ec83ef in bdrv_release_dirty_bitmap (bitmap=0x0) at ../block/dirty-bitmap.c:359
359         BlockDriverState *bs = bitmap->bs;
 #0  0x0000555555ec83ef in bdrv_release_dirty_bitmap (bitmap=0x0) at ../block/dirty-bitmap.c:359
 #1  0x0000555555bba331 in unset_dirty_tracking () at ../migration/block.c:371
 qemu#2  0x0000555555bbad98 in block_migration_cleanup_bmds () at ../migration/block.c:681

Thread 1 "qemu-system-x86" received signal SIGSEGV, Segmentation fault.
0x0000555555e971ff in bdrv_op_unblock (bs=0x0, op=BLOCK_OP_TYPE_BACKUP_SOURCE, reason=0x0) at ../block.c:7073
7073        QLIST_FOREACH_SAFE(blocker, &bs->op_blockers[op], list, next) {
 #0  0x0000555555e971ff in bdrv_op_unblock (bs=0x0, op=BLOCK_OP_TYPE_BACKUP_SOURCE, reason=0x0) at ../block.c:7073
 #1  0x0000555555e9734a in bdrv_op_unblock_all (bs=0x0, reason=0x0) at ../block.c:7095
 qemu#2  0x0000555555bbae13 in block_migration_cleanup_bmds () at ../migration/block.c:690

Signed-off-by: Fabiano Rosas <[email protected]>
Message-id: [email protected]
Signed-off-by: Stefan Hajnoczi <[email protected]>
  • Loading branch information
Fabiano Rosas authored and stefanhaRH committed Aug 30, 2023
1 parent 813bac3 commit f187609
Showing 1 changed file with 9 additions and 2 deletions.
11 changes: 9 additions & 2 deletions migration/block.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}

Expand Down Expand Up @@ -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. */
Expand Down

0 comments on commit f187609

Please sign in to comment.