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.
This commit is contained in:
Eric Blake 2012-10-20 13:56:35 -06:00
parent e0ad466983
commit d9d77bfa80
4 changed files with 6 additions and 5 deletions

View File

@ -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,

View File

@ -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. */

View File

@ -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;
}

View File

@ -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);