From 30b3be8f6ae6ba406166b75376c7edf54a9493c8 Mon Sep 17 00:00:00 2001 Message-Id: <30b3be8f6ae6ba406166b75376c7edf54a9493c8@dist-git> From: Eric Blake Date: Wed, 26 Feb 2014 14:54:26 +0100 Subject: [PATCH] storage: improve allocation stats reported on gluster files https://bugzilla.redhat.com/show_bug.cgi?id=1032370 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 (cherry picked from commit 13e738cc0a02db47f8b1958759699b5b06b4d647) Signed-off-by: Jiri Denemark --- 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 d19c250..086642c 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1264,9 +1264,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 * @@ -1308,7 +1308,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 @@ -1343,7 +1343,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 3f4e9f7..685ad57 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.9.0