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@xxxxxxxxxxxxxxxxxx> > --- > 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. Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list