If the top image to commit is the active layer, and also larger than the base image, then an I/O error will likely be returned during block-commit.
For instance, if we have a base image with a virtual size 10G, and a active layer image of size 20G, then committing the snapshot via 'block-commit' will likely fail. This will automatically attempt to resize the base image, if the active layer image to be committed is larger. Signed-off-by: Jeff Cody <jc...@redhat.com> --- block/mirror.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/block/mirror.c b/block/mirror.c index 2932bab..c4e42fa 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -630,9 +630,22 @@ void commit_active_start(BlockDriverState *bs, BlockDriverState *base, BlockDriverCompletionFunc *cb, void *opaque, Error **errp) { + int64_t length; if (bdrv_reopen(base, bs->open_flags, errp)) { return; } + + length = bdrv_getlength(bs); + + if (length > bdrv_getlength(base)) { + if (bdrv_truncate(base, length) < 0) { + error_setg(errp, "Top image %s is larger than base image %s, and " + "resize of base image failed.", + bs->filename, base->filename); + return; + } + } + bdrv_ref(base); mirror_start_job(bs, base, speed, 0, 0, on_error, on_error, cb, opaque, errp, -- 1.8.3.1