]> xenbits.xensource.com Git - libvirt.git/commitdiff
storage: Switch metadata crawler to use storage driver to read headers
authorPeter Krempa <pkrempa@redhat.com>
Fri, 25 Apr 2014 19:38:40 +0000 (21:38 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 3 Jun 2014 07:27:23 +0000 (09:27 +0200)
Use virStorageFileReadHeader() to read headers of storage files possibly
on remote storage to retrieve the image metadata.

The backend information is now parsed by
virStorageFileGetMetadataInternal which is now exported from the util
source and virStorageFileGetMetadataFromFDInternal now doesn't need to
be exported.

src/libvirt_private.syms
src/storage/storage_driver.c
src/util/virstoragefile.c
src/util/virstoragefile.h

index 91f13a4ef1583f20e3c73b0837aa47418d80d5e4..57312c3f629e784985f87e0a6bb599c3b30bd98e 100644 (file)
@@ -1865,7 +1865,7 @@ virStorageFileFormatTypeToString;
 virStorageFileGetLVMKey;
 virStorageFileGetMetadataFromBuf;
 virStorageFileGetMetadataFromFD;
-virStorageFileGetMetadataFromFDInternal;
+virStorageFileGetMetadataInternal;
 virStorageFileGetSCSIKey;
 virStorageFileIsClusterFS;
 virStorageFileParseChainIndex;
index 5c4188fafebe083993ae166aa3bd319bc06a030c..b074047570317a7fcae87bd208a2ff037a8062f1 100644 (file)
@@ -3132,10 +3132,11 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
                                  bool allow_probe,
                                  virHashTablePtr cycle)
 {
-    int fd;
     int ret = -1;
     struct stat st;
     const char *uniqueName;
+    char *buf = NULL;
+    ssize_t headerLen;
     virStorageSourcePtr backingStore = NULL;
     int backingFormat;
 
@@ -3163,26 +3164,13 @@ virStorageFileGetMetadataRecurse(virStorageSourcePtr src,
     if (virHashAddEntry(cycle, uniqueName, (void *)1) < 0)
         goto cleanup;
 
-    if (virStorageSourceGetActualType(src) != VIR_STORAGE_TYPE_NETWORK) {
-        if ((fd = virFileOpenAs(src->path, O_RDONLY, 0, uid, gid, 0)) < 0) {
-            virReportSystemError(-fd, _("Failed to open file '%s'"),
-                                 src->path);
-            goto cleanup;
-        }
-
-        if (virStorageFileGetMetadataFromFDInternal(src, fd,
-                                                    &backingFormat) < 0) {
-            VIR_FORCE_CLOSE(fd);
-            goto cleanup;
-        }
+    if ((headerLen = virStorageFileReadHeader(src, VIR_STORAGE_MAX_HEADER,
+                                              &buf)) < 0)
+        goto cleanup;
 
-        if (VIR_CLOSE(fd) < 0)
-            VIR_WARN("could not close file %s", src->path);
-    } else {
-        /* TODO: currently we call this only for local storage */
-        ret = 0;
+    if (virStorageFileGetMetadataInternal(src, buf, headerLen,
+                                          &backingFormat) < 0)
         goto cleanup;
-    }
 
     /* check whether we need to go deeper */
     if (!src->backingStoreRaw) {
index 4956808c695e656960a9b73c703777f7eb2368c3..a80131a97f9244f37cbb6725c903ce90a011679c 100644 (file)
@@ -740,8 +740,7 @@ qcow2GetFeatures(virBitmapPtr *features,
  * with information about the file and its backing store. Return format
  * of the backing store as BACKING_FORMAT. PATH and FORMAT have to be
  * pre-populated in META */
-static int ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
-ATTRIBUTE_NONNULL(4)
+int
 virStorageFileGetMetadataInternal(virStorageSourcePtr meta,
                                   char *buf,
                                   size_t len,
@@ -955,7 +954,7 @@ virStorageFileGetMetadataFromBuf(const char *path,
 
 
 /* Internal version that also supports a containing directory name.  */
-int
+static int
 virStorageFileGetMetadataFromFDInternal(virStorageSourcePtr meta,
                                         int fd,
                                         int *backingFormat)
index 99472039f48d6bbf34a12f2737b3bbdce940ed13..b516fbea31cd5a3d02809bb391be26fb45478b87 100644 (file)
@@ -265,9 +265,12 @@ struct _virStorageSource {
 
 int virStorageFileProbeFormat(const char *path, uid_t uid, gid_t gid);
 
-int virStorageFileGetMetadataFromFDInternal(virStorageSourcePtr meta,
-                                            int fd,
-                                            int *backingFormat);
+int virStorageFileGetMetadataInternal(virStorageSourcePtr meta,
+                                      char *buf,
+                                      size_t len,
+                                      int *backingFormat)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(4);
+
 virStorageSourcePtr virStorageFileGetMetadataFromFD(const char *path,
                                                     int fd,
                                                     int format,