@ -268,57 +268,66 @@ static void dirty_bitmap_mig_cleanup(void)
}
/* Called with iothread lock taken. */
static int init_dirty_bitmap_migration ( void )
static int add_bitmaps_to_list ( BlockDriverState * bs , const char * bs_name )
{
BlockDriverState * bs ;
BdrvDirtyBitmap * bitmap ;
DirtyBitmapMigBitmapState * dbms ;
Error * local_err = NULL ;
dirty_bitmap_mig_state . bulk_completed = false ;
dirty_bitmap_mig_state . prev_bs = NULL ;
dirty_bitmap_mig_state . prev_bitmap = NULL ;
dirty_bitmap_mig_state . no_bitmaps = false ;
FOR_EACH_DIRTY_BITMAP ( bs , bitmap ) {
if ( ! bdrv_dirty_bitmap_name ( bitmap ) ) {
continue ;
}
for ( bs = bdrv_next_all_states ( NULL ) ; bs ; bs = bdrv_next_all_states ( bs ) ) {
const char * name = bdrv_get_device_or_node_name ( bs ) ;
if ( ! bs_name | | strcmp ( bs_name , " " ) = = 0 ) {
error_report ( " Found bitmap '%s' in unnamed node %p. It can't "
" be migrated " , bdrv_dirty_bitmap_name ( bitmap ) , bs ) ;
return - 1 ;
}
FOR_EACH_DIRTY_BITMAP ( bs , bitmap ) {
if ( ! bdrv_dirty_bitmap_name ( bitmap ) ) {
continue ;
}
if ( bdrv_dirty_bitmap_check ( bitmap , BDRV_BITMAP_DEFAULT , & local_err ) ) {
error_report_err ( local_err ) ;
return - 1 ;
}
if ( ! name | | strcmp ( name , " " ) = = 0 ) {
error_report ( " Found bitmap '%s' in unnamed node %p. It can't "
" be migrated " , bdrv_dirty_bitmap_name ( bitmap ) , bs ) ;
goto fail ;
}
bdrv_ref ( bs ) ;
bdrv_dirty_bitmap_set_busy ( bitmap , true ) ;
dbms = g_new0 ( DirtyBitmapMigBitmapState , 1 ) ;
dbms - > bs = bs ;
dbms - > node_name = bs_name ;
dbms - > bitmap = bitmap ;
dbms - > total_sectors = bdrv_nb_sectors ( bs ) ;
dbms - > sectors_per_chunk = CHUNK_SIZE * 8 *
bdrv_dirty_bitmap_granularity ( bitmap ) > > BDRV_SECTOR_BITS ;
if ( bdrv_dirty_bitmap_enabled ( bitmap ) ) {
dbms - > flags | = DIRTY_BITMAP_MIG_START_FLAG_ENABLED ;
}
if ( bdrv_dirty_bitmap_get_persistence ( bitmap ) ) {
dbms - > flags | = DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT ;
}
if ( bdrv_dirty_bitmap_check ( bitmap , BDRV_BITMAP_DEFAULT ,
& local_err ) ) {
error_report_err ( local_err ) ;
goto fail ;
}
QSIMPLEQ_INSERT_TAIL ( & dirty_bitmap_mig_state . dbms_list ,
dbms , entry ) ;
}
bdrv_ref ( bs ) ;
bdrv_dirty_bitmap_set_busy ( bitmap , true ) ;
dbms = g_new0 ( DirtyBitmapMigBitmapState , 1 ) ;
dbms - > bs = bs ;
dbms - > node_name = name ;
dbms - > bitmap = bitmap ;
dbms - > total_sectors = bdrv_nb_sectors ( bs ) ;
dbms - > sectors_per_chunk = CHUNK_SIZE * 8 *
bdrv_dirty_bitmap_granularity ( bitmap ) > > BDRV_SECTOR_BITS ;
if ( bdrv_dirty_bitmap_enabled ( bitmap ) ) {
dbms - > flags | = DIRTY_BITMAP_MIG_START_FLAG_ENABLED ;
}
if ( bdrv_dirty_bitmap_get_persistence ( bitmap ) ) {
dbms - > flags | = DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT ;
}
return 0 ;
}
/* Called with iothread lock taken. */
static int init_dirty_bitmap_migration ( void )
{
BlockDriverState * bs ;
DirtyBitmapMigBitmapState * dbms ;
dirty_bitmap_mig_state . bulk_completed = false ;
dirty_bitmap_mig_state . prev_bs = NULL ;
dirty_bitmap_mig_state . prev_bitmap = NULL ;
dirty_bitmap_mig_state . no_bitmaps = false ;
QSIMPLEQ_INSERT_TAIL ( & dirty_bitmap_mig_state . dbms_list ,
dbms , entry ) ;
for ( bs = bdrv_next_all_states ( NULL ) ; bs ; bs = bdrv_next_all_states ( bs ) ) {
if ( add_bitmaps_to_list ( bs , bdrv_get_device_or_node_name ( bs ) ) ) {
goto fail ;
}
}