[libvirt] [PATCH v2 01/15] storage: extract storage file backend from main storage driver backend

Daniel P. Berrangé berrange at redhat.com
Wed Jan 31 16:21:23 UTC 2018


The storage driver backends are serving the public storage pools API,
while the storage file backends are serving the internal QEMU driver and
/ or libvirt utility code.

To prep for moving this storage file backend framework into the utility
code, split out the backend definitions.

Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
---
 po/POTFILES.in                        |   1 +
 src/Makefile.am                       |   1 +
 src/storage/storage_backend.c         |  66 ---------------------
 src/storage/storage_backend.h         |  75 -----------------------
 src/storage/storage_backend_fs.c      |   7 ++-
 src/storage/storage_backend_gluster.c |   3 +-
 src/storage/storage_source.c          |   2 +-
 src/storage/storage_source_backend.c  | 108 ++++++++++++++++++++++++++++++++++
 src/storage/storage_source_backend.h  | 104 ++++++++++++++++++++++++++++++++
 9 files changed, 221 insertions(+), 146 deletions(-)
 create mode 100644 src/storage/storage_source_backend.c
 create mode 100644 src/storage/storage_source_backend.h

diff --git a/po/POTFILES.in b/po/POTFILES.in
index cbf2accba4..ea99f61677 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -187,6 +187,7 @@ src/storage/storage_backend_vstorage.c
 src/storage/storage_backend_zfs.c
 src/storage/storage_driver.c
 src/storage/storage_source.c
+src/storage/storage_source_backend.c
 src/storage/storage_util.c
 src/test/test_driver.c
 src/uml/uml_conf.c
diff --git a/src/Makefile.am b/src/Makefile.am
index a9182d29af..cc958c34ec 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1065,6 +1065,7 @@ STORAGE_DRIVER_BACKEND_SOURCES = \
 STORAGE_DRIVER_SOURCES = \
 		storage/storage_driver.h storage/storage_driver.c \
 		storage/storage_source.h storage/storage_source.c \
+		storage/storage_source_backend.h storage/storage_source_backend.c \
 		$(STORAGE_DRIVER_BACKEND_SOURCES) \
 		storage/storage_util.h storage/storage_util.c
 
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 5a8c4f7f6a..053f4ecf26 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -78,8 +78,6 @@ VIR_LOG_INIT("storage.storage_backend");
 
 static virStorageBackendPtr virStorageBackends[VIR_STORAGE_BACKENDS_MAX];
 static size_t virStorageBackendsCount;
-static virStorageFileBackendPtr virStorageFileBackends[VIR_STORAGE_BACKENDS_MAX];
-static size_t virStorageFileBackendsCount;
 
 #define STORAGE_BACKEND_MODULE_DIR LIBDIR "/libvirt/storage-backend"
 
@@ -179,27 +177,6 @@ virStorageBackendRegister(virStorageBackendPtr backend)
 }
 
 
-int
-virStorageBackendFileRegister(virStorageFileBackendPtr backend)
-{
-    VIR_DEBUG("Registering storage file backend '%s' protocol '%s'",
-              virStorageTypeToString(backend->type),
-              virStorageNetProtocolTypeToString(backend->protocol));
-
-    if (virStorageFileBackendsCount >= VIR_STORAGE_BACKENDS_MAX) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("Too many drivers, cannot register storage file "
-                         "backend '%s'"),
-                       virStorageTypeToString(backend->type));
-        return -1;
-    }
-
-    virStorageFileBackends[virStorageFileBackendsCount] = backend;
-    virStorageFileBackendsCount++;
-    return 0;
-}
-
-
 virStorageBackendPtr
 virStorageBackendForType(int type)
 {
@@ -213,46 +190,3 @@ virStorageBackendForType(int type)
                    type, NULLSTR(virStoragePoolTypeToString(type)));
     return NULL;
 }
-
-
-virStorageFileBackendPtr
-virStorageFileBackendForTypeInternal(int type,
-                                     int protocol,
-                                     bool report)
-{
-    size_t i;
-
-    for (i = 0; i < virStorageFileBackendsCount; i++) {
-        if (virStorageFileBackends[i]->type == type) {
-            if (type == VIR_STORAGE_TYPE_NETWORK &&
-                virStorageFileBackends[i]->protocol != protocol)
-                continue;
-
-            return virStorageFileBackends[i];
-        }
-    }
-
-    if (!report)
-        return NULL;
-
-    if (type == VIR_STORAGE_TYPE_NETWORK) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("missing storage backend for network files "
-                         "using %s protocol"),
-                       virStorageNetProtocolTypeToString(protocol));
-    } else {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("missing storage backend for '%s' storage"),
-                       virStorageTypeToString(type));
-    }
-
-    return NULL;
-}
-
-
-virStorageFileBackendPtr
-virStorageFileBackendForType(int type,
-                             int protocol)
-{
-    return virStorageFileBackendForTypeInternal(type, protocol, true);
-}
diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index 193cf134d6..f9aa4cd26b 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -125,83 +125,8 @@ struct _virStorageBackend {
 
 virStorageBackendPtr virStorageBackendForType(int type);
 
-/* ------- virStorageFile backends ------------ */
-typedef struct _virStorageFileBackend virStorageFileBackend;
-typedef virStorageFileBackend *virStorageFileBackendPtr;
-
-struct _virStorageDriverData {
-    virStorageFileBackendPtr backend;
-    void *priv;
-
-    uid_t uid;
-    gid_t gid;
-};
-
-typedef int
-(*virStorageFileBackendInit)(virStorageSourcePtr src);
-
-typedef void
-(*virStorageFileBackendDeinit)(virStorageSourcePtr src);
-
-typedef int
-(*virStorageFileBackendCreate)(virStorageSourcePtr src);
-
-typedef int
-(*virStorageFileBackendUnlink)(virStorageSourcePtr src);
-
-typedef int
-(*virStorageFileBackendStat)(virStorageSourcePtr src,
-                             struct stat *st);
-
-typedef ssize_t
-(*virStorageFileBackendRead)(virStorageSourcePtr src,
-                             size_t offset,
-                             size_t len,
-                             char **buf);
-
-typedef const char *
-(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
-
-typedef int
-(*virStorageFileBackendAccess)(virStorageSourcePtr src,
-                               int mode);
-
-typedef int
-(*virStorageFileBackendChown)(const virStorageSource *src,
-                              uid_t uid,
-                              gid_t gid);
-
-virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
-virStorageFileBackendPtr virStorageFileBackendForTypeInternal(int type,
-                                                              int protocol,
-                                                              bool report);
-
-
-struct _virStorageFileBackend {
-    int type;
-    int protocol;
-
-    /* All storage file callbacks may be omitted if not implemented */
-
-    /* The following group of callbacks is expected to set a libvirt
-     * error on failure. */
-    virStorageFileBackendInit backendInit;
-    virStorageFileBackendDeinit backendDeinit;
-    virStorageFileBackendRead storageFileRead;
-    virStorageFileBackendGetUniqueIdentifier storageFileGetUniqueIdentifier;
-
-    /* The following group of callbacks is expected to set errno
-     * and return -1 on error. No libvirt error shall be reported */
-    virStorageFileBackendCreate storageFileCreate;
-    virStorageFileBackendUnlink storageFileUnlink;
-    virStorageFileBackendStat   storageFileStat;
-    virStorageFileBackendAccess storageFileAccess;
-    virStorageFileBackendChown  storageFileChown;
-};
-
 int virStorageBackendDriversRegister(bool allmodules);
 
 int virStorageBackendRegister(virStorageBackendPtr backend);
-int virStorageBackendFileRegister(virStorageFileBackendPtr backend);
 
 #endif /* __VIR_STORAGE_BACKEND_H__ */
diff --git a/src/storage/storage_backend_fs.c b/src/storage/storage_backend_fs.c
index f54759983c..a1531b8493 100644
--- a/src/storage/storage_backend_fs.c
+++ b/src/storage/storage_backend_fs.c
@@ -37,6 +37,7 @@
 
 #include "virerror.h"
 #include "storage_backend_fs.h"
+#include "storage_source_backend.h"
 #include "storage_util.h"
 #include "storage_conf.h"
 #include "virstoragefile.h"
@@ -918,13 +919,13 @@ virStorageBackendFsRegister(void)
         return -1;
 #endif /* WITH_STORAGE_FS */
 
-    if (virStorageBackendFileRegister(&virStorageFileBackendFile) < 0)
+    if (virStorageFileBackendRegister(&virStorageFileBackendFile) < 0)
         return -1;
 
-    if (virStorageBackendFileRegister(&virStorageFileBackendBlock) < 0)
+    if (virStorageFileBackendRegister(&virStorageFileBackendBlock) < 0)
         return -1;
 
-    if (virStorageBackendFileRegister(&virStorageFileBackendDir) < 0)
+    if (virStorageFileBackendRegister(&virStorageFileBackendDir) < 0)
         return -1;
 
     return 0;
diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c
index 5eea84f16e..c32267875d 100644
--- a/src/storage/storage_backend_gluster.c
+++ b/src/storage/storage_backend_gluster.c
@@ -24,6 +24,7 @@
 #include <glusterfs/api/glfs.h>
 
 #include "storage_backend_gluster.h"
+#include "storage_source_backend.h"
 #include "storage_conf.h"
 #include "viralloc.h"
 #include "virerror.h"
@@ -869,7 +870,7 @@ virStorageBackendGlusterRegister(void)
     if (virStorageBackendRegister(&virStorageBackendGluster) < 0)
         return -1;
 
-    if (virStorageBackendFileRegister(&virStorageFileBackendGluster) < 0)
+    if (virStorageFileBackendRegister(&virStorageFileBackendGluster) < 0)
         return -1;
 
     return 0;
diff --git a/src/storage/storage_source.c b/src/storage/storage_source.c
index 170ab755b7..a5eefe5032 100644
--- a/src/storage/storage_source.c
+++ b/src/storage/storage_source.c
@@ -26,7 +26,7 @@
 
 #include "virerror.h"
 #include "storage_source.h"
-#include "storage_backend.h"
+#include "storage_source_backend.h"
 #include "viralloc.h"
 #include "virlog.h"
 #include "virstring.h"
diff --git a/src/storage/storage_source_backend.c b/src/storage/storage_source_backend.c
new file mode 100644
index 0000000000..e093c04989
--- /dev/null
+++ b/src/storage/storage_source_backend.c
@@ -0,0 +1,108 @@
+/*
+ * storage_source_backend.c: internal storage source backend contract
+ *
+ * Copyright (C) 2007-2018 Red Hat, Inc.
+ * Copyright (C) 2007-2008 Daniel P. Berrange
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Author: Daniel P. Berrange <berrange at redhat.com>
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <sys/stat.h>
+
+#include "datatypes.h"
+#include "virerror.h"
+#include "viralloc.h"
+#include "internal.h"
+#include "storage_source_backend.h"
+#include "virlog.h"
+#include "virfile.h"
+#include "configmake.h"
+
+#define VIR_FROM_THIS VIR_FROM_STORAGE
+
+VIR_LOG_INIT("storage.storage_source_backend");
+
+#define VIR_STORAGE_BACKENDS_MAX 20
+
+static virStorageFileBackendPtr virStorageFileBackends[VIR_STORAGE_BACKENDS_MAX];
+static size_t virStorageFileBackendsCount;
+
+
+int
+virStorageFileBackendRegister(virStorageFileBackendPtr backend)
+{
+    VIR_DEBUG("Registering storage file backend '%s' protocol '%s'",
+              virStorageTypeToString(backend->type),
+              virStorageNetProtocolTypeToString(backend->protocol));
+
+    if (virStorageFileBackendsCount >= VIR_STORAGE_BACKENDS_MAX) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("Too many drivers, cannot register storage file "
+                         "backend '%s'"),
+                       virStorageTypeToString(backend->type));
+        return -1;
+    }
+
+    virStorageFileBackends[virStorageFileBackendsCount] = backend;
+    virStorageFileBackendsCount++;
+    return 0;
+}
+
+virStorageFileBackendPtr
+virStorageFileBackendForTypeInternal(int type,
+                                     int protocol,
+                                     bool report)
+{
+    size_t i;
+
+    for (i = 0; i < virStorageFileBackendsCount; i++) {
+        if (virStorageFileBackends[i]->type == type) {
+            if (type == VIR_STORAGE_TYPE_NETWORK &&
+                virStorageFileBackends[i]->protocol != protocol)
+                continue;
+
+            return virStorageFileBackends[i];
+        }
+    }
+
+    if (!report)
+        return NULL;
+
+    if (type == VIR_STORAGE_TYPE_NETWORK) {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("missing storage backend for network files "
+                         "using %s protocol"),
+                       virStorageNetProtocolTypeToString(protocol));
+    } else {
+        virReportError(VIR_ERR_INTERNAL_ERROR,
+                       _("missing storage backend for '%s' storage"),
+                       virStorageTypeToString(type));
+    }
+
+    return NULL;
+}
+
+
+virStorageFileBackendPtr
+virStorageFileBackendForType(int type,
+                             int protocol)
+{
+    return virStorageFileBackendForTypeInternal(type, protocol, true);
+}
diff --git a/src/storage/storage_source_backend.h b/src/storage/storage_source_backend.h
new file mode 100644
index 0000000000..3af2a5f380
--- /dev/null
+++ b/src/storage/storage_source_backend.h
@@ -0,0 +1,104 @@
+/*
+ * storage_source_backend.h: internal storage source backend contract
+ *
+ * Copyright (C) 2007-2018 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef __VIR_STORAGE_SOURCE_BACKEND_H__
+# define __VIR_STORAGE_SOURCE_BACKEND_H__
+
+# include <sys/stat.h>
+
+# include "virstoragefile.h"
+
+/* ------- virStorageFile backends ------------ */
+typedef struct _virStorageFileBackend virStorageFileBackend;
+typedef virStorageFileBackend *virStorageFileBackendPtr;
+
+struct _virStorageDriverData {
+    virStorageFileBackendPtr backend;
+    void *priv;
+
+    uid_t uid;
+    gid_t gid;
+};
+
+typedef int
+(*virStorageFileBackendInit)(virStorageSourcePtr src);
+
+typedef void
+(*virStorageFileBackendDeinit)(virStorageSourcePtr src);
+
+typedef int
+(*virStorageFileBackendCreate)(virStorageSourcePtr src);
+
+typedef int
+(*virStorageFileBackendUnlink)(virStorageSourcePtr src);
+
+typedef int
+(*virStorageFileBackendStat)(virStorageSourcePtr src,
+                             struct stat *st);
+
+typedef ssize_t
+(*virStorageFileBackendRead)(virStorageSourcePtr src,
+                             size_t offset,
+                             size_t len,
+                             char **buf);
+
+typedef const char *
+(*virStorageFileBackendGetUniqueIdentifier)(virStorageSourcePtr src);
+
+typedef int
+(*virStorageFileBackendAccess)(virStorageSourcePtr src,
+                               int mode);
+
+typedef int
+(*virStorageFileBackendChown)(const virStorageSource *src,
+                              uid_t uid,
+                              gid_t gid);
+
+virStorageFileBackendPtr virStorageFileBackendForType(int type, int protocol);
+virStorageFileBackendPtr virStorageFileBackendForTypeInternal(int type,
+                                                              int protocol,
+                                                              bool report);
+
+
+struct _virStorageFileBackend {
+    int type;
+    int protocol;
+
+    /* All storage file callbacks may be omitted if not implemented */
+
+    /* The following group of callbacks is expected to set a libvirt
+     * error on failure. */
+    virStorageFileBackendInit backendInit;
+    virStorageFileBackendDeinit backendDeinit;
+    virStorageFileBackendRead storageFileRead;
+    virStorageFileBackendGetUniqueIdentifier storageFileGetUniqueIdentifier;
+
+    /* The following group of callbacks is expected to set errno
+     * and return -1 on error. No libvirt error shall be reported */
+    virStorageFileBackendCreate storageFileCreate;
+    virStorageFileBackendUnlink storageFileUnlink;
+    virStorageFileBackendStat   storageFileStat;
+    virStorageFileBackendAccess storageFileAccess;
+    virStorageFileBackendChown  storageFileChown;
+};
+
+int virStorageFileBackendRegister(virStorageFileBackendPtr backend);
+
+#endif /* __VIR_STORAGE_SOURCE_BACKEND_H__ */
-- 
2.14.3




More information about the libvir-list mailing list