]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: improve allocation stats reported on gluster files
authorEric Blake <eblake@redhat.com>
Mon, 18 Nov 2013 19:45:31 +0000 (12:45 -0700)
committerEric Blake <eblake@redhat.com>
Mon, 25 Nov 2013 19:50:02 +0000 (12:50 -0700)
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@redhat.com>
src/storage/storage_backend.c
src/storage/storage_backend_gluster.c

index c94e89a86feed8c039b22df44f2c0ca38b13253b..57c17283b79e490112fb982fda88e2d98e6c4950 100644 (file)
@@ -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'"),
index 3f4e9f7ff63f46c0030c376aca3a20f7bcb71331..685ad57db2a18f4ddce52e19d9b1f17190f8451b 100644 (file)
@@ -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;