We already had code for handling allocation different than
capacity for sparse files; we just had to wire it up to be
used when inspecting gluster images.
* src/storage/storage_backend.c
(virStorageBackendUpdateVolTargetInfoFD): Handle no fd.
* src/storage/storage_backend_gluster.c
(virStorageBackendGlusterRefreshVol): Handle sparse files.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/storage/storage_backend.c | 8 ++++----
src/storage/storage_backend_gluster.c | 7 ++++++-
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index c94e89a..57c1728 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -1296,9 +1296,9 @@ int virStorageBackendUpdateVolInfo(virStorageVolDefPtr vol,
/*
* virStorageBackendUpdateVolTargetInfoFD:
- * @conn: connection to report errors on
* @target: target definition ptr of volume to update
- * @fd: fd of storage volume to update, via virStorageBackendOpenVol*
+ * @fd: fd of storage volume to update, via virStorageBackendOpenVol*, or -1
+ * @sb: details about file (must match @fd, if that is provided)
* @allocation: If not NULL, updated allocation information will be stored
* @capacity: If not NULL, updated capacity info will be stored
*
@@ -1333,7 +1333,7 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr
target,
if (capacity)
*capacity = 0;
- } else {
+ } else if (fd >= 0) {
off_t end;
/* XXX this is POSIX compliant, but doesn't work for CHAR files,
* only BLOCK. There is a Linux specific ioctl() for getting
@@ -1368,7 +1368,7 @@ virStorageBackendUpdateVolTargetInfoFD(virStorageVolTargetPtr
target,
#if WITH_SELINUX
/* XXX: make this a security driver call */
- if (fgetfilecon_raw(fd, &filecon) == -1) {
+ if (fd >= 0 && fgetfilecon_raw(fd, &filecon) == -1) {
if (errno != ENODATA && errno != ENOTSUP) {
virReportSystemError(errno,
_("cannot get file context of '%s'"),
diff --git a/src/storage/storage_backend_gluster.c
b/src/storage/storage_backend_gluster.c
index 89abb57..a4fd4b3 100644
--- a/src/storage/storage_backend_gluster.c
+++ b/src/storage/storage_backend_gluster.c
@@ -168,6 +168,12 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr
state,
if (VIR_ALLOC(vol) < 0)
goto cleanup;
+
+ if (virStorageBackendUpdateVolTargetInfoFD(&vol->target, -1, st,
+ &vol->allocation,
+ &vol->capacity) < 0)
+ goto cleanup;
+
if (VIR_STRDUP(vol->name, name) < 0)
goto cleanup;
if (virAsprintf(&vol->key, "/%s%s%s", state->volname,
state->dir,
@@ -194,7 +200,6 @@ virStorageBackendGlusterRefreshVol(virStorageBackendGlusterStatePtr
state,
/* FIXME - must open files to determine if they are non-raw */
vol->type = VIR_STORAGE_VOL_NETWORK;
vol->target.format = VIR_STORAGE_FILE_RAW;
- vol->capacity = vol->allocation = st->st_size;
*volptr = vol;
vol = NULL;
--
1.8.3.1