@ -2475,67 +2475,69 @@ int bdrv_is_allocated_above(BlockDriverState *top,
}
int coroutine_fn
bdrv_co_rw_vmstate ( BlockDriverState * bs , QEMUIOVector * qiov , int64_t pos ,
bool is_read )
bdrv_co_readv_vmstate ( BlockDriverState * bs , QEMUIOVector * qiov , int64_t pos )
{
BlockDriver * drv = bs - > drv ;
BlockDriverState * child_bs = bdrv_primary_bs ( bs ) ;
int ret = - ENOTSUP ;
if ( ! drv ) {
return - ENOMEDIUM ;
}
bdrv_inc_in_flight ( bs ) ;
if ( ! drv ) {
ret = - ENOMEDIUM ;
} else if ( drv - > bdrv_load_vmstate ) {
if ( is_read ) {
ret = drv - > bdrv_load_vmstate ( bs , qiov , pos ) ;
} else {
ret = drv - > bdrv_save_vmstate ( bs , qiov , pos ) ;
}
if ( drv - > bdrv_load_vmstate ) {
ret = drv - > bdrv_load_vmstate ( bs , qiov , pos ) ;
} else if ( child_bs ) {
ret = bdrv_co_rw _vmstate ( child_bs , qiov , pos , is_read ) ;
ret = bdrv_co_readv_vmstate ( child_bs , qiov , pos ) ;
}
bdrv_dec_in_flight ( bs ) ;
return ret ;
}
int bdrv_save_vmstate ( BlockDriverState * bs , const uint8_t * buf ,
int64_t pos , int size )
int coroutine_fn
bdrv_co_writev_vmstate ( BlockDriverState * bs , QEMUIOVector * qiov , int64_t po s)
{
QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF ( qiov , buf , size ) ;
int ret ;
BlockDriver * drv = bs - > drv ;
BlockDriverState * child_bs = bdrv_primary_bs ( bs ) ;
int ret = - ENOTSUP ;
ret = bdrv_writev_vmstate ( bs , & qiov , pos ) ;
if ( ret < 0 ) {
return ret ;
if ( ! drv ) {
return - ENOMEDIUM ;
}
return size ;
}
bdrv_inc_in_flight ( bs ) ;
int bdrv_writev_vmstate ( BlockDriverState * bs , QEMUIOVector * qiov , int64_t pos )
{
return bdrv_rw_vmstate ( bs , qiov , pos , false ) ;
if ( drv - > bdrv_save_vmstate ) {
ret = drv - > bdrv_save_vmstate ( bs , qiov , pos ) ;
} else if ( child_bs ) {
ret = bdrv_co_writev_vmstate ( child_bs , qiov , pos ) ;
}
bdrv_dec_in_flight ( bs ) ;
return ret ;
}
int bdrv_load_vmstate ( BlockDriverState * bs , uint8_t * buf ,
int bdrv_save _vmstate ( BlockDriverState * bs , const uint8_t * buf ,
int64_t pos , int size )
{
QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF ( qiov , buf , size ) ;
int ret ;
ret = bdrv_readv_vmstate ( bs , & qiov , pos ) ;
if ( ret < 0 ) {
return ret ;
}
int ret = bdrv_writev_vmstate ( bs , & qiov , pos ) ;
return size ;
return ret < 0 ? ret : size ;
}
int bdrv_readv_vmstate ( BlockDriverState * bs , QEMUIOVector * qiov , int64_t pos )
int bdrv_load_vmstate ( BlockDriverState * bs , uint8_t * buf ,
int64_t pos , int size )
{
return bdrv_rw_vmstate ( bs , qiov , pos , true ) ;
QEMUIOVector qiov = QEMU_IOVEC_INIT_BUF ( qiov , buf , size ) ;
int ret = bdrv_readv_vmstate ( bs , & qiov , pos ) ;
return ret < 0 ? ret : size ;
}
/**************************************************************/