Revision a55eb92c block.c
b/block.c | ||
---|---|---|
643 | 643 |
} |
644 | 644 |
|
645 | 645 |
static void set_dirty_bitmap(BlockDriverState *bs, int64_t sector_num, |
646 |
int nb_sectors, int dirty)
|
|
646 |
int nb_sectors, int dirty)
|
|
647 | 647 |
{ |
648 | 648 |
int64_t start, end; |
649 |
|
|
649 | 650 |
start = sector_num / SECTORS_PER_DIRTY_CHUNK; |
650 | 651 |
end = (sector_num + nb_sectors) / SECTORS_PER_DIRTY_CHUNK; |
651 |
|
|
652 |
for(; start <= end; start++) { |
|
652 |
|
|
653 |
for (; start <= end; start++) {
|
|
653 | 654 |
bs->dirty_bitmap[start] = dirty; |
654 | 655 |
} |
655 | 656 |
} |
... | ... | |
670 | 671 |
return -EACCES; |
671 | 672 |
if (bdrv_check_request(bs, sector_num, nb_sectors)) |
672 | 673 |
return -EIO; |
673 |
|
|
674 |
if(bs->dirty_tracking) { |
|
674 |
|
|
675 |
if (bs->dirty_tracking) {
|
|
675 | 676 |
set_dirty_bitmap(bs, sector_num, nb_sectors, 1); |
676 | 677 |
} |
677 |
|
|
678 |
|
|
678 | 679 |
return drv->bdrv_write(bs, sector_num, buf, nb_sectors); |
679 | 680 |
} |
680 | 681 |
|
... | ... | |
1220 | 1221 |
return -ENOTSUP; |
1221 | 1222 |
if (bdrv_check_request(bs, sector_num, nb_sectors)) |
1222 | 1223 |
return -EIO; |
1223 |
|
|
1224 |
if(bs->dirty_tracking) { |
|
1224 |
|
|
1225 |
if (bs->dirty_tracking) {
|
|
1225 | 1226 |
set_dirty_bitmap(bs, sector_num, nb_sectors, 1); |
1226 | 1227 |
} |
1227 |
|
|
1228 |
|
|
1228 | 1229 |
return drv->bdrv_write_compressed(bs, sector_num, buf, nb_sectors); |
1229 | 1230 |
} |
1230 | 1231 |
|
... | ... | |
1422 | 1423 |
if (bdrv_check_request(bs, sector_num, nb_sectors)) |
1423 | 1424 |
return NULL; |
1424 | 1425 |
|
1425 |
if(bs->dirty_tracking) { |
|
1426 |
if (bs->dirty_tracking) {
|
|
1426 | 1427 |
set_dirty_bitmap(bs, sector_num, nb_sectors, 1); |
1427 | 1428 |
} |
1428 |
|
|
1429 |
|
|
1429 | 1430 |
ret = drv->bdrv_aio_writev(bs, sector_num, qiov, nb_sectors, |
1430 | 1431 |
cb, opaque); |
1431 | 1432 |
|
... | ... | |
1966 | 1967 |
void bdrv_set_dirty_tracking(BlockDriverState *bs, int enable) |
1967 | 1968 |
{ |
1968 | 1969 |
int64_t bitmap_size; |
1969 |
if(enable) { |
|
1970 |
if(bs->dirty_tracking == 0) { |
|
1970 |
|
|
1971 |
if (enable) { |
|
1972 |
if (bs->dirty_tracking == 0) { |
|
1971 | 1973 |
int64_t i; |
1972 | 1974 |
uint8_t test; |
1975 |
|
|
1973 | 1976 |
bitmap_size = (bdrv_getlength(bs) >> SECTOR_BITS); |
1974 | 1977 |
bitmap_size /= SECTORS_PER_DIRTY_CHUNK; |
1975 | 1978 |
bitmap_size++; |
1976 |
|
|
1979 |
|
|
1977 | 1980 |
bs->dirty_bitmap = qemu_mallocz(bitmap_size); |
1978 |
|
|
1981 |
|
|
1979 | 1982 |
bs->dirty_tracking = enable; |
1980 | 1983 |
for(i = 0; i < bitmap_size; i++) test = bs->dirty_bitmap[i]; |
1981 |
}
|
|
1984 |
}
|
|
1982 | 1985 |
} else { |
1983 |
if(bs->dirty_tracking != 0) { |
|
1986 |
if (bs->dirty_tracking != 0) {
|
|
1984 | 1987 |
qemu_free(bs->dirty_bitmap); |
1985 | 1988 |
bs->dirty_tracking = enable; |
1986 |
}
|
|
1989 |
}
|
|
1987 | 1990 |
} |
1988 | 1991 |
} |
1989 | 1992 |
|
1990 | 1993 |
int bdrv_get_dirty(BlockDriverState *bs, int64_t sector) |
1991 | 1994 |
{ |
1992 | 1995 |
int64_t chunk = sector / (int64_t)SECTORS_PER_DIRTY_CHUNK; |
1993 |
|
|
1994 |
if(bs->dirty_bitmap != NULL &&
|
|
1995 |
(sector << SECTOR_BITS) <= bdrv_getlength(bs)) { |
|
1996 |
|
|
1997 |
if (bs->dirty_bitmap != NULL &&
|
|
1998 |
(sector << SECTOR_BITS) <= bdrv_getlength(bs)) {
|
|
1996 | 1999 |
return bs->dirty_bitmap[chunk]; |
1997 | 2000 |
} else { |
1998 | 2001 |
return 0; |
1999 | 2002 |
} |
2000 | 2003 |
} |
2001 | 2004 |
|
2002 |
void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector,
|
|
2003 |
int nr_sectors)
|
|
2005 |
void bdrv_reset_dirty(BlockDriverState *bs, int64_t cur_sector, |
|
2006 |
int nr_sectors)
|
|
2004 | 2007 |
{ |
2005 | 2008 |
set_dirty_bitmap(bs, cur_sector, nr_sectors, 0); |
2006 | 2009 |
} |
Also available in: Unified diff