[libvirt] [PATCH RFC 23/27] storage: Add internal API to create temporary storage pools and vols

Peter Krempa pkrempa at redhat.com
Mon Dec 16 16:32:51 UTC 2013


If a VM driver wants to access stuff provided by a storage driver the
volume needs to be a part of a storage pool. As this wasn't designed in
from the beginning we need a way to convert generic domain disk and
snapshot disk definitions into temporary pools and volumes. This patch
allows that by adding private storage driver APIs that can be used to
obtain a pool and vol definition.
---
 docs/hvsupport.pl        |  3 ++
 src/Makefile.am          |  3 +-
 src/check-drivername.pl  |  1 +
 src/driver.h             | 13 +++++++++
 src/libvirt_internal.c   | 71 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/libvirt_internal.h   | 22 +++++++++++++++
 src/libvirt_private.syms |  3 ++
 7 files changed, 115 insertions(+), 1 deletion(-)
 create mode 100644 src/libvirt_internal.c

diff --git a/docs/hvsupport.pl b/docs/hvsupport.pl
index f8483f9..a7d1f6b 100755
--- a/docs/hvsupport.pl
+++ b/docs/hvsupport.pl
@@ -176,6 +176,9 @@ $apis{virDomainMigratePerform3Params} = "1.1.0";
 $apis{virDomainMigrateFinish3Params} = "1.1.0";
 $apis{virDomainMigrateConfirm3Params} = "1.1.0";

+$apis{virStorageEphemeralFree} = "1.2.1";
+$apis{virStorageEphemeralFromDiskDef} = "1.2.1";
+$apis{virStorageEphemeralFromSnapshotDiskDef} = "1.2.1";


 # Now we want to get the mapping between public APIs
diff --git a/src/Makefile.am b/src/Makefile.am
index 57e163f..c0c535d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -176,7 +176,8 @@ DRIVER_SOURCES =							\
 		$(DATATYPES_SOURCES)					\
 		fdstream.c fdstream.h					\
 		$(NODE_INFO_SOURCES)					\
-		libvirt.c libvirt_internal.h				\
+		libvirt.c					\
+		libvirt_internal.c libvirt_internal.h				\
 		locking/lock_manager.c locking/lock_manager.h		\
 		locking/lock_driver.h					\
 		locking/lock_driver_nop.h locking/lock_driver_nop.c	\
diff --git a/src/check-drivername.pl b/src/check-drivername.pl
index 5c8de0a..50b3480 100755
--- a/src/check-drivername.pl
+++ b/src/check-drivername.pl
@@ -50,6 +50,7 @@ while (<DRVFILE>) {

         next if $drv =~ /virDrvState/;
         next if $drv =~ /virDrvDomainMigrate(Prepare|Perform|Confirm|Begin|Finish)/;
+        next if $drv =~ /virDrvStorageEphemeral/;

         my $sym = $drv;
         $sym =~ s/virDrv/vir/;
diff --git a/src/driver.h b/src/driver.h
index 5f4cd8d..b72c5e9 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -1754,6 +1754,16 @@ typedef int
 typedef int
 (*virDrvStoragePoolIsPersistent)(virStoragePoolPtr pool);

+typedef void
+(*virDrvStorageEphemeralFree)(virStorageEphemeralPtr def);
+
+typedef virStorageEphemeralPtr
+(*virDrvStorageEphemeralFromDiskDef)(virConnectPtr conn,
+                                     virDomainDiskDefPtr def);
+
+typedef virStorageEphemeralPtr
+(*virDrvStorageEphemeralFromSnapshotDiskDef)(virConnectPtr conn,
+                                             virDomainSnapshotDiskDefPtr def);


 typedef struct _virStorageDriver virStorageDriver;
@@ -1813,6 +1823,9 @@ struct _virStorageDriver {
     virDrvStorageVolResize storageVolResize;
     virDrvStoragePoolIsActive storagePoolIsActive;
     virDrvStoragePoolIsPersistent storagePoolIsPersistent;
+    virDrvStorageEphemeralFree storageEphemeralFree;
+    virDrvStorageEphemeralFromDiskDef storageEphemeralFromDiskDef;
+    virDrvStorageEphemeralFromSnapshotDiskDef storageEphemeralFromSnapshotDiskDef;
 };

 # ifdef WITH_LIBVIRTD
diff --git a/src/libvirt_internal.c b/src/libvirt_internal.c
new file mode 100644
index 0000000..ea10885
--- /dev/null
+++ b/src/libvirt_internal.c
@@ -0,0 +1,71 @@
+/*
+ * libvirt_internal.c: internally exported APIs, not for public use
+ *
+ * Copyright (C) 2013 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/>.
+ */
+
+#include <config.h>
+#include "libvirt_internal.h"
+
+#include "datatypes.h"
+#include "viralloc.h"
+
+#define VIR_FROM_THIS VIR_FROM_NONE
+
+void
+virStorageEphemeralFree(virStorageEphemeralPtr def)
+{
+    if (!def)
+        return;
+
+    if (!def->pool) {
+        VIR_FREE(def);
+        return;
+    }
+
+    if (def->pool->conn->storageDriver->storageEphemeralFree) {
+        def->pool->conn->storageDriver->storageEphemeralFree(def);
+        return;
+    }
+
+    return;
+}
+
+
+virStorageEphemeralPtr
+virStorageEphemeralFromDiskDef(virConnectPtr conn,
+                               virDomainDiskDefPtr def)
+{
+    if (conn->storageDriver->storageEphemeralFromDiskDef)
+        return conn->storageDriver->storageEphemeralFromDiskDef(conn, def);
+
+    virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+    return NULL;
+}
+
+
+virStorageEphemeralPtr
+virStorageEphemeralFromSnapshotDiskDef(virConnectPtr conn,
+                                       virDomainSnapshotDiskDefPtr def)
+{
+    if (conn->storageDriver->storageEphemeralFromSnapshotDiskDef)
+        return conn->storageDriver->storageEphemeralFromSnapshotDiskDef(conn, def);
+
+    virReportError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
+    return NULL;
+
+}
diff --git a/src/libvirt_internal.h b/src/libvirt_internal.h
index 115d8d1..0db46d8 100644
--- a/src/libvirt_internal.h
+++ b/src/libvirt_internal.h
@@ -27,6 +27,9 @@

 # include "internal.h"

+# include "conf/domain_conf.h"
+# include "conf/snapshot_conf.h"
+
 typedef void (*virStateInhibitCallback)(bool inhibit,
                                         void *opaque);

@@ -280,4 +283,23 @@ int virDomainMigrateConfirm3Params(virDomainPtr domain,
                                    int cookieinlen,
                                    unsigned int flags,
                                    int cancelled);
+
+/* storage related internal stuff */
+typedef struct _virStorageEphemeral virStorageEphemeral;
+typedef virStorageEphemeral *virStorageEphemeralPtr;
+
+struct _virStorageEphemeral
+{
+    bool existing;
+    virStorageVolPtr vol;
+    virStoragePoolPtr pool;
+};
+
+void virStorageEphemeralFree(virStorageEphemeralPtr def);
+
+virStorageEphemeralPtr virStorageEphemeralFromDiskDef(virConnectPtr conn,
+                                                      virDomainDiskDefPtr def);
+
+virStorageEphemeralPtr virStorageEphemeralFromSnapshotDiskDef(virConnectPtr conn,
+                                                              virDomainSnapshotDiskDefPtr def);
 #endif
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 2dbb8f8..7c75531 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -811,6 +811,9 @@ virRegisterNodeDeviceDriver;
 virRegisterNWFilterDriver;
 virRegisterSecretDriver;
 virRegisterStorageDriver;
+virStorageEphemeralFree;
+virStorageEphemeralFromDiskDef;
+virStorageEphemeralFromSnapshotDiskDef;


 # locking/domain_lock.h
-- 
1.8.5.1




More information about the libvir-list mailing list