[PATCH 2/2] vfs_glusterfs: Samba VFS module for glusterfs
Volker Lendecke
Volker.Lendecke at SerNet.DE
Thu Apr 25 03:32:31 MDT 2013
On Wed, Apr 24, 2013 at 08:28:18AM +0000, Anand Avati wrote:
> Implement a Samba VFS plugin for glusterfs based on gluster's gfapi.
> This is a "bottom" vfs plugin (not something to be stacked on top of
> another module), and translates (most) calls into closest actions
> on gfapi.
>
> Signed-off-by: Anand Avati <avati at redhat.com>
> ---
> source3/Makefile.in | 5 +
> source3/configure.in | 9 +
> source3/modules/vfs_glusterfs.c | 1186 +++++++++++++++++++++++++++++++++++++++
> source3/modules/wscript_build | 9 +
> source3/wscript | 6 +
> 5 files changed, 1215 insertions(+), 0 deletions(-)
> create mode 100644 source3/modules/vfs_glusterfs.c
>
> diff --git a/source3/Makefile.in b/source3/Makefile.in
> index a868685..f199300 100644
> --- a/source3/Makefile.in
> +++ b/source3/Makefile.in
> @@ -913,6 +913,7 @@ VFS_LINUX_XFS_SGID_OBJ = modules/vfs_linux_xfs_sgid.o
> VFS_TIME_AUDIT_OBJ = modules/vfs_time_audit.o
> VFS_MEDIA_HARMONY_OBJ = modules/vfs_media_harmony.o
> VFS_BTRFS_OBJ = modules/vfs_btrfs.o
> +VFS_GLUSTERFS_OBJ = modules/vfs_glusterfs.o
>
> PAM_ERRORS_OBJ = ../libcli/auth/pam_errors.o
> PLAINTEXT_AUTH_OBJ = auth/pampass.o auth/pass_check.o $(PAM_ERRORS_OBJ)
> @@ -2965,6 +2966,10 @@ bin/btrfs. at SHLIBEXT@: $(BINARY_PREREQS) $(VFS_BTRFS_OBJ)
> @echo "Building plugin $@"
> @$(SHLD_MODULE) $(VFS_BTRFS_OBJ)
>
> +bin/glusterfs. at SHLIBEXT@: $(BINARY_PREREQS) $(VFS_GLUSTERFS_OBJ)
> + @echo "Building plugin $@"
> + $(SHLD_MODULE) $(VFS_GLUSTERFS_OBJ)
> +
> #########################################################
> ## IdMap NSS plugins
>
> diff --git a/source3/configure.in b/source3/configure.in
> index 88c71d4..101db89 100644
> --- a/source3/configure.in
> +++ b/source3/configure.in
> @@ -1023,6 +1023,14 @@ if test x"$ac_cv_header_gpfs_gpl_h" = x"yes"; then
> default_shared_modules="$default_shared_modules vfs_gpfs"
> fi
>
> +PKG_CHECK_MODULES([GLFS], [glusterfs-api >= 3], glfs_found=yes, glfs_found=no)
> +if test "x$glfs_found" = "xyes"; then
> + CFLAGS="$CFLAGS $GLFS_CFLAGS"
> + LDFLAGS="$LDFLAGS $GLFS_LDFLAGS"
> + LIBS="$LIBS $GLFS_LIBS"
> + default_shared_modules="$default_shared_modules vfs_glusterfs"
> +fi
> +
> # Note that all the libunwind symbols in the API are defined to internal
> # platform-specific version, so we must include libunwind.h before checking
> # any of them.
> @@ -6455,6 +6463,7 @@ SMB_MODULE(vfs_linux_xfs_sgid, \$(VFS_LINUX_XFS_SGID_OBJ), "bin/linux_xfs_sgid.$
> SMB_MODULE(vfs_time_audit, \$(VFS_TIME_AUDIT_OBJ), "bin/time_audit.$SHLIBEXT", VFS)
> SMB_MODULE(vfs_media_harmony, \$(VFS_MEDIA_HARMONY_OBJ), "bin/media_harmony.$SHLIBEXT", VFS)
> SMB_MODULE(vfs_btrfs, \$(VFS_BTRFS_OBJ), "bin/btrfs.$SHLIBEXT", VFS)
> +SMB_MODULE(vfs_glusterfs, \$(VFS_GLUSTERFS_OBJ), "bin/glusterfs.$SHLIBEXT", VFS)
>
> SMB_SUBSYSTEM(VFS,smbd/vfs.o)
>
> diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
> new file mode 100644
> index 0000000..1dc9c87
> --- /dev/null
> +++ b/source3/modules/vfs_glusterfs.c
> @@ -0,0 +1,1186 @@
> +/*
> + Unix SMB/CIFS implementation.
> +
> + Wrap GlusterFS GFAPI calls in vfs functions.
> +
> + Copyright (c) 2013 Anand Avati <avati at redhat.com>
> +
> + This program is free software; you can redistribute it and/or modify
> + it under the terms of the GNU General Public License as published by
> + the Free Software Foundation; either version 3 of the License, or
> + (at your option) any later version.
> +
> + This program 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 General Public License for more details.
> +
> + You should have received a copy of the GNU General Public License
> + along with this program. If not, see <http://www.gnu.org/licenses/>.
> +*/
> +
> +
> +#include "includes.h"
> +#include "smbd/smbd.h"
> +#include <stdio.h>
> +#include <sys/acl.h>
> +#include "api/glfs.h"
> +#include "modules/vfs_posixacl.h"
> +
> +#define DEFAULT_VOLFILE_SERVER "localhost"
> +
> +/*
> + TODO
> + ----
> + Short term:
> + - AIO support
> + - sendfile/recvfile support
> + - vfs_gluster_sys_acl_get_file dynamic xattr size
> + - single glfs_t per volume
> +
> + Long term:
> + - Case insensitivity
> +*/
> +
> +/* Helpers to provide 'integer' fds */
> +
> +/* This is global. gfapi's FD operations do not
> + require filesystem context.
> +*/
> +static glfs_fd_t **glfd_fd;
> +static glfd_fd_size;
> +static glfd_fd_used;
> +static int
> +glfd_fd_store (glfs_fd_t *glfd)
> +{
> + int i;
> + void *tmp;
> +
> + if (glfd_fd_size == glfd_fd_used) {
> + tmp = realloc (glfd_fd, glfd_fd_size + 1024);
Is this correct? Shouldn't that be
tmp = realloc (glfd_fd, (glfd_fd_size + 1024) * sizeof(glfs_fd_t *));
> +static glfs_fd_t *
> +glfd_fd_get (int i)
> +{
> + return glfd_fd[i];
I'd feel better with a size check here.
> +}
> +
> +static glfs_fd_t *
> +glfd_fd_clear (int i)
> +{
> + glfs_fd_t *glfd = glfd_fd[i];
Same here for the size check.
> +
> + glfd_fd[i] = 0;
> + glfd_fd_used--;
> + return glfd;
> +}
> +
> +
> +/* Helper to convert stat to stat_ex */
> +
> +static void
> +smb_stat_ex_from_stat (struct stat_ex *dst, const struct stat *src)
> +{
> + memset (dst, 0, sizeof (*dst));
More Samba-like would be ZERO_STRUCTP(dst).
> +static struct dirent *
> +vfs_gluster_readdir (struct vfs_handle_struct *handle, DIR *dirp,
> + SMB_STRUCT_STAT *sbuf)
> +{
> + static char direntbuf[512];
> + int ret;
> + struct stat stat;
> + struct dirent *dirent = 0;
> +
> + ret = glfs_readdirplus_r ((void *)dirp, &stat, (void *)direntbuf,
> + &dirent);
> + if (ret)
> + dirent = NULL;
> +
> + if (sbuf)
> + smb_stat_ex_from_stat (sbuf, &stat);
Do you initialize the stat buf even in case of an error?
Regards,
Volker
--
SerNet GmbH, Bahnhofsallee 1b, 37081 Göttingen
phone: +49-551-370000-0, fax: +49-551-370000-9
AG Göttingen, HRB 2816, GF: Dr. Johannes Loxen
http://www.sernet.de, mailto:kontakt at sernet.de
More information about the samba-technical
mailing list