From 77664b256856980cfaf35173d59d463c16562673 Mon Sep 17 00:00:00 2001 From: MotoKen Date: Thu, 8 Mar 2012 15:37:53 +0800 Subject: Checks image virtual size before qemu-img resize. Checks virtual size instead of file size. Fixes bug 905350. Change-Id: I1772b0996b7c9a2e07d3e298b156f777df67ef5f --- nova/virt/disk/api.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'nova') diff --git a/nova/virt/disk/api.py b/nova/virt/disk/api.py index a9b1067c2..f74c70bf4 100644 --- a/nova/virt/disk/api.py +++ b/nova/virt/disk/api.py @@ -29,6 +29,7 @@ import crypt import json import os import random +import re import tempfile from nova import exception @@ -90,6 +91,10 @@ for s in FLAGS.virt_mkfs: _DEFAULT_MKFS_COMMAND = mkfs_command +_QEMU_VIRT_SIZE_REGEX = re.compile('^virtual size: (.*) \(([0-9]+) bytes\)', + re.MULTILINE) + + def mkfs(os_type, fs_label, target): mkfs_command = (_MKFS_COMMAND.get(os_type, _DEFAULT_MKFS_COMMAND) or '') % locals() @@ -97,10 +102,17 @@ def mkfs(os_type, fs_label, target): utils.execute(*mkfs_command.split()) +def get_image_virtual_size(image): + out, _err = utils.execute('qemu-img', 'info', image) + m = _QEMU_VIRT_SIZE_REGEX.search(out) + return int(m.group(2)) + + def extend(image, size): """Increase image to size""" - file_size = os.path.getsize(image) - if file_size >= size: + # NOTE(MotoKen): check image virtual size before resize + virt_size = get_image_virtual_size(image) + if virt_size >= size: return utils.execute('qemu-img', 'resize', image, size) # NOTE(vish): attempts to resize filesystem -- cgit