diff --git a/configure.ac b/configure.ac
index a021fcff9c..4942e07665 100644
--- a/configure.ac
+++ b/configure.ac
@@ -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
diff --git a/libvirt.spec.in b/libvirt.spec.in
index f90bf6bd9e..a830cf1604 100644
--- a/libvirt.spec.in
+++ b/libvirt.spec.in
@@ -98,6 +98,11 @@
%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}}
@@ -280,6 +285,7 @@
%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
index 0000000000..5a4a263c9e
--- /dev/null
+++ b/m4/virt-gluster.m4
@@ -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 .
+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])
+])
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 15afdecf00..0835b52dd5 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -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
diff --git a/src/Makefile.am b/src/Makefile.am
index e8bc0fee51..87f510123e 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -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) \
diff --git a/src/conf/storage_conf.c b/src/conf/storage_conf.c
index 0cd80c32c4..e675777432 100644
--- a/src/conf/storage_conf.c
+++ b/src/conf/storage_conf.c
@@ -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, " \n");
virBufferEscapeString(&buf, " %s\n", def->target.path);
diff --git a/src/conf/storage_conf.h b/src/conf/storage_conf.h
index c4dd403459..f8a7eec140 100644
--- a/src/conf/storage_conf.h
+++ b/src/conf/storage_conf.h
@@ -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,
};
diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index 1e3292b95f..c94e89a86f 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -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
};
diff --git a/src/storage/storage_backend.h b/src/storage/storage_backend.h
index d8d3097283..9e07dd81c4 100644
--- a/src/storage/storage_backend.h
+++ b/src/storage/storage_backend.h
@@ -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
index 0000000000..2863c7326f
--- /dev/null
+++ b/src/storage/storage_backend_gluster.c
@@ -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
+ * .
+ *
+ */
+
+#include
+
+#include
+
+#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
index 0000000000..b21bda7337
--- /dev/null
+++ b/src/storage/storage_backend_gluster.h
@@ -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
+ * .
+ *
+ */
+
+#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__ */