Revision e4654d2d block-migration.c

b/block-migration.c
58 58
    /* Protected by block migration lock.  */
59 59
    unsigned long *aio_bitmap;
60 60
    int64_t completed_sectors;
61
    BdrvDirtyBitmap *dirty_bitmap;
61 62
} BlkMigDevState;
62 63

  
63 64
typedef struct BlkMigBlock {
......
309 310

  
310 311
/* Called with iothread lock taken.  */
311 312

  
312
static void set_dirty_tracking(int enable)
313
static void set_dirty_tracking(void)
313 314
{
314 315
    BlkMigDevState *bmds;
315 316

  
316 317
    QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
317
        bdrv_set_dirty_tracking(bmds->bs, enable ? BLOCK_SIZE : 0);
318
        bmds->dirty_bitmap = bdrv_create_dirty_bitmap(bmds->bs, BLOCK_SIZE);
319
    }
320
}
321

  
322
static void unset_dirty_tracking(void)
323
{
324
    BlkMigDevState *bmds;
325

  
326
    QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
327
        bdrv_release_dirty_bitmap(bmds->bs, bmds->dirty_bitmap);
318 328
    }
319 329
}
320 330

  
......
432 442
        } else {
433 443
            blk_mig_unlock();
434 444
        }
435
        if (bdrv_get_dirty(bmds->bs, sector)) {
445
        if (bdrv_get_dirty(bmds->bs, bmds->dirty_bitmap, sector)) {
436 446

  
437 447
            if (total_sectors - sector < BDRV_SECTORS_PER_DIRTY_CHUNK) {
438 448
                nr_sectors = total_sectors - sector;
......
554 564
    int64_t dirty = 0;
555 565

  
556 566
    QSIMPLEQ_FOREACH(bmds, &block_mig_state.bmds_list, entry) {
557
        dirty += bdrv_get_dirty_count(bmds->bs);
567
        dirty += bdrv_get_dirty_count(bmds->bs, bmds->dirty_bitmap);
558 568
    }
559 569

  
560 570
    return dirty << BDRV_SECTOR_BITS;
......
569 579

  
570 580
    bdrv_drain_all();
571 581

  
572
    set_dirty_tracking(0);
582
    unset_dirty_tracking();
573 583

  
574 584
    blk_mig_lock();
575 585
    while ((bmds = QSIMPLEQ_FIRST(&block_mig_state.bmds_list)) != NULL) {
......
604 614
    init_blk_migration(f);
605 615

  
606 616
    /* start track dirty blocks */
607
    set_dirty_tracking(1);
617
    set_dirty_tracking();
608 618
    qemu_mutex_unlock_iothread();
609 619

  
610 620
    ret = flush_blks(f);

Also available in: Unified diff