From a760ba3a7f58ddd395a0850610475bceb72cbccb Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A1n=20Tomko?= Date: Thu, 19 Feb 2015 13:35:20 +0100 Subject: [PATCH] Probe for capacity in virStorageBackendUpdateVolTargetInfo Instead of just looking at the output of fstat, call virStorageFileGetMetadata to get the full capacity from image headers. Note that the capacity is probed unconditionally. The updateCapacity bool parameter is ignored and will be removed in the following commit. --- src/storage/storage_backend.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c index a67d50cb3..9a8375210 100644 --- a/src/storage/storage_backend.c +++ b/src/storage/storage_backend.c @@ -1514,6 +1514,9 @@ virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target, { int ret, fd = -1; struct stat sb; + virStorageSourcePtr meta = NULL; + char *buf = NULL; + ssize_t len = VIR_STORAGE_MAX_HEADER; if ((ret = virStorageBackendVolOpen(target->path, &sb, openflags)) < 0) goto cleanup; @@ -1523,14 +1526,41 @@ virStorageBackendUpdateVolTargetInfo(virStorageSourcePtr target, updateCapacity)) < 0) goto cleanup; + if (target->type == VIR_STORAGE_VOL_FILE && + target->format != VIR_STORAGE_FILE_NONE) { + if (S_ISDIR(sb.st_mode)) { + ret = 0; + goto cleanup; + } + + if (lseek(fd, 0, SEEK_SET) == (off_t)-1) { + virReportSystemError(errno, _("cannot seek to start of '%s'"), target->path); + goto cleanup; + } + + if ((len = virFileReadHeaderFD(fd, len, &buf)) < 0) { + virReportSystemError(errno, _("cannot read header '%s'"), target->path); + goto cleanup; + } + + if (!(meta = virStorageFileGetMetadataFromBuf(target->path, buf, len, target->format, + NULL))) { + goto cleanup; + } + + if (meta->capacity) + target->capacity = meta->capacity; + } + if (withBlockVolFormat) { if ((ret = virStorageBackendDetectBlockVolFormatFD(target, fd)) < 0) goto cleanup; } cleanup: + virStorageSourceFree(meta); VIR_FORCE_CLOSE(fd); - + VIR_FREE(buf); return ret; } -- 2.39.5