On 10/23/2017 05:29 AM, Vladimir Sementsov-Ogievskiy wrote:
> Snapshot-switch actually changes active state of disk so it should
> reflect on dirty bitmaps. Otherwise next incremental backup using
> these bitmaps will be invalid.
> 

Good call. I knew that snapshots weren't compatible, but this makes it
more obvious and less error-prone to an end user.

> Signed-off-by: Vladimir Sementsov-Ogievskiy <vsement...@virtuozzo.com>

Reviewed-by: John Snow <js...@redhat.com>

> ---
>  block/snapshot.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/block/snapshot.c b/block/snapshot.c
> index a46564e7b7..1d5ab5f90f 100644
> --- a/block/snapshot.c
> +++ b/block/snapshot.c
> @@ -181,10 +181,24 @@ int bdrv_snapshot_goto(BlockDriverState *bs,
>  {
>      BlockDriver *drv = bs->drv;
>      int ret, open_ret;
> +    int64_t len;
>  
>      if (!drv) {
>          return -ENOMEDIUM;
>      }
> +
> +    len = bdrv_getlength(bs);
> +    if (len < 0) {
> +        return len;
> +    }
> +    /* We should set all bits in all enabled dirty bitmaps, because dirty
> +     * bitmaps reflect active state of disk and snapshot switch operation
> +     * actually dirties active state.
> +     * TODO: It may make sense not to set all bits but analyze block status 
> of
> +     * current state and destination snapshot and do not set bits 
> corresponding
> +     * to both-zero or both-unallocated areas. */
> +    bdrv_set_dirty(bs, 0, len);
> +
>      if (drv->bdrv_snapshot_goto) {
>          return drv->bdrv_snapshot_goto(bs, snapshot_id);
>      }
> 


Reply via email to