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); > } >