[libvirt] [PATCHv8 01/11] storage: let format probing work on root-squash NFS

Eric Blake eblake at redhat.com
Sat Oct 20 21:47:10 UTC 2012


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.
---

v8: new patch

 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 feda4d9..dc9c62c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -9309,7 +9309,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 cecc2d2..30e203c 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 882df6e..e0b4178 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 9b00dba..abfaca9 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);

-- 
1.7.11.7




More information about the libvir-list mailing list