On Wed, Jan 15, 2014 at 01:58:29PM +0800, Fam Zheng wrote:
On Mon, 01/13 15:18, Jeff Cody wrote:
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;
}
base is already reopened here.
+
+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;
Should we restore open flags for base?
Good catch. Yes, I think we should; and I think we should also do it
after the call to mirror_start_job, if errp is set. I'll add that in
for v2.
+}
+}
+
bdrv_ref(base);
mirror_start_job(bs, base, speed, 0, 0,
on_error, on_error, cb, opaque, errp,
--
1.8.3.1