From d9d77bfa8085f37eb0bff3d795c3d12f5d36de3d Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Sat, 20 Oct 2012 13:56:35 -0600 Subject: [PATCH] storage: let format probing work on root-squash NFS Yet another instance of where using plain open() mishandles files that live on root-squash NFS, and where improving the API can improve the chance of a successful probe. * src/util/storage_file.h (virStorageFileProbeFormat): Alter signature. * src/util/storage_file.c (virStorageFileProbeFormat): Use better method for opening file. * src/qemu/qemu_driver.c (qemuDomainGetBlockInfo): Update caller. * src/storage/storage_backend_fs.c (virStorageBackendProbeTarget): Likewise. --- src/qemu/qemu_driver.c | 3 ++- src/storage/storage_backend_fs.c | 2 +- src/util/storage_file.c | 4 ++-- src/util/storage_file.h | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2f83626127..d1dc2b8051 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -9310,7 +9310,8 @@ static int qemuDomainGetBlockInfo(virDomainPtr dom, format = disk->format; } else { if (driver->allowDiskFormatProbing) { - if ((format = virStorageFileProbeFormat(disk->src)) < 0) + if ((format = virStorageFileProbeFormat(disk->src, driver->user, + driver->group)) < 0) goto cleanup; } else { virReportError(VIR_ERR_INTERNAL_ERROR, diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c index cecc2d2bcc..30e203ca37 100644 --- a/src/storage/storage_backend_fs.c +++ b/src/storage/storage_backend_fs.c @@ -104,7 +104,7 @@ virStorageBackendProbeTarget(virStorageVolTargetPtr target, meta->backingStore = NULL; if (meta->backingStoreFormat == VIR_STORAGE_FILE_AUTO && meta->backingStoreIsFile) { - if ((ret = virStorageFileProbeFormat(*backingStore)) < 0) { + if ((ret = virStorageFileProbeFormat(*backingStore, -1, -1)) < 0) { /* If the backing file is currently unavailable, only log an error, * but continue. Returning -1 here would disable the whole storage * pool, making it unavailable for even maintenance. */ diff --git a/src/util/storage_file.c b/src/util/storage_file.c index 882df6ef11..e0b41781b0 100644 --- a/src/util/storage_file.c +++ b/src/util/storage_file.c @@ -830,11 +830,11 @@ cleanup: * Best option: Don't use this function */ int -virStorageFileProbeFormat(const char *path) +virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid) { int fd, ret; - if ((fd = open(path, O_RDONLY)) < 0) { + if ((fd = virFileOpenAs(path, O_RDONLY, 0, uid, gid, 0)) < 0) { virReportSystemError(errno, _("cannot open file '%s'"), path); return -1; } diff --git a/src/util/storage_file.h b/src/util/storage_file.h index 9b00dba28c..abfaca96bc 100644 --- a/src/util/storage_file.h +++ b/src/util/storage_file.h @@ -66,7 +66,7 @@ struct _virStorageFileMetadata { # define DEV_BSIZE 512 # endif -int virStorageFileProbeFormat(const char *path); +int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid); int virStorageFileProbeFormatFromFD(const char *path, int fd); -- 2.39.5