[libvirt] [PATCH 4/6] Implement virDomainGetBlockInfo in QEMU driver
Jim Meyering
jim at meyering.net
Wed Apr 28 13:45:36 UTC 2010
Daniel P. Berrange wrote:
> * src/qemu/qemu_driver.c: Implementation of virDomainGetBlockInfo
> * src/util/storage_file.h: Add DEV_BSIZE
> * src/storage/storage_backend.c: Remove DEV_BSIZE
...
Hi Dan,
This whole series looks fine.
> +static int qemuDomainGetBlockInfo(virDomainPtr dom,
It's slightly better to format with both the function name and the "{"
in the first column. That makes it easier for certain function-locating
tools (and even humans who are used to that) to find the beginning of
a function. It also saves horizontal space, which can be important with
some of these very long function names.
static int
qemuDomainGetBlockInfo(virDomainPtr dom,
...
{
> + const char *path,
> + virDomainBlockInfoPtr info,
> + unsigned int flags) {
> + struct qemud_driver *driver = dom->conn->privateData;
> + virDomainObjPtr vm;
> + }
...
> + /* Probe for magic formats */
> + memset(&meta, 0, sizeof(meta));
> + if (virStorageFileGetMetadataFromFD(path, fd, &meta) < 0)
> + goto cleanup;
> +
> + /* Get info for normal formats */
> + if (fstat(fd, &sb) < 0) {
> + virReportSystemError(errno,
> + _("cannot stat file '%s'"), path);
> + goto cleanup;
> + }
> +
> + if (S_ISREG(sb.st_mode)) {
> +#ifndef __MINGW32__
> + info->physical = (unsigned long long)sb.st_blocks *
> + (unsigned long long)DEV_BSIZE;
> +#else
> + info->physical = sb.st_size;
> +#endif
> + /* Regular files may be sparse, so logical size (capacity) is not same
> + * as actual physical above
> + */
> + info->capacity = sb.st_size;
> + } else {
It might be worthwhile to change this to handle S_ISBLK
specifically:
} else if (S_ISBLK(sb.st_mode)) {
and to add a final "else" so that the code diagnoses
a non-regular, non-BLOCK file. Then, we can give a better
diagnostic about the file being of a non-seekable type.
On the other hand, its's not very likely we'll encounter such a
file here, so no big deal either way.
> + /* NB. Because we configure with AC_SYS_LARGEFILE, off_t should
> + * be 64 bits on all platforms.
> + */
> + end = lseek (fd, 0, SEEK_END);
> + if (end == (off_t)-1) {
> + virReportSystemError(errno,
> + _("failed to seek to end of %s"), path);
> + goto cleanup;
> + }
> + info->physical = end;
> + info->capacity = end;
> + }
> +
> + /* If the file we probed has a capacity set, then override
> + * what we calculated from file/block extents */
> + if (meta.capacity)
> + info->capacity = meta.capacity;
> +
> + /* XXX allocation will need to be pulled from QEMU for
> + * the qcow inside LVM case */
> + info->allocation = info->physical;
> +
> + ret = 0;
> +
> +cleanup:
> + if (fd != -1)
> + close(fd);
> + if (vm)
> + virDomainObjUnlock(vm);
> + return ret;
> +}
More information about the libvir-list
mailing list