On Mon, Dec 16, 2013 at 01:18:05PM +0100, Michal Privoznik wrote:
On 16.12.2013 06:00, Wang Sen wrote:
> Currently, vol-resize allocates more bytes against vol->capacity, but
> vol->capacity may be different from the real allocated size because --allocate
> may not be specified. e.g.
> [root@localhost ~]# virsh vol-list --pool tmp-pool --details
> name path type Capacity allocated
> -------------------------------------------------------------
> tmp-vol /root/tmp-pool/tmp-vol file 1.00 GiB 1.00 GiB
> [root@localhost ~]# virsh vol-resize tmp-vol --pool tmp-pool 2G
> [root@localhost ~]# virsh vol-list --pool tmp-pool --details
> name path type Capacity allocated
> -------------------------------------------------------------
> tmp-vol /root/tmp-pool/tmp-vol file 2.00 GiB 1.00 GiB
> So, if we want to allocate more bytes to 3G, the real allocated size is 2G
> actually.
> [root@localhost ~]# virsh vol-resize tmp-vol --pool tmp-pool 3G --allocate
> [root@localhost ~]# virsh vol-list --pool tmp-pool --details
> name path type Capacity allocated
> -------------------------------------------------------------
> tmp-vol /root/tmp-pool/tmp-vol file 3.00 GiB 2.00 GiB
> This patch enable resize vol against the real allocated size. After this patch
> is applied, the result of the last resize command become 3G.
> [root@localhost ~]# virsh vol-resize tmp-vol --pool tmp-pool 3G --allocate
> [root@localhost ~]# virsh vol-list --pool tmp-pool --details
> name path type Capacity allocated
> -------------------------------------------------------------
> tmp-vol /root/tmp-pool/tmp-vol file 3.00 GiB 3.00 GiB
>
> Signed-off-by: Wang Sen <wangsen(a)linux.vnet.ibm.com>
> ---
> src/storage/storage_backend_fs.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
> index 11cf2df..e75c57b 100644
> --- a/src/storage/storage_backend_fs.c
> +++ b/src/storage/storage_backend_fs.c
> @@ -1261,13 +1261,28 @@ virStorageBackendFileSystemVolResize(virConnectPtr conn
ATTRIBUTE_UNUSED,
> unsigned long long capacity,
> unsigned int flags)
> {
> + int fd = -1;
> virCheckFlags(VIR_STORAGE_VOL_RESIZE_ALLOCATE, -1);
> + unsigned long long orig_capacity;
> + virStorageFileMetadataPtr meta = NULL;
> +
> + if ((fd = open(vol->target.path, O_RDWR)) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Can not open
file"));
> + }
> +
> + if (!(meta = virStorageFileGetMetadataFromFD(vol->target.path, fd, \
> + vol->target.format))) {
> + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Get meta
data error!"));
> + }
> + orig_capacity = meta->capacity;
> + virStorageFileFreeMetadata(meta);
> + close(fd);
Using close() is prohibited and you should you VIR_CLOSE instead.
However, there's no need to do this while we have
virStorageFileGetMetadata(), Nor it's needed for other formats than _RAW.
>
> bool pre_allocate = flags & VIR_STORAGE_VOL_RESIZE_ALLOCATE;
>
> if (vol->target.format == VIR_STORAGE_FILE_RAW) {
> return virStorageFileResize(vol->target.path, capacity,
> - vol->capacity, pre_allocate);
> + orig_capacity, pre_allocate);
> } else {
> if (pre_allocate) {
> virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
>
I agree that we have a bug here. But I think we need this modified
version. I'll post it shortly.
okay, thanks a lot.
Michal