]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
storage: initial support for linking with libgfapi
authorEric Blake <eblake@redhat.com>
Tue, 19 Nov 2013 23:26:05 +0000 (16:26 -0700)
committerEric Blake <eblake@redhat.com>
Mon, 25 Nov 2013 18:02:52 +0000 (11:02 -0700)
We support gluster volumes in domain XML, so we also ought to
support them as a storage pool.  Besides, a future patch will
want to take advantage of libgfapi to handle the case of a
gluster device holding qcow2 rather than raw storage, and for
that to work, we need a storage backend that can read gluster
storage volume contents.  This sets up the framework.

Note that the new pool is named 'gluster' to match a
<disk type='network'><source protocol='gluster'> image source
already supported in a <domain>; it does NOT match the
<pool type='netfs'><source><target type='glusterfs'>,
since that uses a FUSE mount to a local file name rather than
a network name.

This and subsequent patches have been tested against glusterfs
3.4.1 (available on Fedora 19); there are likely bugs in older
versions that may prevent decent use of gfapi, so this patch
enforces the minimum version tested.  A future patch may lower
the minimum.  On the other hand, I hit at least two bugs in
3.4.1 that will be fixed in 3.5/3.4.2, where it might be worth
raising the minimum: glfs_readdir is nicer to use than
glfs_readdir_r [1], and glfs_fini should only return failure on
an actual failure [2].

[1] http://lists.gnu.org/archive/html/gluster-devel/2013-10/msg00085.html
[2] http://lists.gnu.org/archive/html/gluster-devel/2013-10/msg00086.html

* configure.ac (WITH_STORAGE_GLUSTER): New conditional.
* m4/virt-gluster.m4: new file.
* libvirt.spec.in (BuildRequires): Support gluster in spec file.
* src/conf/storage_conf.h (VIR_STORAGE_POOL_GLUSTER): New pool
type.
* src/conf/storage_conf.c (poolTypeInfo): Treat similar to
sheepdog and rbd.
(virStoragePoolDefFormat): Don't output target for gluster.
* src/storage/storage_backend_gluster.h: New file.
* src/storage/storage_backend_gluster.c: Likewise.
* po/POTFILES.in: Add new file.
* src/storage/storage_backend.c (backends): Register new type.
* src/Makefile.am (STORAGE_DRIVER_GLUSTER_SOURCES): Build new files.
* src/storage/storage_backend.h (_virStorageBackend): Documet
assumption.

Signed-off-by: Eric Blake <eblake@redhat.com>
configure.ac
libvirt.spec.in
m4/virt-gluster.m4 [new file with mode: 0644]
po/POTFILES.in
src/Makefile.am
src/conf/storage_conf.c
src/conf/storage_conf.h
src/storage/storage_backend.c
src/storage/storage_backend.h
src/storage/storage_backend_gluster.c [new file with mode: 0644]
src/storage/storage_backend_gluster.h [new file with mode: 0644]

index a021fcff9c61ca2940591e482048af1711ac4980..4942e0766557be3b5d67095fe0e9e4368ec76afb 100644 (file)
@@ -228,6 +228,7 @@ LIBVIRT_CHECK_CAPNG
 LIBVIRT_CHECK_CURL
 LIBVIRT_CHECK_DBUS
 LIBVIRT_CHECK_FUSE
+LIBVIRT_CHECK_GLUSTER
 LIBVIRT_CHECK_HAL
 LIBVIRT_CHECK_NETCF
 LIBVIRT_CHECK_NUMACTL
@@ -1643,6 +1644,10 @@ AC_ARG_WITH([storage-sheepdog],
   [AS_HELP_STRING([--with-storage-sheepdog],
     [with Sheepdog backend for the storage driver @<:@default=check@:>@])],
   [],[with_storage_sheepdog=check])
+AC_ARG_WITH([storage-gluster],
+  [AS_HELP_STRING([--with-storage-gluster],
+    [with Gluster backend for the storage driver @<:@default=check@:>@])],
+  [],[with_storage_gluster=check])
 
 if test "$with_libvirtd" = "no"; then
   with_storage_dir=no
@@ -1654,6 +1659,7 @@ if test "$with_libvirtd" = "no"; then
   with_storage_disk=no
   with_storage_rbd=no
   with_storage_sheepdog=no
+  with_storage_gluster=no
 fi
 if test "$with_storage_dir" = "yes" ; then
   AC_DEFINE_UNQUOTED([WITH_STORAGE_DIR], 1, [whether directory backend for storage driver is enabled])
@@ -1855,6 +1861,19 @@ fi
 AM_CONDITIONAL([WITH_STORAGE_SHEEPDOG],
   [test "$with_storage_sheepdog" = "yes"])
 
+LIBGLUSTER_LIBS=
+if test "$with_storage_gluster" = "check"; then
+  with_storage_gluster=$with_glusterfs
+fi
+if test "$with_storage_gluster" = "yes"; then
+  if test "$with_glusterfs" = no; then
+    AC_MSG_ERROR([Need glusterfs (libgfapi) for gluster storage driver])
+  fi
+  AC_DEFINE_UNQUOTED([WITH_STORAGE_GLUSTER], [1],
+    [whether Gluster backend for storage driver is enabled])
+fi
+AM_CONDITIONAL([WITH_STORAGE_GLUSTER], [test "$with_storage_gluster" = "yes"])
+
 
 LIBPARTED_CFLAGS=
 LIBPARTED_LIBS=
@@ -2583,6 +2602,7 @@ AC_MSG_NOTICE([   mpath: $with_storage_mpath])
 AC_MSG_NOTICE([    Disk: $with_storage_disk])
 AC_MSG_NOTICE([     RBD: $with_storage_rbd])
 AC_MSG_NOTICE([Sheepdog: $with_storage_sheepdog])
+AC_MSG_NOTICE([ Gluster: $with_storage_gluster])
 AC_MSG_NOTICE([])
 AC_MSG_NOTICE([Security Drivers])
 AC_MSG_NOTICE([])
@@ -2608,6 +2628,7 @@ LIBVIRT_RESULT_CAPNG
 LIBVIRT_RESULT_CURL
 LIBVIRT_RESULT_DBUS
 LIBVIRT_RESULT_FUSE
+LIBVIRT_RESULT_GLUSTER
 LIBVIRT_RESULT_HAL
 LIBVIRT_RESULT_NETCF
 LIBVIRT_RESULT_NUMACTL
index f90bf6bd9e38cf3453e00ec2fb3b8682af402b6f..a830cf160453444e3a34f7ee85cd325bbeccf261 100644 (file)
 %else
     %define with_storage_sheepdog 0
 %endif
+%if 0%{?fedora} >= 19
+    %define with_storage_gluster 0%{!?_without_storage_gluster:%{server_drivers}}
+%else
+    %define with_storage_gluster 0
+%endif
 %define with_numactl          0%{!?_without_numactl:%{server_drivers}}
 %define with_selinux          0%{!?_without_selinux:%{server_drivers}}
 
     %define with_storage_mpath 0
     %define with_storage_rbd 0
     %define with_storage_sheepdog 0
+    %define with_storage_gluster 0
     %define with_storage_disk 0
 %endif
 
@@ -554,6 +560,10 @@ BuildRequires: device-mapper-devel
 BuildRequires: ceph-devel
     %endif
 %endif
+%if %{with_storage_gluster}
+BuildRequires: glusterfs-api-devel >= 3.4.1
+BuildRequires: glusterfs-devel >= 3.4.1
+%endif
 %if %{with_numactl}
 # For QEMU/LXC numa info
 BuildRequires: numactl-devel
@@ -1256,6 +1266,10 @@ driver
     %define _without_storage_sheepdog --without-storage-sheepdog
 %endif
 
+%if ! %{with_storage_gluster}
+    %define _without_storage_gluster --without-storage-gluster
+%endif
+
 %if ! %{with_numactl}
     %define _without_numactl --without-numactl
 %endif
@@ -1377,6 +1391,7 @@ driver
            %{?_without_storage_mpath} \
            %{?_without_storage_rbd} \
            %{?_without_storage_sheepdog} \
+           %{?_without_storage_gluster} \
            %{?_without_numactl} \
            %{?_without_numad} \
            %{?_without_capng} \
diff --git a/m4/virt-gluster.m4 b/m4/virt-gluster.m4
new file mode 100644 (file)
index 0000000..5a4a263
--- /dev/null
@@ -0,0 +1,28 @@
+dnl The gluster libgfapi.so library
+dnl
+dnl Copyright (C) 2013 Red Hat, Inc.
+dnl
+dnl This library is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Lesser General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2.1 of the License, or (at your option) any later version.
+dnl
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+dnl Lesser General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU Lesser General Public
+dnl License along with this library.  If not, see
+dnl <http://www.gnu.org/licenses/>.
+dnl
+
+dnl Currently tested against Fedora 19 with glusterfs 3.4.1; earlier
+dnl versions may be possible but only with further testing
+AC_DEFUN([LIBVIRT_CHECK_GLUSTER],[
+  LIBVIRT_CHECK_PKG([GLUSTERFS], [glusterfs-api], [3.4.1])
+])
+
+AC_DEFUN([LIBVIRT_RESULT_GLUSTER],[
+  LIBVIRT_RESULT_LIB([GLUSTERFS])
+])
index 15afdecf005ef7169e6fbce6eae7a116dfa1c7eb..0835b52dd56deec0c864dcf15177f0cd45ebd3f3 100644 (file)
@@ -133,6 +133,7 @@ src/storage/parthelper.c
 src/storage/storage_backend.c
 src/storage/storage_backend_disk.c
 src/storage/storage_backend_fs.c
+src/storage/storage_backend_gluster.c
 src/storage/storage_backend_iscsi.c
 src/storage/storage_backend_logical.c
 src/storage/storage_backend_mpath.c
index e8bc0fee5168ffe37161fd878639f643c5228593..87f510123e451d67a15e45c3925989c726005f81 100644 (file)
@@ -820,6 +820,9 @@ STORAGE_DRIVER_RBD_SOURCES =                                        \
 STORAGE_DRIVER_SHEEPDOG_SOURCES =                              \
                storage/storage_backend_sheepdog.h storage/storage_backend_sheepdog.c
 
+STORAGE_DRIVER_GLUSTER_SOURCES =                               \
+               storage/storage_backend_gluster.h storage/storage_backend_gluster.c
+
 STORAGE_HELPER_DISK_SOURCES =                                  \
                storage/parthelper.c
 
@@ -1435,6 +1438,12 @@ if WITH_STORAGE_SHEEPDOG
 libvirt_driver_storage_impl_la_SOURCES += $(STORAGE_DRIVER_SHEEPDOG_SOURCES)
 endif WITH_STORAGE_SHEEPDOG
 
+if WITH_STORAGE_GLUSTER
+libvirt_driver_storage_impl_la_SOURCES += $(STORAGE_DRIVER_GLUSTER_SOURCES)
+libvirt_driver_storage_impl_la_CFLAGS += $(GLUSTERFS_CFLAGS)
+libvirt_driver_storage_impl_la_LIBADD += $(GLUSTERFS_LIBS)
+endif WITH_STORAGE_GLUSTER
+
 if WITH_NODE_DEVICES
 # Needed to keep automake quiet about conditionals
 if WITH_DRIVER_MODULES
@@ -1635,6 +1644,7 @@ EXTRA_DIST +=                                                     \
                $(STORAGE_DRIVER_DISK_SOURCES)                  \
                $(STORAGE_DRIVER_RBD_SOURCES)                   \
                $(STORAGE_DRIVER_SHEEPDOG_SOURCES)              \
+               $(STORAGE_DRIVER_GLUSTER_SOURCES)               \
                $(NODE_DEVICE_DRIVER_SOURCES)                   \
                $(NODE_DEVICE_DRIVER_HAL_SOURCES)               \
                $(NODE_DEVICE_DRIVER_UDEV_SOURCES)              \
index 0cd80c32c491bfdeda8fbd61701ddc262a4bb36f..e675777432ef40d2992a0d28588aafdfd25dd745 100644 (file)
@@ -59,7 +59,7 @@ VIR_ENUM_IMPL(virStoragePool,
               VIR_STORAGE_POOL_LAST,
               "dir", "fs", "netfs",
               "logical", "disk", "iscsi",
-              "scsi", "mpath", "rbd", "sheepdog")
+              "scsi", "mpath", "rbd", "sheepdog", "gluster")
 
 VIR_ENUM_IMPL(virStoragePoolFormatFileSystem,
               VIR_STORAGE_POOL_FS_LAST,
@@ -248,6 +248,19 @@ static virStoragePoolTypeInfo poolTypeInfo[] = {
          .formatToString = virStoragePoolFormatDiskTypeToString,
      }
     },
+    {.poolType = VIR_STORAGE_POOL_GLUSTER,
+     .poolOptions = {
+         .flags = (VIR_STORAGE_POOL_SOURCE_HOST |
+                   VIR_STORAGE_POOL_SOURCE_NETWORK |
+                   VIR_STORAGE_POOL_SOURCE_NAME |
+                   VIR_STORAGE_POOL_SOURCE_DIR),
+     },
+     .volOptions = {
+         .defaultFormat = VIR_STORAGE_FILE_RAW,
+         .formatToString = virStorageFileFormatTypeToString,
+         .formatFromString = virStorageVolumeFormatFromString,
+     }
+    },
     {.poolType = VIR_STORAGE_POOL_MPATH,
      .volOptions = {
          .formatToString = virStoragePoolFormatDiskTypeToString,
@@ -652,6 +665,10 @@ virStoragePoolDefParseSource(xmlXPathContextPtr ctxt,
     }
 
     source->dir = virXPathString("string(./dir/@path)", ctxt);
+    /* In gluster, a missing dir defaults to "/" */
+    if (!source->dir && pool_type == VIR_STORAGE_POOL_GLUSTER &&
+        VIR_STRDUP(source->dir, "/") < 0)
+        goto cleanup;
 
     if ((adapter_type = virXPathString("string(./adapter/@type)", ctxt))) {
         if ((source->adapter.type =
@@ -1196,10 +1213,11 @@ virStoragePoolDefFormat(virStoragePoolDefPtr def)
     if (virStoragePoolSourceFormat(&buf, options, &def->source) < 0)
         goto cleanup;
 
-    /* RBD and Sheepdog devices are not local block devs nor files, so it
-     * doesn't have a target */
+    /* RBD, Sheepdog, and Gluster devices are not local block devs nor
+     * files, so they don't have a target */
     if (def->type != VIR_STORAGE_POOL_RBD &&
-        def->type != VIR_STORAGE_POOL_SHEEPDOG) {
+        def->type != VIR_STORAGE_POOL_SHEEPDOG &&
+        def->type != VIR_STORAGE_POOL_GLUSTER) {
         virBufferAddLit(&buf, "  <target>\n");
 
         virBufferEscapeString(&buf, "    <path>%s</path>\n", def->target.path);
index c4dd403459239b4b86fa88576a7df6ef6d3402d4..f8a7eec140f0b422bc5397004cc3b9a52d7a1eaf 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * storage_conf.h: config handling for storage driver
  *
- * Copyright (C) 2006-2008, 2010-2012 Red Hat, Inc.
+ * Copyright (C) 2006-2008, 2010-2013 Red Hat, Inc.
  * Copyright (C) 2006-2008 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -129,6 +129,7 @@ enum virStoragePoolType {
     VIR_STORAGE_POOL_MPATH,    /* Multipath devices */
     VIR_STORAGE_POOL_RBD,      /* RADOS Block Device */
     VIR_STORAGE_POOL_SHEEPDOG, /* Sheepdog device */
+    VIR_STORAGE_POOL_GLUSTER,  /* Gluster device */
 
     VIR_STORAGE_POOL_LAST,
 };
index 1e3292b95f3754f97fb9017065b7470ac8917d2d..c94e89a86feed8c039b22df44f2c0ca38b13253b 100644 (file)
@@ -80,6 +80,9 @@
 #if WITH_STORAGE_SHEEPDOG
 # include "storage_backend_sheepdog.h"
 #endif
+#if WITH_STORAGE_GLUSTER
+# include "storage_backend_gluster.h"
+#endif
 
 #define VIR_FROM_THIS VIR_FROM_STORAGE
 
@@ -111,6 +114,9 @@ static virStorageBackendPtr backends[] = {
 #endif
 #if WITH_STORAGE_SHEEPDOG
     &virStorageBackendSheepdog,
+#endif
+#if WITH_STORAGE_GLUSTER
+    &virStorageBackendGluster,
 #endif
     NULL
 };
index d8d3097283343fd5b943d1be224f26d383168bbd..9e07dd81c470623b9aa61c56adfaeaeddbe53e8b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * storage_backend.h: internal storage driver backend contract
  *
- * Copyright (C) 2007-2010, 2012 Red Hat, Inc.
+ * Copyright (C) 2007-2010, 2012-2013 Red Hat, Inc.
  * Copyright (C) 2007-2008 Daniel P. Berrange
  *
  * This library is free software; you can redistribute it and/or
@@ -70,6 +70,8 @@ virStorageBackendFSImageToolTypeToFunc(int tool_type);
 typedef struct _virStorageBackend virStorageBackend;
 typedef virStorageBackend *virStorageBackendPtr;
 
+/* Callbacks are optional unless documented otherwise; but adding more
+ * callbacks provides better pool support.  */
 struct _virStorageBackend {
     int type;
 
@@ -77,7 +79,7 @@ struct _virStorageBackend {
     virStorageBackendCheckPool checkPool;
     virStorageBackendStartPool startPool;
     virStorageBackendBuildPool buildPool;
-    virStorageBackendRefreshPool refreshPool;
+    virStorageBackendRefreshPool refreshPool; /* Must be non-NULL */
     virStorageBackendStopPool stopPool;
     virStorageBackendDeletePool deletePool;
 
diff --git a/src/storage/storage_backend_gluster.c b/src/storage/storage_backend_gluster.c
new file mode 100644 (file)
index 0000000..2863c73
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * storage_backend_gluster.c: storage backend for Gluster handling
+ *
+ * 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 <glusterfs/api/glfs.h>
+
+#include "virerror.h"
+#include "storage_backend_gluster.h"
+#include "storage_conf.h"
+
+#define VIR_FROM_THIS VIR_FROM_STORAGE
+
+
+static int
+virStorageBackendGlusterRefreshPool(virConnectPtr conn ATTRIBUTE_UNUSED,
+                                    virStoragePoolObjPtr pool ATTRIBUTE_UNUSED)
+{
+    virReportError(VIR_ERR_NO_SUPPORT, "%s",
+                   _("gluster pool type not fully supported yet"));
+    return -1;
+}
+
+virStorageBackend virStorageBackendGluster = {
+    .type = VIR_STORAGE_POOL_GLUSTER,
+
+    .refreshPool = virStorageBackendGlusterRefreshPool,
+};
diff --git a/src/storage/storage_backend_gluster.h b/src/storage/storage_backend_gluster.h
new file mode 100644 (file)
index 0000000..b21bda7
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * storage_backend_gluster.h: storage backend for Gluster handling
+ *
+ * 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/>.
+ *
+ */
+
+#ifndef __VIR_STORAGE_BACKEND_GLUSTER_H__
+# define __VIR_STORAGE_BACKEND_GLUSTER_H__
+
+# include "storage_backend.h"
+
+extern virStorageBackend virStorageBackendGluster;
+
+#endif /* __VIR_STORAGE_BACKEND_GLUSTER_H__ */