From 1b74cf992986287a510fe3b28a8ee7554e8b0992 Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Sat, 21 Jun 2014 02:00:23 -0700 Subject: porting: Port for FreeBSD rebased from Mike Ma's efforts - Provides a working Gluster Management Daemon, CLI - Provides a working GlusterFS server, GlusterNFS server - Provides a working GlusterFS client - execinfo port from FreeBSD is moved into ./contrib/libexecinfo for ease of portability on NetBSD. (FreeBSD 10 and OSX provide execinfo natively) - More portability cleanups for Darwin, FreeBSD and NetBSD - Provides a new rc script for FreeBSD Change-Id: I8dff336f97479ca5a7f9b8c6b730051c0f8ac46f BUG: 1111774 Original-Author: Mike Ma Signed-off-by: Harshavardhana Reviewed-on: http://review.gluster.org/8141 Tested-by: Gluster Build System Reviewed-by: Kaleb KEITHLEY --- .gitignore | 1 + api/src/glfs-fops.c | 2 + build-aux/xdrgen | 2 + configure.ac | 61 ++- contrib/fuse-include/fuse_kernel_macfuse.h | 470 +++++++++++------------- contrib/fuse-lib/mount-common.c | 15 +- contrib/fuse-lib/mount-gluster-compat.h | 11 +- contrib/fuse-lib/mount.c | 87 ++++- contrib/libexecinfo/execinfo.c | 442 ++++++++++++++++++++++ contrib/libexecinfo/execinfo_compat.h | 51 +++ contrib/mount/mntent.c | 6 +- contrib/mount/mntent_compat.h | 2 +- contrib/qemu/include/qemu/bswap.h | 2 + contrib/qemu/util/oslib-posix.c | 4 +- extras/geo-rep/Makefile.am | 2 +- extras/init.d/Makefile.am | 8 +- extras/init.d/glusterd-FreeBSD.in | 24 ++ libglusterfs/src/Makefile.am | 13 +- libglusterfs/src/common-utils.c | 89 +---- libglusterfs/src/common-utils.h | 7 +- libglusterfs/src/compat.h | 7 + libglusterfs/src/logging.c | 14 +- libglusterfs/src/store.h | 1 + libglusterfs/src/syscall.c | 2 + rpc/rpc-lib/src/xdr-rpc.c | 2 +- rpc/rpc-transport/socket/src/socket.c | 2 +- xlators/cluster/dht/src/dht-common.c | 1 + xlators/cluster/dht/src/dht-rebalance.c | 1 + xlators/encryption/crypt/src/crypt.h | 2 +- xlators/features/protect/src/Makefile.am | 6 +- xlators/features/protect/src/prot_client.c | 44 +-- xlators/meta/src/meta-defaults.c | 1 + xlators/mgmt/glusterd/src/glusterd-quota.c | 2 +- xlators/mgmt/glusterd/src/glusterd-snapshot.c | 11 +- xlators/mgmt/glusterd/src/glusterd-store.c | 2 +- xlators/mgmt/glusterd/src/glusterd-utils.c | 9 +- xlators/mgmt/glusterd/src/glusterd-volume-ops.c | 2 +- xlators/mount/fuse/src/fuse-bridge.c | 2 + xlators/mount/fuse/src/fuse-bridge.h | 4 +- xlators/mount/fuse/src/fuse-helpers.c | 33 +- xlators/mount/fuse/utils/Makefile.am | 9 +- xlators/performance/md-cache/src/md-cache.c | 1 + xlators/storage/posix/src/posix-handle.c | 2 + xlators/storage/posix/src/posix-helpers.c | 12 +- xlators/storage/posix/src/posix.c | 4 +- 45 files changed, 1030 insertions(+), 445 deletions(-) create mode 100644 contrib/libexecinfo/execinfo.c create mode 100644 contrib/libexecinfo/execinfo_compat.h create mode 100644 extras/init.d/glusterd-FreeBSD.in diff --git a/.gitignore b/.gitignore index bb194295576..2a986c13ff5 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,7 @@ contrib/uuid/uuid_types.h extras/init.d/glusterd-Debian extras/init.d/glusterd-Redhat extras/init.d/glusterd-SuSE +extras/init.d/glusterd-FreeBSD extras/init.d/glusterd.plist extras/systemd/glusterd.service extras/ocf/glusterd diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c index d5f65272c8b..535dad3fea1 100644 --- a/api/src/glfs-fops.c +++ b/api/src/glfs-fops.c @@ -1,3 +1,4 @@ + /* Copyright (c) 2012 Red Hat, Inc. This file is part of GlusterFS. @@ -13,6 +14,7 @@ #include "glfs-mem-types.h" #include "syncop.h" #include "glfs.h" +#include "compat-errno.h" #include #ifdef NAME_MAX diff --git a/build-aux/xdrgen b/build-aux/xdrgen index a2240a235a2..c2a7a781d58 100755 --- a/build-aux/xdrgen +++ b/build-aux/xdrgen @@ -23,11 +23,13 @@ append_licence_header () #if defined(__GNUC__) #if __GNUC__ >= 4 #if !defined(__clang__) +#if !defined(__NetBSD__) #pragma GCC diagnostic ignored "-Wunused-but-set-variable" #pragma GCC diagnostic ignored "-Wunused-variable" #endif #endif #endif +#endif EOF diff --git a/configure.ac b/configure.ac index 2c69ccdc1c3..2a653bd67e0 100644 --- a/configure.ac +++ b/configure.ac @@ -170,6 +170,7 @@ AC_CONFIG_FILES([Makefile extras/init.d/glusterd.plist extras/init.d/glusterd-Debian extras/init.d/glusterd-Redhat + extras/init.d/glusterd-FreeBSD extras/init.d/glusterd-SuSE extras/systemd/Makefile extras/systemd/glusterd.service @@ -436,10 +437,10 @@ AC_ARG_ENABLE([fusermount], BUILD_FUSERMOUNT="yes" if test "x$enable_fusermount" = "xno"; then - BUILD_FUSERMOUNT="no" + BUILD_FUSERMOUNT="no" else - AC_DEFINE(GF_FUSERMOUNT, 1, [Use our own fusermount]) - FUSERMOUNT_SUBDIR="contrib/fuse-util" + AC_DEFINE(GF_FUSERMOUNT, 1, [Use our own fusermount]) + FUSERMOUNT_SUBDIR="contrib/fuse-util" fi AC_SUBST(FUSERMOUNT_SUBDIR) @@ -639,18 +640,14 @@ else fi # end of xml-output -dnl FreeBSD > 5 has execinfo as a Ported library for giving a workaround -dnl solution to GCC backtrace functionality - -AC_CHECK_HEADERS([execinfo.h], [have_backtrace=yes], - AC_CHECK_LIB([execinfo], [backtrace], [have_backtrace=yes])) -dnl AC_MSG_ERROR([libexecinfo not found libexecinfo required.]))) - +AC_CHECK_HEADERS([execinfo.h], [have_backtrace=yes]) if test "x${have_backtrace}" = "xyes"; then AC_DEFINE(HAVE_BACKTRACE, 1, [define if found backtrace]) fi AC_SUBST(HAVE_BACKTRACE) +AC_CHECK_LIB([m], [ceil], , AC_MSG_ERROR([glibc math package missing - required])) + dnl glusterfs prints memory usage to stderr by sending it SIGUSR1 AC_CHECK_FUNC([malloc_stats], [have_malloc_stats=yes]) if test "x${have_malloc_stats}" = "xyes"; then @@ -774,9 +771,23 @@ AC_COMPILE_IFELSE( AC_MSG_RESULT([$CLANG]) if test "x$CLANG" = "xyes"; then - GF_COMPILER_FLAGS="-Wno-gnu -Wno-deprecated-declarations -Wno-enum-conversion" + GF_COMPILER_FLAGS="-Wno-gnu" fi +if test "x$ac_cv_header_execinfo_h" = "xno"; then + # The reason is that __builtin_frame_address(n) for n > 0 seems + # to just crash on most platforms when -fomit-stack-pointer is + # specified, which seems to be the default for many platforms on + # -O2. The documentation says that __builtin_frame_address() + # should return NULL in case it can't get the frame, but it + # seems to crash instead. + + # execinfo.c in ./contrib/libexecinfo uses __builtin_frame_address(n) + # for providing cross platform backtrace*() functions. + if test "x$CLANG" = "xno"; then + CFLAGS="$CFLAGS -fno-omit-frame-pointer" + fi +fi case $host_os in linux*) @@ -799,6 +810,7 @@ case $host_os in GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D_INCOMPLETE_XOPEN_C063" GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_BASENAME" GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_DIRNAME" + GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(sbindir)\\\"" GF_LDADD="${ARGP_STANDALONE_LDADD}" if test "x$ac_cv_header_execinfo_h" = "xyes"; then GF_GLUSTERFS_LIBS="-lexecinfo" @@ -806,17 +818,34 @@ case $host_os in GF_FUSE_LDADD="-lperfuse" BUILD_FUSE_CLIENT=yes LEXLIB="" + BUILD_FUSERMOUNT=no + FUSERMOUNT_SUBDIR="" ;; - *bsd*) + *freebsd*) GF_HOST_OS="GF_BSD_HOST_OS" - GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}" + GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -O0" GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_BASENAME" GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_DIRNAME" - GF_LDADD="${ARGP_STANDALONE_LDADD}" + GF_CFLAGS="${GF_CFLAGS} -D_LIBGEN_H_" + GF_CFLAGS="${GF_CFLAGS} -DO_DSYNC=0" + GF_CFLAGS="${GF_CFLAGS} -Dxdr_quad_t=xdr_longlong_t" + GF_CFLAGS="${GF_CFLAGS} -Dxdr_u_quad_t=xdr_u_longlong_t" + GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}" + GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(sbindir)\\\"" + GF_FUSE_LIBS="${GF_FUSE_LIBS} /usr/lib/libutil.so" + GF_FUSE_LDADD="-lutil" + GF_CFLAGS=" -I/usr/local/include ${GF_CFLAGS}" + CFLAGS=" -std=gnu89 ${CFLAGS}" + GF_CFLAGS=" -std=gnu89 ${GF_CFLAGS}" + GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}" + GF_LDADD="${ARGP_STANDALONE_LDADD} /usr/local/lib/libpython2.7.so /usr/local/lib/libintl.so" + LDFLAGS="${LDFLAGS} -L/usr/local/lib" if test "x$ac_cv_header_execinfo_h" = "xyes"; then GF_GLUSTERFS_LIBS="-lexecinfo" fi - BUILD_FUSE_CLIENT=no + BUILD_FUSERMOUNT=no + BUILD_QEMU_BLOCK=no + FUSERMOUNT_SUBDIR="" ;; darwin*) GF_HOST_OS="GF_DARWIN_HOST_OS" @@ -994,7 +1023,9 @@ GF_CPPINCLUDES='-I$(top_srcdir)/libglusterfs/src -I$(CONTRIBDIR)/uuid' GF_CPPFLAGS="$GF_CPPDEFINES $GF_CPPINCLUDES" AC_SUBST([GF_CPPFLAGS]) +AM_CONDITIONAL([GF_LINUX_HOST_OS], test "${GF_HOST_OS}" = "GF_LINUX_HOST_OS") AM_CONDITIONAL([GF_DARWIN_HOST_OS], test "${GF_HOST_OS}" = "GF_DARWIN_HOST_OS") +AM_CONDITIONAL([GF_BSD_HOST_OS], test "${GF_HOST_OS}" = "GF_BSD_HOST_OS") AM_CONDITIONAL([GF_INSTALL_VAR_LIB_GLUSTERD], test ! -d ${localstatedir}/lib/glusterd && test -d ${sysconfdir}/glusterd ) diff --git a/contrib/fuse-include/fuse_kernel_macfuse.h b/contrib/fuse-include/fuse_kernel_macfuse.h index a003f825a70..31bc495a552 100644 --- a/contrib/fuse-include/fuse_kernel_macfuse.h +++ b/contrib/fuse-include/fuse_kernel_macfuse.h @@ -61,67 +61,59 @@ userspace works under 64bit kernels */ struct fuse_attr { - __u64 ino; - __u64 size; - __u64 blocks; - __u64 atime; - __u64 mtime; - __u64 ctime; -#if (__FreeBSD__ >= 10) - __u64 crtime; -#endif /* __FreeBSD__ >= 10 */ - __u32 atimensec; - __u32 mtimensec; - __u32 ctimensec; -#if (__FreeBSD__ >= 10) - __u32 crtimensec; -#endif /* __FreeBSD__ >= 10 */ - __u32 mode; - __u32 nlink; - __u32 uid; - __u32 gid; - __u32 rdev; -#if (__FreeBSD__ >= 10) - __u32 flags; /* file flags; see chflags(2) */ -#endif /* __FreeBSD__ >= 10 */ + __u64 ino; + __u64 size; + __u64 blocks; + __u64 atime; + __u64 mtime; + __u64 ctime; + __u64 crtime; + __u32 atimensec; + __u32 mtimensec; + __u32 ctimensec; + __u32 crtimensec; + __u32 mode; + __u32 nlink; + __u32 uid; + __u32 gid; + __u32 rdev; + __u32 flags; /* file flags; see chflags(2) */ }; struct fuse_kstatfs { - __u64 blocks; - __u64 bfree; - __u64 bavail; - __u64 files; - __u64 ffree; - __u32 bsize; - __u32 namelen; - __u32 frsize; - __u32 padding; - __u32 spare[6]; + __u64 blocks; + __u64 bfree; + __u64 bavail; + __u64 files; + __u64 ffree; + __u32 bsize; + __u32 namelen; + __u32 frsize; + __u32 padding; + __u32 spare[6]; }; struct fuse_file_lock { - __u64 start; - __u64 end; - __u32 type; - __u32 pid; /* tgid */ + __u64 start; + __u64 end; + __u32 type; + __u32 pid; /* tgid */ }; /** * Bitmasks for fuse_setattr_in.valid */ -#define FATTR_MODE (1 << 0) -#define FATTR_UID (1 << 1) -#define FATTR_GID (1 << 2) -#define FATTR_SIZE (1 << 3) -#define FATTR_ATIME (1 << 4) -#define FATTR_MTIME (1 << 5) -#define FATTR_FH (1 << 6) -#if (__FreeBSD__ >= 10) -#define FATTR_CRTIME (1 << 28) -#define FATTR_CHGTIME (1 << 29) -#define FATTR_BKUPTIME (1 << 30) -#define FATTR_FLAGS (1 << 31) -#endif /* __FreeBSD__ >= 10 */ +#define FATTR_MODE (1 << 0) +#define FATTR_UID (1 << 1) +#define FATTR_GID (1 << 2) +#define FATTR_SIZE (1 << 3) +#define FATTR_ATIME (1 << 4) +#define FATTR_MTIME (1 << 5) +#define FATTR_FH (1 << 6) +#define FATTR_CRTIME (1 << 28) +#define FATTR_CHGTIME (1 << 29) +#define FATTR_BKUPTIME (1 << 30) +#define FATTR_FLAGS (1 << 31) /** * Flags returned by the OPEN request @@ -129,320 +121,304 @@ struct fuse_file_lock { * FOPEN_DIRECT_IO: bypass page cache for this open file * FOPEN_KEEP_CACHE: don't invalidate the data cache on open */ -#define FOPEN_DIRECT_IO (1 << 0) -#define FOPEN_KEEP_CACHE (1 << 1) -#if (__FreeBSD__ >= 10) -#define FOPEN_PURGE_ATTR (1 << 30) -#define FOPEN_PURGE_UBC (1 << 31) -#endif +#define FOPEN_DIRECT_IO (1 << 0) +#define FOPEN_KEEP_CACHE (1 << 1) +#define FOPEN_PURGE_ATTR (1 << 30) +#define FOPEN_PURGE_UBC (1 << 31) /** * INIT request/reply flags */ -#define FUSE_ASYNC_READ (1 << 0) -#define FUSE_POSIX_LOCKS (1 << 1) -#if (__FreeBSD__ >= 10) -#define FUSE_CASE_INSENSITIVE (1 << 29) -#define FUSE_VOL_RENAME (1 << 30) -#define FUSE_XTIMES (1 << 31) -#endif /* __FreeBSD__ >= 10 */ +#define FUSE_ASYNC_READ (1 << 0) +#define FUSE_POSIX_LOCKS (1 << 1) +#define FUSE_CASE_INSENSITIVE (1 << 29) +#define FUSE_VOL_RENAME (1 << 30) +#define FUSE_XTIMES (1 << 31) /** * Release flags */ -#define FUSE_RELEASE_FLUSH (1 << 0) +#define FUSE_RELEASE_FLUSH (1 << 0) enum fuse_opcode { - FUSE_LOOKUP = 1, - FUSE_FORGET = 2, /* no reply */ - FUSE_GETATTR = 3, - FUSE_SETATTR = 4, - FUSE_READLINK = 5, - FUSE_SYMLINK = 6, - FUSE_MKNOD = 8, - FUSE_MKDIR = 9, - FUSE_UNLINK = 10, - FUSE_RMDIR = 11, - FUSE_RENAME = 12, - FUSE_LINK = 13, - FUSE_OPEN = 14, - FUSE_READ = 15, - FUSE_WRITE = 16, - FUSE_STATFS = 17, - FUSE_RELEASE = 18, - FUSE_FSYNC = 20, - FUSE_SETXATTR = 21, - FUSE_GETXATTR = 22, - FUSE_LISTXATTR = 23, - FUSE_REMOVEXATTR = 24, - FUSE_FLUSH = 25, - FUSE_INIT = 26, - FUSE_OPENDIR = 27, - FUSE_READDIR = 28, - FUSE_RELEASEDIR = 29, - FUSE_FSYNCDIR = 30, - FUSE_GETLK = 31, - FUSE_SETLK = 32, - FUSE_SETLKW = 33, - FUSE_ACCESS = 34, - FUSE_CREATE = 35, - FUSE_INTERRUPT = 36, - FUSE_BMAP = 37, - FUSE_DESTROY = 38, - /* - FUSE_IOCTL = 39, - FUSE_POLL = 40, - FUSE_NOTIFY_REPLY = 41, - FUSE_BATCH_FORGET = 42, - FUSE_FALLOCATE = 43, - FUSE_READDIRPLUS = 44, - */ - -#if (__FreeBSD__ >= 10) + FUSE_LOOKUP = 1, + FUSE_FORGET = 2, /* no reply */ + FUSE_GETATTR = 3, + FUSE_SETATTR = 4, + FUSE_READLINK = 5, + FUSE_SYMLINK = 6, + FUSE_MKNOD = 8, + FUSE_MKDIR = 9, + FUSE_UNLINK = 10, + FUSE_RMDIR = 11, + FUSE_RENAME = 12, + FUSE_LINK = 13, + FUSE_OPEN = 14, + FUSE_READ = 15, + FUSE_WRITE = 16, + FUSE_STATFS = 17, + FUSE_RELEASE = 18, + FUSE_FSYNC = 20, + FUSE_SETXATTR = 21, + FUSE_GETXATTR = 22, + FUSE_LISTXATTR = 23, + FUSE_REMOVEXATTR = 24, + FUSE_FLUSH = 25, + FUSE_INIT = 26, + FUSE_OPENDIR = 27, + FUSE_READDIR = 28, + FUSE_RELEASEDIR = 29, + FUSE_FSYNCDIR = 30, + FUSE_GETLK = 31, + FUSE_SETLK = 32, + FUSE_SETLKW = 33, + FUSE_ACCESS = 34, + FUSE_CREATE = 35, + FUSE_INTERRUPT = 36, + FUSE_BMAP = 37, + FUSE_DESTROY = 38, + /* + FUSE_IOCTL = 39, + FUSE_POLL = 40, + FUSE_NOTIFY_REPLY = 41, + FUSE_BATCH_FORGET = 42, + FUSE_FALLOCATE = 43, + FUSE_READDIRPLUS = 44, + */ + FUSE_SETVOLNAME = 61, - FUSE_GETXTIMES = 62, - FUSE_EXCHANGE = 63, -#endif /* __FreeBSD__ >= 10 */ + FUSE_GETXTIMES = 62, + FUSE_EXCHANGE = 63, }; /* The read buffer is required to be at least 8k, but may be much larger */ #define FUSE_MIN_READ_BUFFER 8192 struct fuse_entry_out { - __u64 nodeid; /* Inode ID */ - __u64 generation; /* Inode generation: nodeid:gen must - be unique for the fs's lifetime */ - __u64 entry_valid; /* Cache timeout for the name */ - __u64 attr_valid; /* Cache timeout for the attributes */ - __u32 entry_valid_nsec; - __u32 attr_valid_nsec; - struct fuse_attr attr; + __u64 nodeid; /* Inode ID */ + __u64 generation; /* Inode generation: nodeid:gen must + be unique for the fs's lifetime */ + __u64 entry_valid; /* Cache timeout for the name */ + __u64 attr_valid; /* Cache timeout for the attributes */ + __u32 entry_valid_nsec; + __u32 attr_valid_nsec; + struct fuse_attr attr; }; struct fuse_forget_in { - __u64 nlookup; + __u64 nlookup; }; struct fuse_attr_out { - __u64 attr_valid; /* Cache timeout for the attributes */ - __u32 attr_valid_nsec; - __u32 dummy; - struct fuse_attr attr; + __u64 attr_valid; /* Cache timeout for the attributes */ + __u32 attr_valid_nsec; + __u32 dummy; + struct fuse_attr attr; }; -#if (__FreeBSD__ >= 10) struct fuse_getxtimes_out { - __u64 bkuptime; - __u64 crtime; - __u32 bkuptimensec; - __u32 crtimensec; + __u64 bkuptime; + __u64 crtime; + __u32 bkuptimensec; + __u32 crtimensec; }; -#endif /* __FreeBSD__ >= 10 */ struct fuse_mknod_in { - __u32 mode; - __u32 rdev; + __u32 mode; + __u32 rdev; }; struct fuse_mkdir_in { - __u32 mode; - __u32 padding; + __u32 mode; + __u32 padding; }; struct fuse_rename_in { - __u64 newdir; + __u64 newdir; }; -#if (__FreeBSD__ >= 10) struct fuse_exchange_in { - __u64 olddir; - __u64 newdir; - __u64 options; + __u64 olddir; + __u64 newdir; + __u64 options; }; -#endif /* __FreeBSD__ >= 10 */ struct fuse_link_in { - __u64 oldnodeid; + __u64 oldnodeid; }; struct fuse_setattr_in { - __u32 valid; - __u32 padding; - __u64 fh; - __u64 size; - __u64 unused1; - __u64 atime; - __u64 mtime; - __u64 unused2; - __u32 atimensec; - __u32 mtimensec; - __u32 unused3; - __u32 mode; - __u32 unused4; - __u32 uid; - __u32 gid; - __u32 unused5; -#if (__FreeBSD__ >= 10) - __u64 bkuptime; - __u64 chgtime; - __u64 crtime; - __u32 bkuptimensec; - __u32 chgtimensec; - __u32 crtimensec; - __u32 flags; /* file flags; see chflags(2) */ -#endif /* __FreeBSD__ >= 10 */ + __u32 valid; + __u32 padding; + __u64 fh; + __u64 size; + __u64 unused1; + __u64 atime; + __u64 mtime; + __u64 unused2; + __u32 atimensec; + __u32 mtimensec; + __u32 unused3; + __u32 mode; + __u32 unused4; + __u32 uid; + __u32 gid; + __u32 unused5; + __u64 bkuptime; + __u64 chgtime; + __u64 crtime; + __u32 bkuptimensec; + __u32 chgtimensec; + __u32 crtimensec; + __u32 flags; /* file flags; see chflags(2) */ }; struct fuse_open_in { - __u32 flags; - __u32 mode; + __u32 flags; + __u32 mode; }; struct fuse_open_out { - __u64 fh; - __u32 open_flags; - __u32 padding; + __u64 fh; + __u32 open_flags; + __u32 padding; }; struct fuse_release_in { - __u64 fh; - __u32 flags; - __u32 release_flags; - __u64 lock_owner; + __u64 fh; + __u32 flags; + __u32 release_flags; + __u64 lock_owner; }; struct fuse_flush_in { - __u64 fh; - __u32 unused; - __u32 padding; - __u64 lock_owner; + __u64 fh; + __u32 unused; + __u32 padding; + __u64 lock_owner; }; struct fuse_read_in { - __u64 fh; - __u64 offset; - __u32 size; - __u32 padding; + __u64 fh; + __u64 offset; + __u32 size; + __u32 padding; }; struct fuse_write_in { - __u64 fh; - __u64 offset; - __u32 size; - __u32 write_flags; + __u64 fh; + __u64 offset; + __u32 size; + __u32 write_flags; }; struct fuse_write_out { - __u32 size; - __u32 padding; + __u32 size; + __u32 padding; }; #define FUSE_COMPAT_STATFS_SIZE 48 struct fuse_statfs_out { - struct fuse_kstatfs st; + struct fuse_kstatfs st; }; struct fuse_fsync_in { - __u64 fh; - __u32 fsync_flags; - __u32 padding; + __u64 fh; + __u32 fsync_flags; + __u32 padding; }; struct fuse_setxattr_in { - __u32 size; - __u32 flags; -#if (__FreeBSD__ >= 10) - __u32 position; - __u32 padding; -#endif /* __FreeBSD__ >= 10 */ + __u32 size; + __u32 flags; + __u32 position; + __u32 padding; }; struct fuse_getxattr_in { - __u32 size; - __u32 padding; -#if (__FreeBSD__ >= 10) - __u32 position; - __u32 padding2; -#endif /* __FreeBSD__ >= 10 */ + __u32 size; + __u32 padding; + __u32 position; + __u32 padding2; }; struct fuse_getxattr_out { - __u32 size; - __u32 padding; + __u32 size; + __u32 padding; }; struct fuse_lk_in { - __u64 fh; - __u64 owner; - struct fuse_file_lock lk; + __u64 fh; + __u64 owner; + struct fuse_file_lock lk; }; struct fuse_lk_out { - struct fuse_file_lock lk; + struct fuse_file_lock lk; }; struct fuse_access_in { - __u32 mask; - __u32 padding; + __u32 mask; + __u32 padding; }; struct fuse_init_in { - __u32 major; - __u32 minor; - __u32 max_readahead; - __u32 flags; + __u32 major; + __u32 minor; + __u32 max_readahead; + __u32 flags; }; struct fuse_init_out { - __u32 major; - __u32 minor; - __u32 max_readahead; - __u32 flags; - __u32 unused; - __u32 max_write; + __u32 major; + __u32 minor; + __u32 max_readahead; + __u32 flags; + __u32 unused; + __u32 max_write; }; struct fuse_interrupt_in { - __u64 unique; + __u64 unique; }; struct fuse_bmap_in { - __u64 block; - __u32 blocksize; - __u32 padding; + __u64 block; + __u32 blocksize; + __u32 padding; }; struct fuse_bmap_out { - __u64 block; + __u64 block; }; struct fuse_in_header { - __u32 len; - __u32 opcode; - __u64 unique; - __u64 nodeid; - __u32 uid; - __u32 gid; - __u32 pid; - __u32 padding; + __u32 len; + __u32 opcode; + __u64 unique; + __u64 nodeid; + __u32 uid; + __u32 gid; + __u32 pid; + __u32 padding; }; struct fuse_out_header { - __u32 len; - __s32 error; - __u64 unique; + __u32 len; + __s32 error; + __u64 unique; }; struct fuse_dirent { - __u64 ino; - __u64 off; - __u32 namelen; - __u32 type; - char name[0]; + __u64 ino; + __u64 off; + __u32 namelen; + __u32 type; + char name[0]; }; #define FUSE_NAME_OFFSET offsetof(struct fuse_dirent, name) #define FUSE_DIRENT_ALIGN(x) (((x) + sizeof(__u64) - 1) & ~(sizeof(__u64) - 1)) #define FUSE_DIRENT_SIZE(d) \ - FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) + FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + (d)->namelen) diff --git a/contrib/fuse-lib/mount-common.c b/contrib/fuse-lib/mount-common.c index fd6cce44e3d..cd226fa3141 100644 --- a/contrib/fuse-lib/mount-common.c +++ b/contrib/fuse-lib/mount-common.c @@ -23,7 +23,7 @@ * see the commit log and per-function comments. */ -#ifndef __NetBSD__ +#ifdef GF_LINUX_HOST_OS /* FUSE: cherry-picked bd99f9cf */ static int mtab_needs_update (const char *mnt) @@ -69,9 +69,9 @@ mtab_needs_update (const char *mnt) return 1; } -#else /* __NetBSD__ */ +#else /* GF_LINUX_HOST_OS */ #define mtab_needs_update(x) 1 -#endif /* __NetBSD__ */ +#endif /* GF_LINUX_HOST_OS */ /* FUSE: called add_mount_legacy(); R.I.P. as of cbd3a2a8 */ int @@ -246,10 +246,17 @@ fuse_mnt_umount (const char *progname, const char *abs_mnt, if (res == 0) { sigprocmask (SIG_SETMASK, &oldmask, NULL); setuid (geteuid ()); +#ifdef GF_LINUX_HOST_OS execl ("/bin/umount", "/bin/umount", "-i", rel_mnt, - lazy ? "-l" : NULL, NULL); + lazy ? "-l" : NULL, NULL); GFFUSE_LOGERR ("%s: failed to execute /bin/umount: %s", progname, strerror (errno)); +#else + execl ("/sbin/umount", "/sbin/umount", rel_mnt, + lazy ? "-l" : NULL, NULL); + GFFUSE_LOGERR ("%s: failed to execute /sbin/umount: %s", + progname, strerror (errno)); +#endif /* GF_LINUX_HOST_OS */ exit (1); } res = waitpid (res, &status, 0); diff --git a/contrib/fuse-lib/mount-gluster-compat.h b/contrib/fuse-lib/mount-gluster-compat.h index 1f76241ab1c..562f089dd1f 100644 --- a/contrib/fuse-lib/mount-gluster-compat.h +++ b/contrib/fuse-lib/mount-gluster-compat.h @@ -21,32 +21,31 @@ #include #include #include -#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS) +#if defined(GF_LINUX_HOST_OS) #include -#endif /* __NetBSD__ */ +#endif /* GF_LINUX_HOST_OS */ #include #include #include #include #include -#ifdef __NetBSD__ +#if defined(__NetBSD__) #include #define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0) #define MS_RDONLY MNT_RDONLY #endif -#ifdef GF_DARWIN_HOST_OS +#if defined(GF_DARWIN_HOST_OS) || defined(__FreeBSD__) #include #include #define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0) #define MS_RDONLY MNT_RDONLY #endif - #ifdef GF_LINUX_HOST_OS #define _PATH_MOUNT "/bin/mount" -#else /* NetBSD, MacOS X */ +#else /* FreeBSD, NetBSD, MacOS X */ #define _PATH_MOUNT "/sbin/mount" #endif diff --git a/contrib/fuse-lib/mount.c b/contrib/fuse-lib/mount.c index 922d9e464db..a7fd94de464 100644 --- a/contrib/fuse-lib/mount.c +++ b/contrib/fuse-lib/mount.c @@ -17,6 +17,11 @@ #endif #define FUSE_DEVFD_ENV "_FUSE_DEVFD" +#ifdef __FreeBSD__ +#include +#include +#include +#endif /* __FreeBSD__ */ /* FUSE: function is called fuse_kern_unmount() */ void @@ -170,6 +175,55 @@ fuse_mount_fusermount (const char *mountpoint, char *fsname, return ret; } +#if defined(__FreeBSD__) +void +build_iovec(struct iovec **iov, int *iovlen, const char *name, void *val, + size_t len) +{ + int i; + if (*iovlen < 0) + return; + i = *iovlen; + + *iov = realloc(*iov, sizeof **iov * (i + 2)); + if (*iov == NULL) { + *iovlen = -1; + return; + } + + (*iov)[i].iov_base = strdup(name); + (*iov)[i].iov_len = strlen(name) + 1; + + i++; + (*iov)[i].iov_base = val; + if (len == (size_t) -1) { + if (val != NULL) + len = strlen(val) + 1; + else + len = 0; + } + (*iov)[i].iov_len = (int)len; + *iovlen = ++i; +} + +/* + * This function is needed for compatibility with parameters + * which used to use the mount_argf() command for the old mount() syscall. + */ +void +build_iovec_argf(struct iovec **iov, int *iovlen, const char *name, + const char *fmt, ...) +{ + va_list ap; + char val[255] = { 0 }; + + va_start(ap, fmt); + vsnprintf(val, sizeof(val), fmt, ap); + va_end(ap); + build_iovec(iov, iovlen, name, strdup(val), (size_t)-1); +} +#endif /* __FreeBSD__ */ + static int fuse_mount_sys (const char *mountpoint, char *fsname, unsigned long mountflags, char *mnt_param, int fd) @@ -188,8 +242,24 @@ fuse_mount_sys (const char *mountpoint, char *fsname, goto out; } + +#ifdef __FreeBSD__ + struct iovec *iov = NULL; + int iovlen = 0; + build_iovec (&iov, &iovlen, "fstype", "fusefs", -1); + build_iovec (&iov, &iovlen, "subtype", "glusterfs", -1); + build_iovec (&iov, &iovlen, "fspath", mountpoint, -1); + build_iovec (&iov, &iovlen, "from", "/dev/fuse", -1); + build_iovec (&iov, &iovlen, "volname", source, -1); + build_iovec_argf (&iov, &iovlen, "fd", "%d", fd); + build_iovec_argf (&iov, &iovlen, "user_id", "%d", getuid()); + build_iovec_argf (&iov, &iovlen, "group_id", "%d", getgid()); + ret = nmount (iov, iovlen, mountflags); +#else ret = mount (source, mountpoint, fstype, mountflags, mnt_param_mnt); +#endif /* __FreeBSD__ */ +#ifdef GF_LINUX_HOST_OS if (ret == -1 && errno == ENODEV) { /* fs subtype support was added by 79c0b2df aka v2.6.21-3159-g79c0b2d. Probably we have an @@ -204,12 +274,13 @@ fuse_mount_sys (const char *mountpoint, char *fsname, ret = mount (source, mountpoint, fstype, mountflags, mnt_param_mnt); } +#endif /* GF_LINUX_HOST_OS */ if (ret == -1) goto out; else mounted = 1; -#ifndef __NetBSD__ +#ifdef GF_LINUX_HOST_OS if (geteuid () == 0) { char *newmnt = fuse_mnt_resolve_path ("fuse", mountpoint); char *mnt_param_mtab = NULL; @@ -238,10 +309,11 @@ fuse_mount_sys (const char *mountpoint, char *fsname, goto out; } } -#endif /* __NetBSD__ */ +#endif /* GF_LINUX_HOST_OS */ out: if (ret == -1) { + GFFUSE_LOGERR("ret = -1\n"); if (mounted) umount2 (mountpoint, 2); /* lazy umount */ } @@ -282,15 +354,16 @@ gf_fuse_mount (const char *mountpoint, char *fsname, exit (pid == -1 ? 1 : 0); } - ret = fuse_mount_sys (mountpoint, fsname, mountflags, mnt_param, fd); + ret = fuse_mount_sys (mountpoint, fsname, mountflags, mnt_param, + fd); if (ret == -1) { gf_log ("glusterfs-fuse", GF_LOG_INFO, - "direct mount failed (%s), " + "direct mount failed (%s) errno %d, " "retry to mount via fusermount", - strerror (errno)); + strerror (errno), errno); - ret = fuse_mount_fusermount (mountpoint, fsname, mountflags, - mnt_param, fd); + ret = fuse_mount_fusermount (mountpoint, fsname, + mountflags, mnt_param, fd); } if (ret == -1) diff --git a/contrib/libexecinfo/execinfo.c b/contrib/libexecinfo/execinfo.c new file mode 100644 index 00000000000..03500257788 --- /dev/null +++ b/contrib/libexecinfo/execinfo.c @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2003 Maxim Sobolev + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: execinfo.c,v 1.3 2004/07/19 05:21:09 sobomax Exp $ + */ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#ifndef HAVE_BACKTRACE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "execinfo_compat.h" + +#define D10(x) ceil(log10(((x) == 0) ? 2 : ((x) + 1))) + +static void * +getreturnaddr(int level) +{ + switch (level) { + case 0: return __builtin_return_address(1); + case 1: return __builtin_return_address(2); + case 2: return __builtin_return_address(3); + case 3: return __builtin_return_address(4); + case 4: return __builtin_return_address(5); + case 5: return __builtin_return_address(6); + case 6: return __builtin_return_address(7); + case 7: return __builtin_return_address(8); + case 8: return __builtin_return_address(9); + case 9: return __builtin_return_address(10); + case 10: return __builtin_return_address(11); + case 11: return __builtin_return_address(12); + case 12: return __builtin_return_address(13); + case 13: return __builtin_return_address(14); + case 14: return __builtin_return_address(15); + case 15: return __builtin_return_address(16); + case 16: return __builtin_return_address(17); + case 17: return __builtin_return_address(18); + case 18: return __builtin_return_address(19); + case 19: return __builtin_return_address(20); + case 20: return __builtin_return_address(21); + case 21: return __builtin_return_address(22); + case 22: return __builtin_return_address(23); + case 23: return __builtin_return_address(24); + case 24: return __builtin_return_address(25); + case 25: return __builtin_return_address(26); + case 26: return __builtin_return_address(27); + case 27: return __builtin_return_address(28); + case 28: return __builtin_return_address(29); + case 29: return __builtin_return_address(30); + case 30: return __builtin_return_address(31); + case 31: return __builtin_return_address(32); + case 32: return __builtin_return_address(33); + case 33: return __builtin_return_address(34); + case 34: return __builtin_return_address(35); + case 35: return __builtin_return_address(36); + case 36: return __builtin_return_address(37); + case 37: return __builtin_return_address(38); + case 38: return __builtin_return_address(39); + case 39: return __builtin_return_address(40); + case 40: return __builtin_return_address(41); + case 41: return __builtin_return_address(42); + case 42: return __builtin_return_address(43); + case 43: return __builtin_return_address(44); + case 44: return __builtin_return_address(45); + case 45: return __builtin_return_address(46); + case 46: return __builtin_return_address(47); + case 47: return __builtin_return_address(48); + case 48: return __builtin_return_address(49); + case 49: return __builtin_return_address(50); + case 50: return __builtin_return_address(51); + case 51: return __builtin_return_address(52); + case 52: return __builtin_return_address(53); + case 53: return __builtin_return_address(54); + case 54: return __builtin_return_address(55); + case 55: return __builtin_return_address(56); + case 56: return __builtin_return_address(57); + case 57: return __builtin_return_address(58); + case 58: return __builtin_return_address(59); + case 59: return __builtin_return_address(60); + case 60: return __builtin_return_address(61); + case 61: return __builtin_return_address(62); + case 62: return __builtin_return_address(63); + case 63: return __builtin_return_address(64); + case 64: return __builtin_return_address(65); + case 65: return __builtin_return_address(66); + case 66: return __builtin_return_address(67); + case 67: return __builtin_return_address(68); + case 68: return __builtin_return_address(69); + case 69: return __builtin_return_address(70); + case 70: return __builtin_return_address(71); + case 71: return __builtin_return_address(72); + case 72: return __builtin_return_address(73); + case 73: return __builtin_return_address(74); + case 74: return __builtin_return_address(75); + case 75: return __builtin_return_address(76); + case 76: return __builtin_return_address(77); + case 77: return __builtin_return_address(78); + case 78: return __builtin_return_address(79); + case 79: return __builtin_return_address(80); + case 80: return __builtin_return_address(81); + case 81: return __builtin_return_address(82); + case 82: return __builtin_return_address(83); + case 83: return __builtin_return_address(84); + case 84: return __builtin_return_address(85); + case 85: return __builtin_return_address(86); + case 86: return __builtin_return_address(87); + case 87: return __builtin_return_address(88); + case 88: return __builtin_return_address(89); + case 89: return __builtin_return_address(90); + case 90: return __builtin_return_address(91); + case 91: return __builtin_return_address(92); + case 92: return __builtin_return_address(93); + case 93: return __builtin_return_address(94); + case 94: return __builtin_return_address(95); + case 95: return __builtin_return_address(96); + case 96: return __builtin_return_address(97); + case 97: return __builtin_return_address(98); + case 98: return __builtin_return_address(99); + case 99: return __builtin_return_address(100); + case 100: return __builtin_return_address(101); + case 101: return __builtin_return_address(102); + case 102: return __builtin_return_address(103); + case 103: return __builtin_return_address(104); + case 104: return __builtin_return_address(105); + case 105: return __builtin_return_address(106); + case 106: return __builtin_return_address(107); + case 107: return __builtin_return_address(108); + case 108: return __builtin_return_address(109); + case 109: return __builtin_return_address(110); + case 110: return __builtin_return_address(111); + case 111: return __builtin_return_address(112); + case 112: return __builtin_return_address(113); + case 113: return __builtin_return_address(114); + case 114: return __builtin_return_address(115); + case 115: return __builtin_return_address(116); + case 116: return __builtin_return_address(117); + case 117: return __builtin_return_address(118); + case 118: return __builtin_return_address(119); + case 119: return __builtin_return_address(120); + case 120: return __builtin_return_address(121); + case 121: return __builtin_return_address(122); + case 122: return __builtin_return_address(123); + case 123: return __builtin_return_address(124); + case 124: return __builtin_return_address(125); + case 125: return __builtin_return_address(126); + case 126: return __builtin_return_address(127); + case 127: return __builtin_return_address(128); + default: return NULL; + } +} + +static void * +getframeaddr(int level) +{ + + switch (level) { + case 0: return __builtin_frame_address(1); + case 1: return __builtin_frame_address(2); + case 2: return __builtin_frame_address(3); + case 3: return __builtin_frame_address(4); + case 4: return __builtin_frame_address(5); + case 5: return __builtin_frame_address(6); + case 6: return __builtin_frame_address(7); + case 7: return __builtin_frame_address(8); + case 8: return __builtin_frame_address(9); + case 9: return __builtin_frame_address(10); + case 10: return __builtin_frame_address(11); + case 11: return __builtin_frame_address(12); + case 12: return __builtin_frame_address(13); + case 13: return __builtin_frame_address(14); + case 14: return __builtin_frame_address(15); + case 15: return __builtin_frame_address(16); + case 16: return __builtin_frame_address(17); + case 17: return __builtin_frame_address(18); + case 18: return __builtin_frame_address(19); + case 19: return __builtin_frame_address(20); + case 20: return __builtin_frame_address(21); + case 21: return __builtin_frame_address(22); + case 22: return __builtin_frame_address(23); + case 23: return __builtin_frame_address(24); + case 24: return __builtin_frame_address(25); + case 25: return __builtin_frame_address(26); + case 26: return __builtin_frame_address(27); + case 27: return __builtin_frame_address(28); + case 28: return __builtin_frame_address(29); + case 29: return __builtin_frame_address(30); + case 30: return __builtin_frame_address(31); + case 31: return __builtin_frame_address(32); + case 32: return __builtin_frame_address(33); + case 33: return __builtin_frame_address(34); + case 34: return __builtin_frame_address(35); + case 35: return __builtin_frame_address(36); + case 36: return __builtin_frame_address(37); + case 37: return __builtin_frame_address(38); + case 38: return __builtin_frame_address(39); + case 39: return __builtin_frame_address(40); + case 40: return __builtin_frame_address(41); + case 41: return __builtin_frame_address(42); + case 42: return __builtin_frame_address(43); + case 43: return __builtin_frame_address(44); + case 44: return __builtin_frame_address(45); + case 45: return __builtin_frame_address(46); + case 46: return __builtin_frame_address(47); + case 47: return __builtin_frame_address(48); + case 48: return __builtin_frame_address(49); + case 49: return __builtin_frame_address(50); + case 50: return __builtin_frame_address(51); + case 51: return __builtin_frame_address(52); + case 52: return __builtin_frame_address(53); + case 53: return __builtin_frame_address(54); + case 54: return __builtin_frame_address(55); + case 55: return __builtin_frame_address(56); + case 56: return __builtin_frame_address(57); + case 57: return __builtin_frame_address(58); + case 58: return __builtin_frame_address(59); + case 59: return __builtin_frame_address(60); + case 60: return __builtin_frame_address(61); + case 61: return __builtin_frame_address(62); + case 62: return __builtin_frame_address(63); + case 63: return __builtin_frame_address(64); + case 64: return __builtin_frame_address(65); + case 65: return __builtin_frame_address(66); + case 66: return __builtin_frame_address(67); + case 67: return __builtin_frame_address(68); + case 68: return __builtin_frame_address(69); + case 69: return __builtin_frame_address(70); + case 70: return __builtin_frame_address(71); + case 71: return __builtin_frame_address(72); + case 72: return __builtin_frame_address(73); + case 73: return __builtin_frame_address(74); + case 74: return __builtin_frame_address(75); + case 75: return __builtin_frame_address(76); + case 76: return __builtin_frame_address(77); + case 77: return __builtin_frame_address(78); + case 78: return __builtin_frame_address(79); + case 79: return __builtin_frame_address(80); + case 80: return __builtin_frame_address(81); + case 81: return __builtin_frame_address(82); + case 82: return __builtin_frame_address(83); + case 83: return __builtin_frame_address(84); + case 84: return __builtin_frame_address(85); + case 85: return __builtin_frame_address(86); + case 86: return __builtin_frame_address(87); + case 87: return __builtin_frame_address(88); + case 88: return __builtin_frame_address(89); + case 89: return __builtin_frame_address(90); + case 90: return __builtin_frame_address(91); + case 91: return __builtin_frame_address(92); + case 92: return __builtin_frame_address(93); + case 93: return __builtin_frame_address(94); + case 94: return __builtin_frame_address(95); + case 95: return __builtin_frame_address(96); + case 96: return __builtin_frame_address(97); + case 97: return __builtin_frame_address(98); + case 98: return __builtin_frame_address(99); + case 99: return __builtin_frame_address(100); + case 100: return __builtin_frame_address(101); + case 101: return __builtin_frame_address(102); + case 102: return __builtin_frame_address(103); + case 103: return __builtin_frame_address(104); + case 104: return __builtin_frame_address(105); + case 105: return __builtin_frame_address(106); + case 106: return __builtin_frame_address(107); + case 107: return __builtin_frame_address(108); + case 108: return __builtin_frame_address(109); + case 109: return __builtin_frame_address(110); + case 110: return __builtin_frame_address(111); + case 111: return __builtin_frame_address(112); + case 112: return __builtin_frame_address(113); + case 113: return __builtin_frame_address(114); + case 114: return __builtin_frame_address(115); + case 115: return __builtin_frame_address(116); + case 116: return __builtin_frame_address(117); + case 117: return __builtin_frame_address(118); + case 118: return __builtin_frame_address(119); + case 119: return __builtin_frame_address(120); + case 120: return __builtin_frame_address(121); + case 121: return __builtin_frame_address(122); + case 122: return __builtin_frame_address(123); + case 123: return __builtin_frame_address(124); + case 124: return __builtin_frame_address(125); + case 125: return __builtin_frame_address(126); + case 126: return __builtin_frame_address(127); + case 127: return __builtin_frame_address(128); + default: return NULL; + } +} + +static inline void * +realloc_safe(void *ptr, size_t size) +{ + void *nptr; + + nptr = realloc (ptr, size); + if (nptr == NULL) + free (ptr); + return nptr; +} + +int +backtrace(void **buffer, int size) +{ + int i; + + for (i = 1; getframeaddr(i + 1) != NULL && i != size + 1; i++) { + buffer[i - 1] = getreturnaddr(i); + if (buffer[i - 1] == NULL) + break; + } + return i - 1; +} + +char ** +backtrace_symbols(void *const *buffer, int size) +{ + size_t clen, alen; + int i, offset; + char **rval; + Dl_info info; + + clen = size * sizeof(char *); + rval = malloc(clen); + if (rval == NULL) + return NULL; + for (i = 0; i < size; i++) { + if (dladdr(buffer[i], &info) != 0) { + if (info.dli_sname == NULL) + info.dli_sname = "???"; + if (info.dli_saddr == NULL) + info.dli_saddr = buffer[i]; + offset = buffer[i] - info.dli_saddr; + /* "0x01234567 at filename" */ + alen = 2 + /* "0x" */ + (sizeof(void *) * 2) + /* "01234567" */ + 2 + /* " <" */ + strlen(info.dli_sname) + /* "function" */ + 1 + /* "+" */ + 10 + /* "offset */ + 5 + /* "> at " */ + strlen(info.dli_fname) + /* "filename" */ + 1; /* "\0" */ + rval = realloc_safe(rval, clen + alen); + if (rval == NULL) + return NULL; + snprintf((char *) rval + clen, alen, "%p <%s+%d> at %s", + buffer[i], info.dli_sname, offset, info.dli_fname); + } else { + alen = 2 + /* "0x" */ + (sizeof(void *) * 2) + /* "01234567" */ + 1; /* "\0" */ + rval = realloc_safe(rval, clen + alen); + if (rval == NULL) + return NULL; + snprintf((char *) rval + clen, alen, "%p", buffer[i]); + } + rval[i] = (char *) clen; + clen += alen; + } + + for (i = 0; i < size; i++) + rval[i] += (long) rval; + + return rval; +} + +void +backtrace_symbols_fd(void *const *buffer, int size, int fd) +{ + int i, len, offset; + char *buf; + Dl_info info; + + for (i = 0; i < size; i++) { + if (dladdr(buffer[i], &info) != 0) { + if (info.dli_sname == NULL) + info.dli_sname = "???"; + if (info.dli_saddr == NULL) + info.dli_saddr = buffer[i]; + offset = buffer[i] - info.dli_saddr; + /* "0x01234567 at filename" */ + len = 2 + /* "0x" */ + (sizeof(void *) * 2) + /* "01234567" */ + 2 + /* " <" */ + strlen(info.dli_sname) + /* "function" */ + 1 + /* "+" */ + D10(offset) + /* "offset */ + 5 + /* "> at " */ + strlen(info.dli_fname) + /* "filename" */ + 2; /* "\n\0" */ + buf = alloca(len); + if (buf == NULL) + return; + snprintf(buf, len, "%p <%s+%d> at %s\n", + buffer[i], info.dli_sname, offset, info.dli_fname); + } else { + len = 2 + /* "0x" */ + (sizeof(void *) * 2) + /* "01234567" */ + 2; /* "\n\0" */ + buf = alloca(len); + if (buf == NULL) + return; + snprintf(buf, len, "%p\n", buffer[i]); + } + if (write(fd, buf, strlen(buf)) == -1) + return; + } +} +#endif diff --git a/contrib/libexecinfo/execinfo_compat.h b/contrib/libexecinfo/execinfo_compat.h new file mode 100644 index 00000000000..85f185dd5f7 --- /dev/null +++ b/contrib/libexecinfo/execinfo_compat.h @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2003 Maxim Sobolev + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: execinfo.h,v 1.2 2004/07/19 05:20:29 sobomax Exp $ + */ + +#ifndef _EXECINFO_H_ +#define _EXECINFO_H_ + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#ifndef HAVE_BACKTRACE +#ifdef __cplusplus +extern "C" { +#endif + +int backtrace(void **, int); +char **backtrace_symbols(void *const *, int); +void backtrace_symbols_fd(void *const *, int, int); + +#ifdef __cplusplus +} +#endif +#endif + +#endif /* _EXECINFO_H_ */ diff --git a/contrib/mount/mntent.c b/contrib/mount/mntent.c index 991e694f1cd..e9b448845a7 100644 --- a/contrib/mount/mntent.c +++ b/contrib/mount/mntent.c @@ -35,7 +35,7 @@ * SUCH DAMAGE. */ -#if defined(GF_DARWIN_HOST_OS) || defined(__NetBSD__) +#if !defined(GF_LINUX_HOST_OS) #include #include #include @@ -103,7 +103,9 @@ flags2opts (int flags) if (flags & MNT_SYNCHRONOUS) res = concatopt(res, "sync"); if (flags & MNT_NOEXEC) res = concatopt(res, "noexec"); if (flags & MNT_NOSUID) res = concatopt(res, "nosuid"); +#if !defined(__FreeBSD__) if (flags & MNT_NODEV) res = concatopt(res, "nodev"); +#endif /* __FreeBSD__ */ if (flags & MNT_UNION) res = concatopt(res, "union"); if (flags & MNT_ASYNC) res = concatopt(res, "async"); #if !defined(GF_DARWIN_HOST_OS) @@ -211,4 +213,4 @@ endmntent (FILE *fp) return 1; /* endmntent() always returns 1 */ } -#endif /* GF_DARWIN_HOST_OS || __NetBSD__ */ +#endif /* !GF_LINUX_HOST_OS */ diff --git a/contrib/mount/mntent_compat.h b/contrib/mount/mntent_compat.h index 3f9cc931266..ca82e9aa60f 100644 --- a/contrib/mount/mntent_compat.h +++ b/contrib/mount/mntent_compat.h @@ -11,7 +11,7 @@ #ifndef _MNTENT_H #define _MNTENT_H -#if defined(GF_DARWIN_HOST_OS) || defined(__NetBSD__) +#if !defined(GF_LINUX_HOST_OS) #include struct mntent { diff --git a/contrib/qemu/include/qemu/bswap.h b/contrib/qemu/include/qemu/bswap.h index 1ea5b101e89..bf6457b8c46 100644 --- a/contrib/qemu/include/qemu/bswap.h +++ b/contrib/qemu/include/qemu/bswap.h @@ -11,6 +11,8 @@ # include # include # include +#elif defined(__FreeBSD__) +# include #elif defined(CONFIG_BYTESWAP_H) #ifdef GF_DARWIN_HOST_OS # include diff --git a/contrib/qemu/util/oslib-posix.c b/contrib/qemu/util/oslib-posix.c index 3dc8b1b0743..5dceea5f581 100644 --- a/contrib/qemu/util/oslib-posix.c +++ b/contrib/qemu/util/oslib-posix.c @@ -93,7 +93,7 @@ void *qemu_memalign(size_t alignment, size_t size) size, strerror(ret)); abort(); } -#elif defined(CONFIG_BSD) +#elif defined(GF_BSD_HOST_OS) ptr = qemu_oom_check(valloc(size)); #else ptr = qemu_oom_check(memalign(alignment, size)); @@ -193,7 +193,7 @@ int qemu_utimens(const char *path, const struct timespec *times) struct timeval tv[2], tv_now; struct stat st; int i; -#ifdef CONFIG_UTIMENSAT +#if defined(CONFIG_UTIMENSAT) && !defined(__FreeBSD__) int ret; ret = utimensat(AT_FDCWD, path, times, AT_SYMLINK_NOFOLLOW); diff --git a/extras/geo-rep/Makefile.am b/extras/geo-rep/Makefile.am index 6d3d10b88a0..0cd6b1b7a02 100644 --- a/extras/geo-rep/Makefile.am +++ b/extras/geo-rep/Makefile.am @@ -5,7 +5,7 @@ scripts_DATA = gsync-upgrade.sh generate-gfid-file.sh get-gfid.sh \ scripts_PROGRAMS = gsync-sync-gfid gsync_sync_gfid_CFLAGS = $(GF_CFLAGS) -Wall -I$(top_srcdir)/libglusterfs/src gsync_sync_gfid_LDFLAGS = $(GF_LDFLAGS) -gsync_sync_gfid_LDADD = $(GF_LIBS) $(top_builddir)/libglusterfs/src/libglusterfs.la +gsync_sync_gfid_LDADD = $(GF_LIBS) $(top_builddir)/libglusterfs/src/libglusterfs.la $(GF_GLUSTERFS_LIBS) gsync_sync_gfid_SOURCES = gsync-sync-gfid.c EXTRA_DIST = gsync-sync-gfid.c gsync-upgrade.sh generate-gfid-file.sh \ diff --git a/extras/init.d/Makefile.am b/extras/init.d/Makefile.am index 38898fddd2e..61dde2d396e 100644 --- a/extras/init.d/Makefile.am +++ b/extras/init.d/Makefile.am @@ -1,13 +1,13 @@ -EXTRA_DIST = glusterd-Debian glusterd-Redhat glusterd-SuSE glusterd.plist rhel5-load-fuse.modules +EXTRA_DIST = glusterd-Debian glusterd-FreeBSD glusterd-Redhat glusterd-SuSE glusterd.plist rhel5-load-fuse.modules -CLEANFILES = +CLEANFILES = INIT_DIR = @initdir@ SYSTEMD_DIR = @systemddir@ LAUNCHD_DIR = @launchddir@ -$(GF_DISTRIBUTION): +$(GF_DISTRIBUTION): @if [ ! -d $(SYSTEMD_DIR) ]; then \ $(mkdir_p) $(DESTDIR)$(INIT_DIR); \ $(INSTALL_PROGRAM) glusterd-$(GF_DISTRIBUTION) $(DESTDIR)$(INIT_DIR)/glusterd; \ @@ -15,7 +15,7 @@ $(GF_DISTRIBUTION): install-exec-local: $(GF_DISTRIBUTION) -install-data-local: +install-data-local: if GF_DARWIN_HOST_OS $(mkdir_p) $(DESTDIR)$(LAUNCHD_DIR) $(INSTALL_PROGRAM) glusterd.plist $(DESTDIR)$(LAUNCHD_DIR)/com.gluster.glusterd.plist diff --git a/extras/init.d/glusterd-FreeBSD.in b/extras/init.d/glusterd-FreeBSD.in new file mode 100644 index 00000000000..5eed6360a89 --- /dev/null +++ b/extras/init.d/glusterd-FreeBSD.in @@ -0,0 +1,24 @@ +#!/bin/sh +# +# $FreeBSD$ +# + +# PROVIDE: glusterd + +. /etc/rc.subr + +name="glusterd" +rcvar=`set_rcvar` +command=@prefix@/sbin/${name} +pidfile="/var/run/${name}.pid" +glusterd_flags="-p /var/run/${name}.pid" +start_precmd="glusterd_prestart" + +glusterd_prestart() +{ + mkdir -p /var/lib/glusterd /var/log/glusterfs + return 0 +} + +load_rc_config $name +run_rc_command "$1" diff --git a/libglusterfs/src/Makefile.am b/libglusterfs/src/Makefile.am index ccac1a1e825..25ee4c27a8b 100644 --- a/libglusterfs/src/Makefile.am +++ b/libglusterfs/src/Makefile.am @@ -1,10 +1,10 @@ -libglusterfs_la_CFLAGS = -Wall $(GF_CFLAGS) \ - $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \ - -DDATADIR=\"$(localstatedir)\" +libglusterfs_la_CFLAGS = -Wall $(GF_CFLAGS) $(GF_DARWIN_LIBGLUSTERFS_CFLAGS) \ + -DDATADIR=\"$(localstatedir)\" libglusterfs_la_CPPFLAGS = $(GF_CPPFLAGS) -D__USE_FILE_OFFSET64 \ -DXLATORDIR=\"$(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator\" \ - -I$(top_srcdir)/rpc/rpc-lib/src/ -I$(CONTRIBDIR)/rbtree + -I$(top_srcdir)/rpc/rpc-lib/src/ -I$(CONTRIBDIR)/rbtree \ + -I$(CONTRIBDIR)/libexecinfo libglusterfs_la_LIBADD = @LEXLIB@ libglusterfs_la_LDFLAGS = -version-info $(LIBGLUSTERFS_LT_VERSION) @@ -27,7 +27,7 @@ libglusterfs_la_SOURCES = dict.c xlator.c logging.c \ event-history.c gidcache.c ctx.c client_t.c event-poll.c event-epoll.c \ $(CONTRIBDIR)/libgen/basename_r.c $(CONTRIBDIR)/libgen/dirname_r.c \ $(CONTRIBDIR)/stdlib/gf_mkostemp.c strfd.c \ - $(CONTRIBDIR)/mount/mntent.c + $(CONTRIBDIR)/mount/mntent.c $(CONTRIBDIR)/libexecinfo/execinfo.c nodist_libglusterfs_la_SOURCES = y.tab.c graph.lex.c @@ -44,7 +44,8 @@ noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h timespec. run.h options.h lkowner.h fd-lk.h circ-buff.h event-history.h \ gidcache.h client_t.h glusterfs-acl.h glfs-message-id.h \ template-component-messages.h strfd.h \ - $(CONTRIBDIR)/mount/mntent_compat.h lvm-defaults.h + $(CONTRIBDIR)/mount/mntent_compat.h lvm-defaults.h \ + $(CONTRIBDIR)/libexecinfo/execinfo_compat.h EXTRA_DIST = graph.l graph.y diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index 6ba5223da0b..124b312f4a1 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -15,6 +15,8 @@ #ifdef HAVE_BACKTRACE #include +#else +#include "execinfo_compat.h" #endif #include @@ -33,7 +35,7 @@ #include #include -#if defined GF_BSD_HOST_OS || defined GF_DARWIN_HOST_OS +#if defined(GF_BSD_HOST_OS) || defined(GF_DARWIN_HOST_OS) #include #endif @@ -531,11 +533,9 @@ gf_print_trace (int32_t signum, glusterfs_ctx_t *ctx) } gf_dump_config_flags (); -#if HAVE_BACKTRACE gf_msg_backtrace_nomem (GF_LOG_ALERT, 200); sprintf (msg, "---------"); gf_msg_plain_nomem (GF_LOG_ALERT, msg); -#endif /* HAVE_BACKTRACE */ /* Send a signal to terminate the process */ signal (signum, SIG_DFL); @@ -3062,82 +3062,29 @@ gf_set_log_ident (cmd_args_t *cmd_args) int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg) -{ - sigset_t set, old; - int ret; - - sigemptyset (&set); - - sigfillset (&set); - sigdelset (&set, SIGSEGV); - sigdelset (&set, SIGBUS); - sigdelset (&set, SIGILL); - sigdelset (&set, SIGSYS); - sigdelset (&set, SIGFPE); - sigdelset (&set, SIGABRT); - - pthread_sigmask (SIG_BLOCK, &set, &old); - - ret = pthread_create (thread, attr, start_routine, arg); - - pthread_sigmask (SIG_SETMASK, &old, NULL); - - return ret; -} - -#ifdef __NetBSD__ -#ifdef __MACHINE_STACK_GROWS_UP -#define BELOW > -#else -#define BELOW < -#endif - -struct frameinfo { - struct frameinfo *next; - void *return_address; -}; - -size_t -backtrace(void **trace, size_t len) + void *(*start_routine)(void *), void *arg) { - const struct frameinfo *frame = __builtin_frame_address(0); - void *stack = &stack; - size_t i; + sigset_t set, old; + int ret; - for (i = 0; i < len; i++) { - if ((void *)frame BELOW stack) - return i; - trace[i] = frame->return_address; - frame = frame->next; - } + sigemptyset (&set); - return len; -} + sigfillset (&set); + sigdelset (&set, SIGSEGV); + sigdelset (&set, SIGBUS); + sigdelset (&set, SIGILL); + sigdelset (&set, SIGSYS); + sigdelset (&set, SIGFPE); + sigdelset (&set, SIGABRT); -char ** -backtrace_symbols(void *const *trace, size_t len) -{ - static const size_t slen = sizeof("0x123456789abcdef"); - char **ptr = calloc(len, sizeof(*ptr) + slen); - size_t i; + pthread_sigmask (SIG_BLOCK, &set, &old); - if (ptr == NULL) - return NULL; + ret = pthread_create (thread, attr, start_routine, arg); - char *str = (void *)(ptr + len); - size_t cur = 0, left = len * slen; + pthread_sigmask (SIG_SETMASK, &old, NULL); - for (i = 0; i < len; i++) { - ptr[i] = str + cur; - cur += snprintf(str + cur, left - cur, "%p", trace[i]) + 1; - assert(cur < left); - } - - return ptr; + return ret; } -#undef BELOW -#endif /* __NetBSD__ */ int gf_skip_header_section (int fd, int header_len) diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 86848df452d..b4372f10bbc 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -621,12 +621,7 @@ gf_boolean_t gf_is_same_address (char *host1, char *host2); void md5_wrapper(const unsigned char *data, size_t len, char *md5); int gf_thread_create (pthread_t *thread, const pthread_attr_t *attr, - void *(*start_routine)(void *), void *arg); -#ifdef __NetBSD__ -size_t backtrace(void **, size_t); -char **backtrace_symbols(void *const *, size_t); -#endif - + void *(*start_routine)(void *), void *arg); gf_boolean_t gf_is_service_running (char *pidfile, int *pid); int diff --git a/libglusterfs/src/compat.h b/libglusterfs/src/compat.h index 81408dbd0ae..5920fce992b 100644 --- a/libglusterfs/src/compat.h +++ b/libglusterfs/src/compat.h @@ -125,6 +125,11 @@ enum { #define sighandler_t sig_t #endif +#ifdef __FreeBSD__ +#undef ino_t +#define ino_t uint64_t +#endif /* __FreeBSD__ */ + #ifndef ino64_t #define ino64_t ino_t #endif @@ -153,6 +158,8 @@ enum { #define F_GETLK64 F_GETLK #define F_SETLK64 F_SETLK #define F_SETLKW64 F_SETLKW +#define FALLOC_FL_KEEP_SIZE 0x01 /* default is extend size */ +#define FALLOC_FL_PUNCH_HOLE 0x02 /* de-allocates range */ #endif /* GF_BSD_HOST_OS */ diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c index b3626538b96..e9734bcfca1 100644 --- a/libglusterfs/src/logging.c +++ b/libglusterfs/src/logging.c @@ -25,6 +25,8 @@ #ifdef HAVE_BACKTRACE #include +#else +#include "execinfo_compat.h" #endif #include @@ -814,8 +816,6 @@ _gf_log_callingfn (const char *domain, const char *file, const char *function, else basename = file; -#if HAVE_BACKTRACE - /* Print 'calling function' */ do { void *array[5]; char **callingfn = NULL; @@ -838,7 +838,6 @@ _gf_log_callingfn (const char *domain, const char *file, const char *function, free (callingfn); } while (0); -#endif /* HAVE_BACKTRACE */ if (ctx->log.log_control_file_found) { @@ -1070,7 +1069,6 @@ out: return ret; } -#if HAVE_BACKTRACE void _gf_msg_backtrace_nomem (gf_loglevel_t level, int stacksize) { @@ -1105,7 +1103,8 @@ _gf_msg_backtrace_nomem (gf_loglevel_t level, int stacksize) fileno (stderr); if (bt_size && (fd != -1)) { /* print to the file fd, to prevent any - * allocations from backtrace_symbols */ + allocations from backtrace_symbols + */ backtrace_symbols_fd (&array[0], bt_size, fd); } } @@ -1153,7 +1152,6 @@ out: FREE (callingfn); return ret; } -#endif /* HAVE_BACKTRACE */ int _gf_msg_nomem (const char *domain, const char *file, @@ -1261,9 +1259,7 @@ _gf_msg_nomem (const char *domain, const char *file, } pthread_mutex_unlock (&ctx->log.logfile_mutex); -#ifdef HAVE_BACKTRACE _gf_msg_backtrace_nomem (level, GF_LOG_BACKTRACE_DEPTH); -#endif break; } @@ -2035,7 +2031,6 @@ _gf_msg (const char *domain, const char *file, const char *function, if (level > ctx->log.loglevel) goto out; -#if HAVE_BACKTRACE if (trace) { ret = _gf_msg_backtrace (GF_LOG_BACKTRACE_DEPTH, callstr, GF_LOG_BACKTRACE_DEPTH); @@ -2044,7 +2039,6 @@ _gf_msg (const char *domain, const char *file, const char *function, else ret = 0; } -#endif /* HAVE_BACKTRACE */ pthread_mutex_lock (&ctx->log.logfile_mutex); { diff --git a/libglusterfs/src/store.h b/libglusterfs/src/store.h index beb17ac4a2f..1ffd97c526f 100644 --- a/libglusterfs/src/store.h +++ b/libglusterfs/src/store.h @@ -15,6 +15,7 @@ #include "config.h" #endif +#include "compat.h" #include "glusterfs.h" struct gf_store_handle_ { diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c index 7236958677d..48418091676 100644 --- a/libglusterfs/src/syscall.c +++ b/libglusterfs/src/syscall.c @@ -311,6 +311,8 @@ sys_fdatasync (int fd) { #ifdef GF_DARWIN_HOST_OS return fcntl (fd, F_FULLFSYNC); +#elif __FreeBSD__ + return fsync (fd); #else return fdatasync (fd); #endif diff --git a/rpc/rpc-lib/src/xdr-rpc.c b/rpc/rpc-lib/src/xdr-rpc.c index adb48a53186..d016668b9a3 100644 --- a/rpc/rpc-lib/src/xdr-rpc.c +++ b/rpc/rpc-lib/src/xdr-rpc.c @@ -193,7 +193,7 @@ xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au, GF_VALIDATE_OR_GOTO ("rpc", au, out); au->aup_machname = machname; -#ifdef GF_DARWIN_HOST_OS +#if defined(GF_DARWIN_HOST_OS) || defined(__FreeBSD__) au->aup_gids = (int *)gids; #else au->aup_gids = gids; diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index 8b8b97370de..61c9f60ff7f 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -766,7 +766,7 @@ __socket_keepalive (int fd, int family, int keepalive_intvl, int keepalive_idle) goto done; #if !defined(GF_LINUX_HOST_OS) && !defined(__NetBSD__) -#ifdef GF_SOLARIS_HOST_OS +#if defined(GF_SOLARIS_HOST_OS) || defined(__FreeBSD__) ret = setsockopt (fd, SOL_SOCKET, SO_KEEPALIVE, &keepalive_intvl, sizeof (keepalive_intvl)); #else diff --git a/xlators/cluster/dht/src/dht-common.c b/xlators/cluster/dht/src/dht-common.c index e172569f3e1..45450d5f383 100644 --- a/xlators/cluster/dht/src/dht-common.c +++ b/xlators/cluster/dht/src/dht-common.c @@ -26,6 +26,7 @@ #include #include +#include int dht_aggregate (dict_t *this, char *key, data_t *value, void *data) diff --git a/xlators/cluster/dht/src/dht-rebalance.c b/xlators/cluster/dht/src/dht-rebalance.c index 9cdb4453820..eca1d52b62b 100644 --- a/xlators/cluster/dht/src/dht-rebalance.c +++ b/xlators/cluster/dht/src/dht-rebalance.c @@ -18,6 +18,7 @@ #include "xlator.h" #include #include +#include #define GF_DISK_SECTOR_SIZE 512 #define DHT_REBALANCE_PID 4242 /* Change it if required */ diff --git a/xlators/encryption/crypt/src/crypt.h b/xlators/encryption/crypt/src/crypt.h index eb7291f13c5..b7aefc3d2c5 100644 --- a/xlators/encryption/crypt/src/crypt.h +++ b/xlators/encryption/crypt/src/crypt.h @@ -39,7 +39,7 @@ #define MASTER_VOL_KEY_SIZE (32) #define NMTD_VOL_KEY_SIZE (16) -#if defined(__NetBSD__) +#if defined(GF_BSD_HOST_OS) typedef off_t loff_t; #endif diff --git a/xlators/features/protect/src/Makefile.am b/xlators/features/protect/src/Makefile.am index 968e88c457a..fdfed4b219e 100644 --- a/xlators/features/protect/src/Makefile.am +++ b/xlators/features/protect/src/Makefile.am @@ -14,8 +14,8 @@ prot_server_la_LDFLAGS = -module -avoid-version prot_server_la_SOURCES = prot_server.c prot_server_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la -AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src +AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \ + -I$(CONTRIBDIR)/libexecinfo AM_CFLAGS = -Wall $(GF_CFLAGS) -CLEANFILES = - +CLEANFILES = diff --git a/xlators/features/protect/src/prot_client.c b/xlators/features/protect/src/prot_client.c index d09715067bd..500c772bedd 100644 --- a/xlators/features/protect/src/prot_client.c +++ b/xlators/features/protect/src/prot_client.c @@ -15,8 +15,10 @@ #include "xlator.h" #include "defaults.h" -#ifndef __NetBSD__ +#ifdef HAVE_BACKTRACE #include +#else +#include "execinfo_compat.h" #endif #define NUM_FRAMES 20 @@ -44,20 +46,20 @@ pcli_print_trace (char *name, call_frame_t *frame) frame = frame->next; } - size = backtrace(frames,NUM_FRAMES); + size = backtrace (frames, NUM_FRAMES); if (size <= 0) { return; } - symbols = backtrace_symbols(frames,size); + symbols = backtrace_symbols (frames, size); if (!symbols) { return; } - gf_log(name, GF_LOG_INFO, "Processor stack:"); + gf_log (name, GF_LOG_INFO, "Processor stack:"); for (i = 0; i < size; ++i) { gf_log (name, GF_LOG_INFO, "%s", symbols[i]); } - free(symbols); + free (symbols); } int32_t @@ -73,14 +75,14 @@ pcli_rename (call_frame_t *frame, xlator_t *this, loc_t *oldloc, if (!oldloc->parent) { goto simple_unwind; } - if (inode_ctx_get(oldloc->parent,this,&value) != 0) { + if (inode_ctx_get (oldloc->parent, this, &value) != 0) { goto simple_unwind; } if (value != PROT_ACT_NONE) { gf_log (this->name, GF_LOG_WARNING, "got rename for protected %s", oldloc->path); - pcli_print_trace(this->name,frame->next); + pcli_print_trace (this->name, frame->next); if (value == PROT_ACT_REJECT) { STACK_UNWIND_STRICT (rename, frame, -1, EPERM, NULL, NULL, NULL, NULL, NULL, @@ -181,25 +183,25 @@ simple_unwind: int32_t init (xlator_t *this) { - if (!this->children || this->children->next) { - gf_log (this->name, GF_LOG_ERROR, - "translator not configured with exactly one child"); - return -1; - } - - if (!this->parents) { - gf_log (this->name, GF_LOG_WARNING, - "dangling volume. check volfile "); - } - - return 0; + if (!this->children || this->children->next) { + gf_log (this->name, GF_LOG_ERROR, + "translator not configured with exactly one child"); + return -1; + } + + if (!this->parents) { + gf_log (this->name, GF_LOG_WARNING, + "dangling volume. check volfile "); + } + + return 0; } void fini (xlator_t *this) { - return; + return; } @@ -213,5 +215,5 @@ struct xlator_cbks cbks = { }; struct volume_options options[] = { - { .key = {NULL} }, + { .key = {NULL} }, }; diff --git a/xlators/meta/src/meta-defaults.c b/xlators/meta/src/meta-defaults.c index 0f439c3ab4b..c34055bb221 100644 --- a/xlators/meta/src/meta-defaults.c +++ b/xlators/meta/src/meta-defaults.c @@ -19,6 +19,7 @@ #include "meta-mem-types.h" #include "meta.h" +#include "compat-errno.h" int meta_default_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index 3e29a9601bc..e4a48439812 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -482,7 +482,7 @@ glusterd_set_quota_limit (char *volname, char *path, char *hard_limit, ret = sys_lsetxattr (abspath, "trusted.glusterfs.quota.limit-set", (char *)(void *)&new_limit, sizeof (new_limit), 0); - if (ret) { + if (ret == -1) { gf_asprintf (op_errstr, "setxattr of " "'trusted.glusterfs.quota.limit-set' failed on %s." " Reason : %s", abspath, strerror (errno)); diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index 3095414b88e..c1ddc0849cc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -20,7 +20,7 @@ #include #include -#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS) +#if defined(GF_LINUX_HOST_OS) #include #else #include "mntent_compat.h" @@ -30,7 +30,7 @@ #define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0) #endif -#ifdef GF_DARWIN_HOST_OS +#if defined(GF_DARWIN_HOST_OS) || defined(__FreeBSD__) #include #include #define umount2(dir, flags) unmount(dir, ((flags) != 0) ? MNT_FORCE : 0) @@ -3743,7 +3743,7 @@ glusterd_snap_brick_create (glusterd_volinfo_t *snap_volinfo, GF_XATTR_VOL_ID_KEY, snap_volinfo->volume_id, 16, XATTR_REPLACE); - if (ret) { + if (ret == -1) { gf_log (this->name, GF_LOG_ERROR, "Failed to set " "extended attribute %s on %s. Reason: " "%s, snap: %s", GF_XATTR_VOL_ID_KEY, @@ -4043,8 +4043,13 @@ glusterd_update_fs_uuid (glusterd_brickinfo_t *brickinfo) * file-system which is sharing the UUID with any other * file-system on the system. */ +#ifdef GF_LINUX_HOST_OS ret = mount (brickinfo->device_path, mount_path, brickinfo->fstype, 0, "nouuid"); +#else + ret = -1; +#endif + if (ret) { gf_log (this->name, GF_LOG_ERROR, "Failed to mount " "%s at %s", brickinfo->device_path, diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index 0177ed169fc..e03ec7af9f5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -45,7 +45,7 @@ #include #include -#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS) +#if defined(GF_LINUX_HOST_OS) #include #else #include "mntent_compat.h" diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index fb677200a7e..6b973a3638d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -13,7 +13,7 @@ #endif #include -#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS) +#if defined(GF_LINUX_HOST_OS) #include #else #include "mntent_compat.h" @@ -722,7 +722,7 @@ glusterd_snap_volinfo_restore (dict_t *dict, dict_t *rsp_dict, new_volinfo->volume_id, sizeof (new_volinfo->volume_id), XATTR_REPLACE); - if (ret) { + if (ret == -1) { gf_log (this->name, GF_LOG_ERROR, "Failed to " "set extended attribute %s on %s. " "Reason: %s, snap: %s", @@ -7438,7 +7438,6 @@ glusterd_add_brick_to_dict (glusterd_volinfo_t *volinfo, xlator_t *this = NULL; glusterd_conf_t *priv = NULL; - GF_ASSERT (volinfo); GF_ASSERT (brickinfo); GF_ASSERT (dict); @@ -8109,7 +8108,7 @@ glusterd_check_and_set_brick_xattr (char *host, char *path, uuid_t uuid, /* Check for xattr support in backend fs */ ret = sys_lsetxattr (path, "trusted.glusterfs.test", "working", 8, 0); - if (ret) { + if (ret == -1) { snprintf (msg, sizeof (msg), "Glusterfs is not" " supported on brick: %s:%s.\nSetting" " extended attributes failed, reason:" @@ -8135,7 +8134,7 @@ glusterd_check_and_set_brick_xattr (char *host, char *path, uuid_t uuid, ret = sys_lsetxattr (path, GF_XATTR_VOL_ID_KEY, uuid, 16, flags); - if (ret) { + if (ret == -1) { snprintf (msg, sizeof (msg), "Failed to set extended " "attributes %s, reason: %s", GF_XATTR_VOL_ID_KEY, strerror (errno)); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index aa9805092fa..53beebe0555 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1055,7 +1055,7 @@ glusterd_op_stage_start_volume (dict_t *dict, char **op_errstr, GF_XATTR_VOL_ID_KEY, volinfo->volume_id, 16, XATTR_CREATE); - if (ret) { + if (ret == -1) { snprintf (msg, sizeof (msg), "Failed to set " "extended attribute %s on %s. Reason: " "%s", GF_XATTR_VOL_ID_KEY, diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index d5ca4d146aa..473911a2cb0 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -12,6 +12,8 @@ #include "fuse-bridge.h" #include "mount-gluster-compat.h" #include "glusterfs.h" +#include "byte-order.h" +#include "compat-errno.h" #include "glusterfs-acl.h" #ifdef __NetBSD__ diff --git a/xlators/mount/fuse/src/fuse-bridge.h b/xlators/mount/fuse/src/fuse-bridge.h index f1c4cb3f0d8..c08d55daf4b 100644 --- a/xlators/mount/fuse/src/fuse-bridge.h +++ b/xlators/mount/fuse/src/fuse-bridge.h @@ -32,8 +32,6 @@ #include "statedump.h" #ifdef GF_DARWIN_HOST_OS -/* This is MacFUSE's marker for MacFUSE-specific code */ -#define __FreeBSD__ 10 #include "fuse_kernel_macfuse.h" #else #include "fuse_kernel.h" @@ -47,7 +45,7 @@ #include "syncop.h" #include "gidcache.h" -#if defined(GF_LINUX_HOST_OS) || defined(__NetBSD__) +#if defined(GF_LINUX_HOST_OS) || defined(__FreeBSD__) || defined(__NetBSD__) #define FUSE_OP_HIGH (FUSE_READDIRPLUS + 1) #endif #ifdef GF_DARWIN_HOST_OS diff --git a/xlators/mount/fuse/src/fuse-helpers.c b/xlators/mount/fuse/src/fuse-helpers.c index 0936d63111a..ef9bcd4e43e 100644 --- a/xlators/mount/fuse/src/fuse-helpers.c +++ b/xlators/mount/fuse/src/fuse-helpers.c @@ -11,13 +11,17 @@ #define _KMEMUSER #endif -#include "fuse-bridge.h" #if defined(GF_SOLARIS_HOST_OS) #include +#elif defined(__FreeBSD__) +#include +#include +#include #else #include #endif +#include "fuse-bridge.h" static void fuse_resolve_wipe (fuse_resolve_t *resolve) @@ -154,7 +158,8 @@ frame_fill_groups (call_frame_t *frame) char *endptr = NULL; int ret = 0; - ret = snprintf (filename, sizeof filename, "/proc/%d/status", frame->root->pid); + ret = snprintf (filename, sizeof filename, "/proc/%d/status", + frame->root->pid); if (ret >= sizeof filename) goto out; @@ -162,8 +167,8 @@ frame_fill_groups (call_frame_t *frame) if (!fp) goto out; - if (call_stack_alloc_groups (frame->root, FUSE_MAX_AUX_GROUPS) != 0) - goto out; + if (call_stack_alloc_groups (frame->root, FUSE_MAX_AUX_GROUPS) != 0) + goto out; while ((ptr = fgets (line, sizeof line, fp))) { if (strncmp (ptr, "Groups:", 7) != 0) @@ -197,7 +202,7 @@ out: prcred_t *prcred = (prcred_t *) scratch; FILE *fp = NULL; int ret = 0; - int ngrps; + int ngrps; ret = snprintf (filename, sizeof filename, "/proc/%d/cred", frame->root->pid); @@ -207,21 +212,21 @@ out: if (fp != NULL) { if (fgets (scratch, sizeof scratch, fp) != NULL) { ngrps = MIN(prcred->pr_ngroups, - GF_MAX_AUX_GROUPS); - if (call_stack_alloc_groups (frame->root, - ngrps) != 0) - return; + FUSE_MAX_AUX_GROUPS); + if (call_stack_alloc_groups (frame->root, + ngrps) != 0) + return; } fclose (fp); } } #elif defined(CTL_KERN) /* DARWIN and *BSD */ - /* + /* N.B. CTL_KERN is an enum on Linux. (Meaning, if it's not - obvious, that it's not subject to preprocessor directives + obvious, that it's not subject to preprocessor directives like '#if defined'.) Unlike Linux, on Mac OS and the BSDs it is a #define. We - could test to see that KERN_PROC is defined, but, barring any + could test to see that KERN_PROC is defined, but, barring any evidence to the contrary, I think that's overkill. We might also test that GF_DARWIN_HOST_OS is defined, why limit this to just Mac OS. It's equally valid for the BSDs @@ -236,8 +241,8 @@ out: if (sysctl(name, namelen, &kp, &kplen, NULL, 0) != 0) return; ngroups = MIN(kp.kp_eproc.e_ucred.cr_ngroups, NGROUPS_MAX); - if (call_stack_alloc_groups (frame->root, ngroups) != 0) - return; + if (call_stack_alloc_groups (frame->root, ngroups) != 0) + return; for (i = 0; i < ngroups; i++) frame->root->groups[i] = kp.kp_eproc.e_ucred.cr_groups[i]; frame->root->ngrps = ngroups; diff --git a/xlators/mount/fuse/utils/Makefile.am b/xlators/mount/fuse/utils/Makefile.am index c626e2769fe..fdad27ad103 100644 --- a/xlators/mount/fuse/utils/Makefile.am +++ b/xlators/mount/fuse/utils/Makefile.am @@ -1,10 +1,9 @@ utildir = @mountutildir@ -if GF_DARWIN_HOST_OS -util_SCRIPTS = mount_glusterfs -else +if GF_LINUX_HOST_OS util_SCRIPTS = mount.glusterfs +else +util_SCRIPTS = mount_glusterfs endif -CLEANFILES = - +CLEANFILES = diff --git a/xlators/performance/md-cache/src/md-cache.c b/xlators/performance/md-cache/src/md-cache.c index 5de84cdc4d5..7588463b891 100644 --- a/xlators/performance/md-cache/src/md-cache.c +++ b/xlators/performance/md-cache/src/md-cache.c @@ -18,6 +18,7 @@ #include "dict.h" #include "xlator.h" #include "md-cache-mem-types.h" +#include "compat-errno.h" #include "glusterfs-acl.h" #include #include diff --git a/xlators/storage/posix/src/posix-handle.c b/xlators/storage/posix/src/posix-handle.c index 78aba988e31..b6cfbd081ea 100644 --- a/xlators/storage/posix/src/posix-handle.c +++ b/xlators/storage/posix/src/posix-handle.c @@ -26,6 +26,8 @@ #include "xlator.h" #include "syscall.h" +#include "compat-errno.h" + inode_t * posix_resolve (xlator_t *this, inode_table_t *itable, inode_t *parent, char *bname, struct iatt *iabuf) diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 143267637b5..c2f87c893d3 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -686,7 +686,7 @@ posix_gfid_set (xlator_t *this, const char *path, loc_t *loc, dict_t *xattr_req) } ret = sys_lsetxattr (path, GFID_XATTR_KEY, uuid_req, 16, XATTR_CREATE); - if (ret != 0) { + if (ret == -1) { gf_log (this->name, GF_LOG_WARNING, "setting GFID on %s failed (%s)", path, strerror (errno)); @@ -1268,6 +1268,11 @@ posix_acl_xattr_set (xlator_t *this, const char *path, dict_t *xattr_req) if (data) { ret = sys_lsetxattr (path, POSIX_ACL_ACCESS_XATTR, data->data, data->len, 0); +#ifdef __FreeBSD__ + if (ret != -1) { + ret = 0; + } +#endif /* __FreeBSD__ */ if (ret != 0) goto out; } @@ -1276,6 +1281,11 @@ posix_acl_xattr_set (xlator_t *this, const char *path, dict_t *xattr_req) if (data) { ret = sys_lsetxattr (path, POSIX_ACL_DEFAULT_XATTR, data->data, data->len, 0); +#ifdef __FreeBSD__ + if (ret != -1) { + ret = 0; + } +#endif /* __FreeBSD__ */ if (ret != 0) goto out; } diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 35e34c4bec6..ef98939c46d 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -5344,7 +5344,7 @@ init (xlator_t *this) /* Check for Extended attribute support, if not present, log it */ op_ret = sys_lsetxattr (dir_data->data, "trusted.glusterfs.test", "working", 8, 0); - if (op_ret == 0) { + if (op_ret != -1) { sys_lremovexattr (dir_data->data, "trusted.glusterfs.test"); } else { tmp_data = dict_get (this->options, @@ -5451,7 +5451,7 @@ init (xlator_t *this) /* First time volume, set the GFID */ size = sys_lsetxattr (dir_data->data, "trusted.gfid", rootgfid, 16, XATTR_CREATE); - if (size) { + if (size == -1) { gf_log (this->name, GF_LOG_ERROR, "%s: failed to set gfid (%s)", dir_data->data, strerror (errno)); -- cgit