diff options
129 files changed, 2444 insertions, 801 deletions
diff --git a/.gitignore b/.gitignore index adedb358513..7e8e11c70a3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ install-sh  ltmain.sh  Makefile.in  missing -py-compile +*compile  *.gcda  *.gcno  *.sw? @@ -24,6 +24,9 @@ py-compile  .deps  Makefile  stamp-h1 +# Softlinks to test and log +log +*.vol  # Generated files  api/examples/__init__.py @@ -39,11 +42,14 @@ extras/systemd/glusterd.service  extras/ocf/glusterd  extras/ocf/volume  extras/who-wrote-glusterfs/gitdm +extras/geo-rep/gsync-sync-gfid  glusterfs-api.pc  glusterfs.spec  glusterfsd/src/glusterfsd +glusterfsd/src/glusterd +glusterfsd/src/glusterfs  libgfchangelog.pc -libglusterfs/src/spec.lex.c +libglusterfs/src/graph.lex.c  libglusterfs/src/y.tab.c  libglusterfs/src/y.tab.h  libglusterfs/src/gf-error-codes.h @@ -54,3 +60,7 @@ xlators/mount/fuse/utils/mount_glusterfs  xlators/features/glupy/src/setup.py  geo-replication/src/peer_add_secret_pub  geo-replication/src/peer_gsec_create +geo-replication/src/gsyncd +cli/src/gluster +contrib/fuse-util/fusermount-glusterfs +geo-replication/src/gsyncd diff --git a/api/src/glfs-mgmt.c b/api/src/glfs-mgmt.c index e2a52c32468..5c7e8b2fc2a 100644 --- a/api/src/glfs-mgmt.c +++ b/api/src/glfs-mgmt.c @@ -31,6 +31,7 @@  #include "protocol-common.h"  #include "glusterfs3.h"  #include "portmap-xdr.h" +#include "xdr-common.h"  #include "xdr-generic.h"  #include "syncop.h" diff --git a/cli/src/Makefile.am b/cli/src/Makefile.am index 4f8f239351a..923600fbde2 100644 --- a/cli/src/Makefile.am +++ b/cli/src/Makefile.am @@ -21,7 +21,7 @@ AM_CPPFLAGS = $(GF_CPPFLAGS) \  	-DSYNCDAEMON_COMPILE=$(SYNCDAEMON_COMPILE) -DSBIN_DIR=\"$(sbindir)\"\  	$(XML_CPPFLAGS) -AM_CFLAGS = -Wall $(GF_GLUSTERFS_CFLAGS) +AM_CFLAGS = -Wall $(GF_CFLAGS)  CLEANFILES = diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c index 9714449c19d..36f710f0385 100644 --- a/cli/src/cli-cmd-parser.c +++ b/cli/src/cli-cmd-parser.c @@ -620,7 +620,7 @@ cli_cmd_quota_parse (const char **words, int wordcount, dict_t **options)                          goto out;                  } -                ret = gf_string2bytesize (words[5], &value); +                ret = gf_string2bytesize_uint64 (words[5], &value);                  if (ret != 0) {                          if (errno == ERANGE)                                  cli_err ("Value too large: %s", words[5]); @@ -1750,7 +1750,7 @@ config_parse (const char **words, int wordcount, dict_t *dict,                                  ret = -1;                                  goto out;                          } -                        snprintf (append_str, 300, "now:%ld.%06ld", +                        snprintf (append_str, 300, "now:%" GF_PRI_SECOND ".%06"GF_PRI_SUSECONDS,                                    tv.tv_sec, tv.tv_usec);                  } @@ -3025,7 +3025,7 @@ cli_snap_create_parse (dict_t *dict, const char **words, int wordcount) {                              && (strcmp (words[i], "force") != 0); i++) {                  volcount++;                  /* volume index starts from 1 */ -                ret = snprintf (key, sizeof (key), "volname%ld", volcount); +                ret = snprintf (key, sizeof (key), "volname%"PRIu64, volcount);                  if (ret < 0) {                          goto out;                  } diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c index 3b927d2bd3c..53c94c68779 100644 --- a/cli/src/cli-cmd-volume.c +++ b/cli/src/cli-cmd-volume.c @@ -2008,14 +2008,14 @@ cli_print_detailed_status (cli_volume_status_t *status)          if (status->total_inodes) { -                cli_out ("%-20s : %-20ld", "Inode Count", +                cli_out ("%-20s : %-20"GF_PRI_INODE, "Inode Count",                           status->total_inodes);          } else {                  cli_out ("%-20s : %-20s", "Inode Count", "N/A");          }          if (status->free_inodes) { -                cli_out ("%-20s : %-20ld", "Free Inodes", +                cli_out ("%-20s : %-20"GF_PRI_INODE, "Free Inodes",                           status->free_inodes);          } else {                  cli_out ("%-20s : %-20s", "Free Inodes", "N/A"); diff --git a/cli/src/cli-rpc-ops.c b/cli/src/cli-rpc-ops.c index ebabf6b3dba..8481d468cfa 100644 --- a/cli/src/cli-rpc-ops.c +++ b/cli/src/cli-rpc-ops.c @@ -5211,7 +5211,7 @@ gf_cli_top_volume_cbk (struct rpc_req *req, struct iovec *iov,                                  gf_time_fmt (timestr, sizeof timestr,                                               time_sec, gf_timefmt_FT);                                  snprintf (timestr + strlen (timestr), sizeof timestr - strlen (timestr), -                                  ".%"GF_PRI_SUSECONDS, time_usec); +                                  ".%ld", time_usec);                                  if (strlen (filename) < VOL_TOP_PERF_FILENAME_DEF_WIDTH)                                          cli_out ("%*"PRIu64" %-*s %-*s",                                                   VOL_TOP_PERF_SPEED_WIDTH, @@ -7766,7 +7766,7 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)                  }                  for (i = 0; i < voldisplaycount; i++) { -                        snprintf (buf, sizeof(buf), "volume%ld-volname", i); +                        snprintf (buf, sizeof(buf), "volume%"PRIu64"-volname", i);                          ret = dict_get_str (dict, buf, &volname);                          if (ret) {                                  gf_log ("cli", GF_LOG_ERROR, "Could not fetch " @@ -7777,7 +7777,7 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)                          cli_out ("\nVolume : %s", volname);                          snprintf (buf, sizeof(buf), -                                  "volume%ld-snap-max-hard-limit", i); +                                  "volume%"PRIu64"-snap-max-hard-limit", i);                          ret = dict_get_uint64 (dict, buf, &value);                          if (ret) {                                  gf_log ("cli", GF_LOG_ERROR, "Could not fetch " @@ -7788,7 +7788,7 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)                          cli_out ("snap-max-hard-limit : %"PRIu64, value);                          snprintf (buf, sizeof(buf), -                                  "volume%ld-active-hard-limit", i); +                                  "volume%"PRIu64"-active-hard-limit", i);                          ret = dict_get_uint64 (dict, buf, &value);                          if (ret) {                                   gf_log ("cli", GF_LOG_ERROR, "Could not fetch" @@ -7801,7 +7801,7 @@ cli_snapshot_config_display (dict_t *dict, gf_cli_rsp *rsp)                                   value);                          snprintf (buf, sizeof(buf), -                                      "volume%ld-snap-max-soft-limit", i); +                                      "volume%"PRIu64"-snap-max-soft-limit", i);                          ret = dict_get_uint64 (dict, buf, &value);                          if (ret) {                                  gf_log ("cli", GF_LOG_ERROR, "Could not fetch " diff --git a/cli/src/cli-xml-output.c b/cli/src/cli-xml-output.c index 863e8a4a6c6..0eb23bff20d 100644 --- a/cli/src/cli-xml-output.c +++ b/cli/src/cli-xml-output.c @@ -2299,7 +2299,7 @@ cli_xml_output_vol_profile (dict_t *dict, int op_ret, int op_errno,                                  goto out;                          ret = xmlTextWriterWriteFormatElement -                                (writer, (xmlChar *)"clearStats", "%s",  +                                (writer, (xmlChar *)"clearStats", "%s",                                  stats_cleared ? "Cleared stats." :                                                   "Failed to clear stats.");                          if (ret) diff --git a/cli/src/cli.c b/cli/src/cli.c index 2c703689b59..745b0b45bf5 100644 --- a/cli/src/cli.c +++ b/cli/src/cli.c @@ -179,7 +179,7 @@ logging_init (glusterfs_ctx_t *ctx, struct cli_state *state)          /* CLI should not have something to DEBUG after the release,             hence defaulting to INFO loglevel */ -        gf_log_set_loglevel ((state->log_level == -1) ? GF_LOG_INFO : +        gf_log_set_loglevel ((state->log_level == GF_LOG_NONE) ? GF_LOG_INFO :                               state->log_level);          return 0; diff --git a/configure.ac b/configure.ac index 65e8cb7535f..9cc45a41e86 100644 --- a/configure.ac +++ b/configure.ac @@ -14,6 +14,9 @@ AC_SUBST([PACKAGE_RELEASE],           [m4_esyscmd([build-aux/pkg-version --release])])  AM_INIT_AUTOMAKE +# Removes warnings when using automake 1.14 around (...but option 'subdir-objects' is disabled ) +#but libglusterfs fails to build with contrib (Then are not set up that way?) +#AM_INIT_AUTOMAKE([subdir-objects])  m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES(yes)]) @@ -104,10 +107,10 @@ AC_CONFIG_FILES([Makefile                  xlators/protocol/server/Makefile                  xlators/protocol/server/src/Makefile                  xlators/features/Makefile -		xlators/features/changelog/Makefile -		xlators/features/changelog/src/Makefile -		xlators/features/changelog/lib/Makefile -		xlators/features/changelog/lib/src/Makefile +                xlators/features/changelog/Makefile +                xlators/features/changelog/src/Makefile +                xlators/features/changelog/lib/Makefile +                xlators/features/changelog/lib/src/Makefile                  xlators/features/glupy/Makefile                  xlators/features/glupy/examples/Makefile                  xlators/features/glupy/src/Makefile @@ -142,8 +145,8 @@ AC_CONFIG_FILES([Makefile                  xlators/encryption/rot-13/src/Makefile                  xlators/encryption/crypt/Makefile                  xlators/encryption/crypt/src/Makefile -		xlators/features/qemu-block/Makefile -		xlators/features/qemu-block/src/Makefile +                xlators/features/qemu-block/Makefile +                xlators/features/qemu-block/src/Makefile                  xlators/system/Makefile                  xlators/system/posix-acl/Makefile                  xlators/system/posix-acl/src/Makefile @@ -189,9 +192,9 @@ AC_CONFIG_FILES([Makefile                  api/examples/Makefile                  api/examples/__init__.py                  api/examples/setup.py -		geo-replication/Makefile -		geo-replication/src/Makefile -		geo-replication/syncdaemon/Makefile +                geo-replication/Makefile +                geo-replication/src/Makefile +                geo-replication/syncdaemon/Makefile                  glusterfs.spec])  AC_CANONICAL_HOST @@ -286,20 +289,24 @@ AC_CHECK_LIB([pthread], [pthread_mutex_init], , AC_MSG_ERROR([Posix threads libr  AC_CHECK_FUNC([dlopen], [has_dlopen=yes], AC_CHECK_LIB([dl], [dlopen], , AC_MSG_ERROR([Dynamic linking library required to build glusterfs]))) -AC_CHECK_FUNC([gettext], [has_gettext=yes], AC_CHECK_LIB([intl], [gettext], , AC_MSG_ERROR([gettext support is required to build glusterfs]))) +AC_CHECK_LIB([readline], [rl_do_undo], [RL_UNDO="yes"], [RL_UNDO="no"])  AC_CHECK_HEADERS([sys/xattr.h]) +AC_CHECK_HEADERS([sys/ioctl.h], AC_DEFINE(HAVE_IOCTL_IN_SYS_IOCTL_H, 1, [have sys/ioctl.h])) +  AC_CHECK_HEADERS([sys/extattr.h])  AC_CHECK_HEADERS([openssl/md5.h])  AC_CHECK_HEADERS([linux/falloc.h]) +AC_CHECK_HEADERS([libintl.h]) +  case $host_os in    darwin*) -    if ! test "`/usr/bin/sw_vers | grep ProductVersion: | cut -f 2 | cut -d. -f2`" -ge 5; then -      AC_MSG_ERROR([You need at least OS X 10.5 (Leopard) to build Glusterfs]) +    if ! test "`/usr/bin/sw_vers | grep ProductVersion: | cut -f 2 | cut -d. -f2`" -ge 7; then +      AC_MSG_ERROR([You need at least OS X 10.7 (Lion) to build Glusterfs])      fi      ;;  esac @@ -326,6 +333,12 @@ if test "x${have_setfsuid}" = "xyes" -a "x${have_setfsgid}" = "xyes"; then    AC_DEFINE(HAVE_SET_FSID, 1, [define if found setfsuid setfsgid])  fi +dnl test umount2 function +AC_CHECK_FUNC([umount2], [have_umount2=yes]) + +if test "x${have_umount2}" = "xyes"; then +   AC_DEFINE(HAVE_UMOUNT2, 1, [define if found umount2]) +fi  # FUSE section  AC_ARG_ENABLE([fuse-client], @@ -383,8 +396,7 @@ AC_ARG_ENABLE([crypt-xlator],  	AC_HELP_STRING([--enable-crypt-xlator], [Build crypt encryption xlator]))  if test "x$enable_crypt_xlator" = "xyes" -a "x$have_cmac_h" = "xno"; then -   echo "Encryption xlator requires OpenSSL with cmac.h" -   exit 1 +   AC_MSG_ERROR([Encryption xlator requires OpenSSL with cmac.h])  fi  BUILD_CRYPT_XLATOR=no @@ -439,7 +451,6 @@ if test "x${enable_qemu_block}" != "xno" -a "x${HAVE_GLIB_2}" = "xyes"; then                    	     Block translator enabled])  fi -AM_CONDITIONAL([ENABLE_QEMU_BLOCK], [test x$BUILD_QEMU_BLOCK = xyes])  # end QEMU_BLOCK section @@ -669,7 +680,7 @@ if test "x${have_llistxattr}" = "xyes"; then     AC_DEFINE(HAVE_LLISTXATTR, 1, [define if llistxattr exists])  fi -AC_CHECK_FUNC([fdatasync], [have_fdatasync=yes]) +AC_CHECK_FUNC([fdatasync], [have_fdatasync=no])  if test "x${have_fdatasync}" = "xyes"; then     AC_DEFINE(HAVE_FDATASYNC, 1, [define if fdatasync exists])  fi @@ -707,35 +718,52 @@ AC_SUBST(GF_DISTRIBUTION)  GF_HOST_OS=""  GF_LDFLAGS="-rdynamic" -# check for gcc -Werror=format-security -saved_CFLAGS=$CFLAGS -CFLAGS="-Wformat -Werror=format-security" +dnl check for gcc -Werror=format-security +saved_GF_CFLAGS="-Wformat -Werror=format-security"  AC_MSG_CHECKING([whether $CC accepts -Werror=format-security])  AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [cc_werror_format_security=yes], [cc_werror_format_security=no])  echo $cc_werror_format_security  if test "x$cc_werror_format_security" = "xno"; then -    CFLAGS="$saved_CFLAGS" +    GF_CFLAGS="$GF_CFLAGS"  else -    CFLAGS="$saved_CFLAGS $CFLAGS" +    GF_CFLAGS="$saved_GF_CFLAGS $GF_CFLAGS"  fi -# check for gcc -Werror=implicit-function-declaration -saved_CFLAGS=$CFLAGS -CFLAGS="-Werror=implicit-function-declaration" +dnl check for gcc -Werror=implicit-function-declaration +saved_GF_CFLAGS=$GF_CFLAGS +GF_CFLAGS="-Werror=implicit-function-declaration"  AC_MSG_CHECKING([whether $CC accepts -Werror=implicit-function-declaration])  AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [cc_werror_implicit=yes], [cc_werror_implicit=no])  echo $cc_werror_implicit  if test "x$cc_werror_implicit" = "xno"; then -    CFLAGS="$saved_CFLAGS" +    GF_CFLAGS="$saved_GF_CFLAGS"  else -    CFLAGS="$saved_CFLAGS $CFLAGS" +    GF_CFLAGS="$saved_GF_CFLAGS $GF_CFLAGS"  fi +dnl clang is mostly GCC-compatible, but its version is much lower, +dnl so we have to check for it. +AC_MSG_CHECKING([if compiling with clang]) + +AC_COMPILE_IFELSE( +[AC_LANG_PROGRAM([], [[ +#ifndef __clang__ +       not clang +#endif +]])], +[CLANG=yes], [CLANG=no]) + +AC_MSG_RESULT([$CLANG]) + +if test "x$CLANG" = "xyes"; then +    GF_COMPILER_FLAGS="-Wno-gnu -Wno-unknown-pragmas -Wno-deprecated-declarations -Wno-enum-conversion" +fi + +  case $host_os in       linux*)          GF_HOST_OS="GF_LINUX_HOST_OS"          GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}" -        GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"          GF_LDADD="${ARGP_STANDALONE_LDADD}"          GF_FUSE_CFLAGS="-DFUSERMOUNT_DIR=\\\"\$(bindir)\\\""          ;; @@ -743,7 +771,6 @@ case $host_os in          GF_HOST_OS="GF_SOLARIS_HOST_OS"          GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -m64"          GF_LDFLAGS="" -        GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"          GF_LDADD="${ARGP_STANDALONE_LDADD}"          GF_GLUSTERFS_LIBS="-lnsl -lresolv -lsocket"          BUILD_FUSE_CLIENT=no @@ -754,7 +781,6 @@ 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_GLUSTERFS_CFLAGS="${GF_CFLAGS}"          GF_LDADD="${ARGP_STANDALONE_LDADD}"          if test "x$ac_cv_header_execinfo_h" = "xyes"; then             GF_GLUSTERFS_LIBS="-lexecinfo" @@ -768,7 +794,6 @@ case $host_os in          GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS}"          GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_BASENAME"          GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_DIRNAME" -        GF_GLUSTERFS_CFLAGS="${GF_CFLAGS}"          GF_LDADD="${ARGP_STANDALONE_LDADD}"          if test "x$ac_cv_header_execinfo_h" = "xyes"; then             GF_GLUSTERFS_LIBS="-lexecinfo" @@ -778,24 +803,32 @@ case $host_os in       darwin*)          GF_HOST_OS="GF_DARWIN_HOST_OS"          LIBTOOL=glibtool -        GF_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D__DARWIN_64_BIT_INO_T -bundle -undefined suppress -flat_namespace -D_XOPEN_SOURCE" +        GF_CFLAGS="${GF_COMPILER_FLAGS} ${ARGP_STANDALONE_CPPFLAGS} -D__DARWIN_64_BIT_INO_T -D_XOPEN_SOURCE "          GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_BASENAME"          GF_CFLAGS="${GF_CFLAGS} -DTHREAD_UNSAFE_DIRNAME" -        GF_GLUSTERFS_CFLAGS="${ARGP_STANDALONE_CPPFLAGS} -D__DARWIN_64_BIT_INO_T -undefined suppress -flat_namespace"          GF_LDADD="${ARGP_STANDALONE_LDADD}" +        GF_LDFLAGS=""          GF_FUSE_CFLAGS="-I\$(CONTRIBDIR)/macfuse" +        BUILD_FUSERMOUNT="no" +        BUILD_QEMU_BLOCK="no" +        FUSERMOUNT_SUBDIR=""          ;;  esac +# enable/disable QEMU +AM_CONDITIONAL([ENABLE_QEMU_BLOCK], [test x$BUILD_QEMU_BLOCK = xyes]) + +  # enable debug section  AC_ARG_ENABLE([debug],                AC_HELP_STRING([--enable-debug],                               [Enable debug build options.])) +  # syslog section  AC_ARG_ENABLE([syslog], -	      AC_HELP_STRING([--disable-syslog], -			     [Disable syslog for logging])) +              AC_HELP_STRING([--disable-syslog], +                             [Disable syslog for logging]))  USE_SYSLOG="yes"  if test "x$enable_syslog" != "xno"; then @@ -812,8 +845,13 @@ AC_CHECK_LIB([readline -ltermcap],[readline],[RLLIBS="-lreadline -ltermcap"])  AC_CHECK_LIB([readline -lncurses],[readline],[RLLIBS="-lreadline -lncurses"])  if test "x$RLLIBS" != "x"; then -   AC_DEFINE(HAVE_READLINE, 1, [readline enabled CLI]) -   BUILD_READLINE=yes +   if test "x$RL_UNDO" == "xyes"; then +      AC_DEFINE(HAVE_READLINE, 1, [readline enabled CLI]) +      BUILD_READLINE=yes +   else +      BUILD_READLINE="no (present but missing undo)" +   fi +  fi  BUILD_LIBAIO=no @@ -838,9 +876,20 @@ fi  saved_CFLAGS=$CFLAGS  saved_CPPFLAGS=$CPPFLAGS  saved_LDFLAGS=$LDFLAGS -CFLAGS=`${PYTHON}-config --cflags` -CPPFLAGS=$CFLAGS -LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" + +case $host_os in +     linux*) +       CFLAGS="`${PYTHON}-config --cflags`" +       CPPFLAGS=$CFLAGS +       LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" +       ;; +     darwin*) +       CFLAGS="`${PYTHON}-config --cflags` -Wno-error=unused-command-line-argument-hard-error-in-future" +       CPPFLAGS=$CFLAGS +       LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" +       ;; +esac +  AC_CHECK_HEADERS([python$PYTHON_VERSION/Python.h],[have_Python_h=yes],[])  AC_ARG_ENABLE([glupy],                AS_HELP_STRING([--enable-glupy], @@ -848,7 +897,7 @@ AC_ARG_ENABLE([glupy],  case x$enable_glupy in     xyes)        if test "x$have_python2" = "xyes" -a "x$have_Python_h" = "xyes"; then -         BUILD_GLUPY=yes +        BUILD_GLUPY=yes          PYTHONDEV_CFLAGS="$CFLAGS"          PYTHONDEV_CPPFLAGS="$CPPFLAGS"          PYTHONDEV_LDFLAGS="$LDFLAGS" @@ -856,14 +905,14 @@ case x$enable_glupy in          AC_SUBST(PYTHONDEV_CPPFLAGS)          AC_SUBST(PYTHONDEV_LDFLAGS)        else -         AC_MSG_ERROR([glupy requires python-devel/python-dev package and python2.x]) +        AC_MSG_ERROR([glupy requires python-devel/python-dev package and python2.x])        fi        ;;     xno)        ;;     *)        if test "x$have_python2" = "xyes" -a "x$have_Python_h" = "xyes"; then -         BUILD_GLUPY=yes +        BUILD_GLUPY=yes          PYTHONDEV_CFLAGS="$CFLAGS"          PYTHONDEV_CPPFLAGS="$CPPFLAGS"          PYTHONDEV_LDFLAGS="$LDFLAGS" @@ -871,7 +920,7 @@ case x$enable_glupy in          AC_SUBST(PYTHONDEV_CPPFLAGS)          AC_SUBST(PYTHONDEV_LDFLAGS)        else -         AC_MSG_WARN([ +        AC_MSG_WARN([          ---------------------------------------------------------------------------------           cannot build glupy. python 2.x and python-devel/python-dev package are required.          ---------------------------------------------------------------------------------]) @@ -903,7 +952,6 @@ AC_SUBST(CFLAGS)  AC_SUBST(GF_HOST_OS)  AC_SUBST([GF_GLUSTERFS_LIBS]) -AC_SUBST(GF_GLUSTERFS_CFLAGS)  AC_SUBST(GF_CFLAGS)  AC_SUBST(GF_LDFLAGS)  AC_SUBST(GF_LDADD) @@ -918,7 +966,7 @@ CONTRIBDIR='$(top_srcdir)/contrib'  AC_SUBST(CONTRIBDIR)  GF_CPPDEFINES='-D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS)' -GF_CPPINCLUDES='-I$(top_srcdir)/libglusterfs/src -I$(CONTRIBDIR)/uuid $(UNITTEST_CPPFLAGS)' +GF_CPPINCLUDES='-I$(top_srcdir)/libglusterfs/src -I$(CONTRIBDIR)/uuid'  GF_CPPFLAGS="$GF_CPPDEFINES $GF_CPPINCLUDES"  AC_SUBST([GF_CPPFLAGS]) diff --git a/contrib/argp-standalone/configure.ac b/contrib/argp-standalone/configure.ac index 4e4e67692f8..167b234fc77 100644 --- a/contrib/argp-standalone/configure.ac +++ b/contrib/argp-standalone/configure.ac @@ -56,12 +56,12 @@ AC_DEFUN([ARGP_CHECK_FUNC],                 [Define to 1 if you have the `]ac_func[' function.])     AC_CACHE_CHECK([for $2], ac_var,       [AC_TRY_LINK([$1], [$2], -		  [AS_VAR_SET(ac_var, yes)], -		  [AS_VAR_SET(ac_var, no)])]) +                  [AS_VAR_SET(ac_var, yes)], +                  [AS_VAR_SET(ac_var, no)])])     if test AS_VAR_GET(ac_var) = yes ; then       ifelse([$3],, -	    [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]ac_func))], -	    [$3 +            [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_[]ac_func))], +            [$3  ])     else       ifelse([$4],, true, [$4]) @@ -99,4 +99,7 @@ fi  CPPFLAGS="$CPPFLAGS -I$srcdir" +dnl Added for C99 standards +CFLAGS="$CFLAGS -std=gnu89" +  AC_OUTPUT(Makefile) diff --git a/contrib/fuse-include/fuse_kernel_macfuse.h b/contrib/fuse-include/fuse_kernel_macfuse.h index 3fbf24f70aa..a003f825a70 100644 --- a/contrib/fuse-include/fuse_kernel_macfuse.h +++ b/contrib/fuse-include/fuse_kernel_macfuse.h @@ -189,6 +189,15 @@ enum fuse_opcode {  	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_SETVOLNAME    = 61,  	FUSE_GETXTIMES     = 62, diff --git a/contrib/fuse-lib/mount-gluster-compat.h b/contrib/fuse-lib/mount-gluster-compat.h index 4fc20623bc9..1f76241ab1c 100644 --- a/contrib/fuse-lib/mount-gluster-compat.h +++ b/contrib/fuse-lib/mount-gluster-compat.h @@ -21,7 +21,7 @@  #include <errno.h>  #include <dirent.h>  #include <signal.h> -#ifndef __NetBSD__ +#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS)  #include <mntent.h>  #endif /* __NetBSD__ */  #include <sys/stat.h> @@ -36,7 +36,15 @@  #define MS_RDONLY MNT_RDONLY  #endif -#ifdef linux +#ifdef GF_DARWIN_HOST_OS +#include <sys/param.h> +#include <sys/mount.h> +#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 */  #define _PATH_MOUNT "/sbin/mount" diff --git a/contrib/fuse-util/Makefile.am b/contrib/fuse-util/Makefile.am index 971d3d22002..abbc10eb6d9 100644 --- a/contrib/fuse-util/Makefile.am +++ b/contrib/fuse-util/Makefile.am @@ -3,7 +3,7 @@ bin_PROGRAMS = fusermount-glusterfs  fusermount_glusterfs_SOURCES = fusermount.c mount_util.c $(CONTRIBDIR)/fuse-lib/mount-common.c  noinst_HEADERS = $(CONTRIBDIR)/fuse-include/mount_util.h -AM_CPPFLAGS = $(GF_CPPFLAGS) -DFUSE_UTIL -I$(CONTRIBDIR)/fuse-include +AM_CPPFLAGS = $(GF_CPPFLAGS) -DFUSE_UTIL -I$(CONTRIBDIR)/fuse-include -I$(CONTRIBDIR)/fuse-lib  AM_CFLAGS = -Wall $(GF_CFLAGS) diff --git a/contrib/fuse-util/fusermount.c b/contrib/fuse-util/fusermount.c index 0ff8d90395c..a64d8e102ff 100644 --- a/contrib/fuse-util/fusermount.c +++ b/contrib/fuse-util/fusermount.c @@ -10,6 +10,11 @@  #include <config.h>  #include "mount_util.h" + +#ifndef HAVE_UMOUNT2 +#include "mount-gluster-compat.h" +#endif +  #include <stdio.h>  #include <stdlib.h>  #include <string.h> @@ -20,11 +25,18 @@  #include <fcntl.h>  #include <pwd.h>  #include <limits.h> +#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS)  #include <mntent.h> +#endif /* __NetBSD__ */  #include <sys/wait.h>  #include <sys/stat.h> -#include <sys/mount.h> +#ifdef HAVE_SET_FSID  #include <sys/fsuid.h> +#endif +#ifdef GF_DARWIN_HOST_OS +#include <sys/param.h> +#endif +#include <sys/mount.h>  #include <sys/socket.h>  #include <sys/utsname.h>  #include <sched.h> @@ -63,22 +75,32 @@ static const char *get_user_name(void)  	}  } +#ifdef HAVE_SET_FSID  static uid_t oldfsuid;  static gid_t oldfsgid; +#endif  static void drop_privs(void)  {  	if (getuid() != 0) { +#ifdef HAVE_SET_FSID  		oldfsuid = setfsuid(getuid());  		oldfsgid = setfsgid(getgid()); +#else +		fprintf(stderr, "%s: Implement alternative setfsuid/gid \n", progname); +#endif  	}  }  static void restore_privs(void)  {  	if (getuid() != 0) { +#ifdef HAVE_SET_FSID  		setfsuid(oldfsuid);  		setfsgid(oldfsgid); +#else +		fprintf(stderr, "%s: Implement alternative setfsuid/gid \n", progname); +#endif  	}  } diff --git a/contrib/macfuse/fuse_param.h b/contrib/macfuse/fuse_param.h index 81d753c6cd7..347db9464bc 100644 --- a/contrib/macfuse/fuse_param.h +++ b/contrib/macfuse/fuse_param.h @@ -1,4 +1,9 @@  /* + * 'rebel' branch modifications: + *     Copyright (C) 2010 Tuxera. All Rights Reserved. + */ + +/*   * Copyright (C) 2006-2008 Google. All Rights Reserved.   * Amit Singh <singh@>   */ @@ -6,69 +11,81 @@  #ifndef _FUSE_PARAM_H_  #define _FUSE_PARAM_H_ -/* Compile-time tunables (M_MACFUSE*) */ - -#define M_MACFUSE_ENABLE_FIFOFS            0 -#define M_MACFUSE_ENABLE_INTERRUPT         1 -#define M_MACFUSE_ENABLE_SPECFS            0 -#define M_MACFUSE_ENABLE_TSLOCKING         0 -#define M_MACFUSE_ENABLE_UNSUPPORTED       1 -#define M_MACFUSE_ENABLE_XATTR             1 - -#if M_MACFUSE_ENABLE_UNSUPPORTED -  #define M_MACFUSE_ENABLE_DSELECT         0 -  #define M_MACFUSE_ENABLE_EXCHANGE        1 -  #define M_MACFUSE_ENABLE_KQUEUE          1 -  #define M_MACFUSE_ENABLE_KUNC            0 -#if __LP64__ -    #define M_MACFUSE_ENABLE_INTERIM_FSNODE_LOCK 1 -#endif /* __LP64__ */ -#endif /* M_MACFUSE_ENABLE_UNSUPPORTED */ - -#if M_MACFUSE_ENABLE_INTERIM_FSNODE_LOCK -#define FUSE_VNOP_EXPORT __private_extern__ +#include <AvailabilityMacros.h> + +/* Compile-time tunables (M_OSXFUSE*) */ + +#define M_OSXFUSE_ENABLE_FIFOFS                0 +#define M_OSXFUSE_ENABLE_INTERRUPT             1 +#define M_OSXFUSE_ENABLE_SPECFS                0 +#define M_OSXFUSE_ENABLE_TSLOCKING             1 +#define M_OSXFUSE_ENABLE_UNSUPPORTED           1 +#define M_OSXFUSE_ENABLE_XATTR                 1 +#define M_OSXFUSE_ENABLE_DSELECT               1 + +#if M_OSXFUSE_ENABLE_UNSUPPORTED +#  define M_OSXFUSE_ENABLE_EXCHANGE            1 +#  define M_OSXFUSE_ENABLE_KUNC                0 +#  define M_OSXFUSE_ENABLE_INTERIM_FSNODE_LOCK 1 +#endif /* M_OSXFUSE_ENABLE_UNSUPPORTED */ + +#if MAC_OS_X_VERSION_MIN_REQUIRED < 1060 +#  if M_OSXFUSE_ENABLE_UNSUPPORTED +     /* +      * In Mac OS X 10.5 the file system implementation is responsible for +      * posting kqueue events. Starting with Mac OS X 10.6 VFS took over that +      * job. +      */ +#    define M_OSXFUSE_ENABLE_KQUEUE            1 +#  endif +#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < 1060 */ + +#if M_OSXFUSE_ENABLE_INTERIM_FSNODE_LOCK +#  define M_OSXFUSE_ENABLE_HUGE_LOCK           0 +#  define M_OSXFUSE_ENABLE_LOCK_LOGGING        0 +#  define FUSE_VNOP_EXPORT __private_extern__  #else -#define FUSE_VNOP_EXPORT static -#endif /* M_MACFUSE_ENABLE_INTERIM_FSNODE_LOCK */ +#  define FUSE_VNOP_EXPORT static +#endif /* M_OSXFUSE_ENABLE_INTERIM_FSNODE_LOCK */  /* User Control */ -#define MACFUSE_POSTUNMOUNT_SIGNAL         SIGKILL +#define OSXFUSE_POSTUNMOUNT_SIGNAL         SIGKILL  #define MACOSX_ADMIN_GROUP_NAME            "admin" -#define SYSCTL_MACFUSE_TUNABLES_ADMIN      "macfuse.tunables.admin_group" -#define SYSCTL_MACFUSE_VERSION_NUMBER      "macfuse.version.number" +#define SYSCTL_OSXFUSE_TUNABLES_ADMIN      "osxfuse.tunables.admin_group" +#define SYSCTL_OSXFUSE_VERSION_NUMBER      "osxfuse.version.number"  /* Paths */ -#define MACFUSE_BUNDLE_PATH "/Library/Filesystems/fusefs.fs" -#define MACFUSE_KEXT        MACFUSE_BUNDLE_PATH "/Support/fusefs.kext" -#define MACFUSE_LOAD_PROG   MACFUSE_BUNDLE_PATH "/Support/load_fusefs" -#define MACFUSE_MOUNT_PROG  MACFUSE_BUNDLE_PATH "/Support/mount_fusefs" +#define OSXFUSE_BUNDLE_PATH "/Library/Filesystems/osxfusefs.fs" +#define OSXFUSE_KEXT        OSXFUSE_BUNDLE_PATH "/Support/osxfusefs.kext" +#define OSXFUSE_LOAD_PROG   OSXFUSE_BUNDLE_PATH "/Support/load_osxfusefs" +#define OSXFUSE_MOUNT_PROG  OSXFUSE_BUNDLE_PATH "/Support/mount_osxfusefs"  #define SYSTEM_KEXTLOAD     "/sbin/kextload"  #define SYSTEM_KEXTUNLOAD   "/sbin/kextunload"  /* Compatible API version */ -#define MACFUSE_MIN_USER_VERSION_MAJOR     7 -#define MACFUSE_MIN_USER_VERSION_MINOR     5 +#define OSXFUSE_MIN_USER_VERSION_MAJOR     7 +#define OSXFUSE_MIN_USER_VERSION_MINOR     5  /* Device Interface */  /* - * This is the prefix ("fuse" by default) of the name of a FUSE device node - * in devfs. The suffix is the device number. "/dev/fuse0" is the first FUSE + * This is the prefix ("osxfuse" by default) of the name of a FUSE device node + * in devfs. The suffix is the device number. "/dev/osxfuse0" is the first FUSE   * device by default. If you change the prefix from the default to something   * else, the user-space FUSE library will need to know about it too.   */ -#define MACFUSE_DEVICE_BASENAME            "fuse" +#define OSXFUSE_DEVICE_BASENAME            "osxfuse"  /* - * This is the number of /dev/fuse<n> nodes we will create. <n> goes from - * 0 to (FUSE_NDEVICES - 1). + * This is the number of /dev/osxfuse<n> nodes we will create. <n> goes from + * 0 to (OSXFUSE_NDEVICES - 1).   */ -#define MACFUSE_NDEVICES                   24 +#define OSXFUSE_NDEVICES                   24  /*   * This is the default block size of the virtual storage devices that are @@ -131,13 +148,13 @@  /* User-Kernel IPC Buffer */  #define FUSE_MIN_USERKERNEL_BUFSIZE        (128  * 1024) -#define FUSE_MAX_USERKERNEL_BUFSIZE        (4096 * 1024) +#define FUSE_MAX_USERKERNEL_BUFSIZE        (16   * 1024 * 1024)  #define FUSE_REASONABLE_XATTRSIZE          FUSE_MIN_USERKERNEL_BUFSIZE  #endif /* KERNEL */ -#define FUSE_DEFAULT_USERKERNEL_BUFSIZE    (4096 * 1024) +#define FUSE_DEFAULT_USERKERNEL_BUFSIZE    (16   * 1024 * 1024)  #define FUSE_LINK_MAX                      LINK_MAX  #define FUSE_UIO_BACKUP_MAX                8 diff --git a/contrib/macfuse/mount_darwin.c b/contrib/macfuse/mount_darwin.c index c485583e96b..cac158249aa 100644 --- a/contrib/macfuse/mount_darwin.c +++ b/contrib/macfuse/mount_darwin.c @@ -105,7 +105,7 @@ loadkmod(void)      pid = fork();      if (pid == 0) { -        execl(MACFUSE_LOAD_PROG, MACFUSE_LOAD_PROG, NULL); +        execl(OSXFUSE_LOAD_PROG, OSXFUSE_LOAD_PROG, NULL);          /* exec failed */          exit(ENOENT); @@ -133,13 +133,17 @@ Return:  }  int +gf_fuse_mount (const char *mountpoint, char *fsname, +               unsigned long mountflags, char *mnt_param, +	       pid_t *mnt_pid, int status_fd) /* Not used on OS X */ +/* int  gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param, -               pid_t *mtab_pid /* not used on OS X */) +pid_t *mtab_pid) */  {      int fd, pid;      int result;      char *fdnam, *dev; -    const char *mountprog = MACFUSE_MOUNT_PROG; +    const char *mountprog = OSXFUSE_MOUNT_PROG;      sig_t chldf;      /* mount_fusefs should not try to spawn the daemon */ @@ -170,7 +174,8 @@ gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param,          size_t version_len = MAXHOSTNAMELEN;          size_t version_len_desired = 0; -        result = sysctlbyname(SYSCTL_MACFUSE_VERSION_NUMBER, version, +        result = sysctlbyname(SYSCTL_OSXFUSE_VERSION_NUMBER +			      , version,                                &version_len, NULL, (size_t)0);          if (result == 0) {              /* sysctlbyname() includes the trailing '\0' in version_len */ @@ -197,10 +202,12 @@ gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param,                  gf_log("glusterfs-fuse", GF_LOG_INFO,                         "MacFUSE kext version %s", version);          } +	// TODO Bypass version check +	result = 0;          if (result != 0) -            GFFUSE_LOGERR("MacFUSE version %s is not supported", version); +	  GFFUSE_LOGERR("MacFUSE version %s is not supported", version);      } else -        GFFUSE_LOGERR("cannot load MacFUSE kext"); +      GFFUSE_LOGERR("cannot load MacFUSE kext");      if (result != 0)          return -1; @@ -228,9 +235,9 @@ gf_fuse_mount (const char *mountpoint, char *fsname, char *mnt_param,          int r, devidx = -1;          char devpath[MAXPATHLEN]; -        for (r = 0; r < MACFUSE_NDEVICES; r++) { +        for (r = 0; r < OSXFUSE_NDEVICES; r++) {              snprintf(devpath, MAXPATHLEN - 1, -                     _PATH_DEV MACFUSE_DEVICE_BASENAME "%d", r); +                     _PATH_DEV OSXFUSE_DEVICE_BASENAME "%d", r);              fd = open(devpath, O_RDWR);              if (fd >= 0) {                  dev = devpath; @@ -336,8 +343,8 @@ gf_fuse_unmount(const char *mountpoint, int fd)      devname_r(sbuf.st_rdev, S_IFCHR, dev, 128); -    if (strncmp(dev, MACFUSE_DEVICE_BASENAME, -                sizeof(MACFUSE_DEVICE_BASENAME) - 1)) { +    if (strncmp(dev, OSXFUSE_DEVICE_BASENAME, +                sizeof(OSXFUSE_DEVICE_BASENAME) - 1)) {          return;      } diff --git a/contrib/mount/mntent.c b/contrib/mount/mntent.c new file mode 100644 index 00000000000..5ab5ac19e84 --- /dev/null +++ b/contrib/mount/mntent.c @@ -0,0 +1,163 @@ +/* + * Copyright (c) 1980, 1989, 1993, 1994 + *      The Regents of the University of California.  All rights reserved. + * Copyright (c) 2001 + *      David Rufino <daverufino@btinternet.com> + * Copyright (c) 2014 + *      Red Hat, Inc. <http://www.redhat.com> + * + * 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. + * 3. All advertising materials mentioning features or use of this software + *    must display the following acknowledgement: + *      This product includes software developed by the University of + *      California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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. + */ + +#ifdef GF_DARWIN_HOST_OS +#include <stdlib.h> +#include <string.h> +#include <sys/param.h> +#include <sys/ucred.h> +#include <sys/mount.h> +#include "mntent_compat.h" + +static int pos = -1; +static int mntsize = -1; +static struct mntent _mntent; + +char * +hasmntopt (const struct mntent *mnt, const char *option) +{ +        int found; +        char *opt, *optbuf; + +        optbuf = strdup(mnt->mnt_opts); +        found = 0; +        for (opt = optbuf; (opt = strtok(opt, " ")) != NULL; opt = NULL) { +                if (!strcasecmp(opt, option)) { +                        opt = opt - optbuf + mnt->mnt_opts; +                        free (optbuf); +                        return (opt); +                } +        } +        free (optbuf); +        return (NULL); +} + +static char * +concatopt (char *s0, const char *s1) +{ +        size_t i; +        char *cp; + +        if (s1 == NULL || *s1 == '\0') +                return s0; +        if (s0 && *s0) { +                i = strlen(s0) + strlen(s1) + 1 + 1; +                if ((cp = (char *)malloc(i)) == NULL) +                        return (NULL); +                (void)snprintf(cp, i, "%s %s", s0, s1); +        } else +                cp = strdup(s1); + +        if (s0) +                free(s0); +        return (cp); +} + + +static char * +flags2opts (int flags) +{ +        char *res; +        res = NULL; +        res = concatopt(res, (flags & MNT_RDONLY) ? "ro" : "rw"); +        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 (flags & MNT_NODEV)          res = concatopt(res, "nodev"); +        if (flags & MNT_UNION)          res = concatopt(res, "union"); +        if (flags & MNT_ASYNC)          res = concatopt(res, "async"); +#if !defined(GF_DARWIN_HOST_OS) +        if (flags & MNT_NOATIME)        res = concatopt(res, "noatime"); +        if (flags & MNT_NOCLUSTERR)     res = concatopt(res, "noclusterr"); +        if (flags & MNT_NOCLUSTERW)     res = concatopt(res, "noclusterw"); +        if (flags & MNT_NOSYMFOLLOW)    res = concatopt(res, "nosymfollow"); +        if (flags & MNT_SUIDDIR)        res = concatopt(res, "suiddir"); +#endif +        return res; +} + +static struct mntent * +statfs_to_mntent (struct statfs *mntbuf) +{ +        static char opts_buf[40], *tmp; + +        _mntent.mnt_fsname = mntbuf->f_mntfromname; +        _mntent.mnt_dir = mntbuf->f_mntonname; +        _mntent.mnt_type = mntbuf->f_fstypename; +        tmp = flags2opts (mntbuf->f_flags); +        if (tmp) { +                opts_buf[sizeof(opts_buf)-1] = '\0'; +                strncpy (opts_buf, tmp, sizeof(opts_buf)-1); +                free (tmp); +        } else { +                *opts_buf = '\0'; +        } +        _mntent.mnt_opts = opts_buf; +        _mntent.mnt_freq = _mntent.mnt_passno = 0; +        return (&_mntent); +} + +struct mntent * +getmntent (FILE *fp) +{ +        struct statfs *mntbuf; + +        if (pos == -1 || mntsize == -1) +                mntsize = getmntinfo (&mntbuf, MNT_NOWAIT); + +        ++pos; +        if (pos == mntsize) { +                pos = mntsize = -1; +                return (NULL); +        } + +        return (statfs_to_mntent (&mntbuf[pos])); +} + +/* Dummy functions */ +FILE * +setmntent(const char *filename, const char *type) +{ +        return (FILE *)0x1; +} + +int +endmntent (FILE *fp) +{ +        return 1; +} +#endif /* GF_DARWIN_HOST_OS */ diff --git a/contrib/mount/mntent_compat.h b/contrib/mount/mntent_compat.h new file mode 100644 index 00000000000..76a75754b1c --- /dev/null +++ b/contrib/mount/mntent_compat.h @@ -0,0 +1,35 @@ +/* +  Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com> +  This file is part of GlusterFS. + +  This file is licensed to you under your choice of the GNU Lesser +  General Public License, version 3 or any later version (LGPLv3 or +  later), or the GNU General Public License, version 2 (GPLv2), in all +  cases as published by the Free Software Foundation. +*/ + +#ifndef _MNTENT_H +#define _MNTENT_H + +#ifdef GF_DARWIN_HOST_OS +#include <stdio.h> + +struct mntent { +        char *mnt_fsname; +        char *mnt_dir; +        char *mnt_type; +        char *mnt_opts; +        int mnt_freq; +        int mnt_passno; +}; + +struct mntent *getmntent (FILE *fp); +FILE *setmntent (const char *filename, const char *type); +int endmntent(FILE *fp); +char * hasmntopt (const struct mntent *mnt, const char *option); + +/* Dummy - /etc/mtab has no meaning on OSX platform */ +#define _PATH_MOUNTED "/etc/mtab" + +#endif /* GF_DARWIN_HOST_OS */ +#endif /* _MNTENT_H */ diff --git a/contrib/qemu/include/qemu/bswap.h b/contrib/qemu/include/qemu/bswap.h index 14a5f657ce5..1ea5b101e89 100644 --- a/contrib/qemu/include/qemu/bswap.h +++ b/contrib/qemu/include/qemu/bswap.h @@ -12,7 +12,14 @@  # include <sys/types.h>  # include <machine/bswap.h>  #elif defined(CONFIG_BYTESWAP_H) +#ifdef GF_DARWIN_HOST_OS +# include <libkern/OSByteOrder.h> +#define bswap_16(x) OSSwapInt16(x) +#define bswap_32(x) OSSwapInt32(x) +#define bswap_64(x) OSSwapInt64(x) +#else  # include <byteswap.h> +#endif  static inline uint16_t bswap16(uint16_t x)  { diff --git a/contrib/qemu/util/cutils.c b/contrib/qemu/util/cutils.c index 0116fcde74f..6caa4b8ddc4 100644 --- a/contrib/qemu/util/cutils.c +++ b/contrib/qemu/util/cutils.c @@ -156,7 +156,7 @@ int qemu_fls(int i)   */  int qemu_fdatasync(int fd)  { -#ifdef CONFIG_FDATASYNC +#ifdef HAVE_FDATASYNC      return fdatasync(fd);  #else      return fsync(fd); diff --git a/contrib/sunrpc/xdr_sizeof.c b/contrib/sunrpc/xdr_sizeof.c new file mode 100644 index 00000000000..ca1f7bf0a5e --- /dev/null +++ b/contrib/sunrpc/xdr_sizeof.c @@ -0,0 +1,204 @@ +/* + * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. + * + * @APPLE_LICENSE_HEADER_START@ + * + * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights + * Reserved.  This file contains Original Code and/or Modifications of + * Original Code as defined in and that are subject to the Apple Public + * Source License Version 1.1 (the "License").  You may not use this file + * except in compliance with the License.  Please obtain a copy of the + * License at http://www.apple.com/publicsource and read it before using + * this file. + * + * The Original Code and all software distributed under the License are + * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, + * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the + * License for the specific language governing rights and limitations + * under the License. + * + * @APPLE_LICENSE_HEADER_END@ + */ + +/* + * Sun RPC is a product of Sun Microsystems, Inc. and is provided for + * unrestricted use provided that this legend is included on all tape + * media and as a part of the software program in whole or part.  Users + * may copy or modify Sun RPC without charge, but are not authorized + * to license or distribute it to anyone else except as part of a product or + * program developed by the user. + * + * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE + * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR + * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. + * + * Sun RPC is provided with no support and without any obligation on the + * part of Sun Microsystems, Inc. to assist in its use, correction, + * modification or enhancement. + * + * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE + * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC + * OR ANY PART THEREOF. + * + * In no event will Sun Microsystems, Inc. be liable for any lost revenue + * or profits or other special, indirect and consequential damages, even if + * Sun has been advised of the possibility of such damages. + * + * Sun Microsystems, Inc. + * 2550 Garcia Avenue + * Mountain View, California  94043 + */ + +/* + * xdr_sizeof.c + * + * Copyright 1990 Sun Microsystems, Inc. + * + * General purpose routine to see how much space something will use + * when serialized using XDR. + */ + +#ifdef GF_DARWIN_HOST_OS + +#include <rpc/types.h> +#include <rpc/xdr.h> +#include <sys/types.h> +#include <sys/cdefs.h> + +#include <stdlib.h> + +/* ARGSUSED */ +#ifdef GF_DARWIN_HOST_OS +static bool_t +x_putlong (XDR *xdrs, const int *longp) +{ +        xdrs->x_handy += BYTES_PER_XDR_UNIT; +        return TRUE; +} + +#else +static bool_t +x_putlong (XDR *xdrs, const long *longp) +{ +        xdrs->x_handy += BYTES_PER_XDR_UNIT; +        return TRUE; +} +#endif + +/* ARGSUSED */ +static bool_t +x_putbytes (XDR *xdrs, const char *bp, u_int len) +{ +        xdrs->x_handy += len; +        return TRUE; +} + +#ifdef GF_DARWIN_HOST_OS +static u_int +x_getpostn (XDR *xdrs) +{ +        return xdrs->x_handy; +} +#else +static u_int +x_getpostn (const XDR *xdrs) +{ +        return xdrs->x_handy; +} +#endif + +/* ARGSUSED */ +static bool_t +x_setpostn (XDR *xdrs, u_int len) +{ +        /* This is not allowed */ +        return FALSE; +} + +static int32_t * +x_inline (XDR *xdrs, u_int len) +{ +        if (len == 0) +                return NULL; +        if (xdrs->x_op != XDR_ENCODE) +                return NULL; +        if (len < (u_int) (long int) xdrs->x_base) +        { +                /* x_private was already allocated */ +                xdrs->x_handy += len; +                return (int32_t *) xdrs->x_private; +        } +        else +        { +                /* Free the earlier space and allocate new area */ +                free (xdrs->x_private); +                if ((xdrs->x_private = (caddr_t) malloc (len)) == NULL) +                { +                        xdrs->x_base = 0; +                        return NULL; +                } +                xdrs->x_base = (void *) (long) len; +                xdrs->x_handy += len; +                return (int32_t *) xdrs->x_private; +        } +} + +static int +harmless (void) +{ +        /* Always return FALSE/NULL, as the case may be */ +        return 0; +} + +static void +x_destroy (XDR *xdrs) +{ +        xdrs->x_handy = 0; +        xdrs->x_base = 0; +        if (xdrs->x_private) +        { +                free (xdrs->x_private); +                xdrs->x_private = NULL; +        } +        return; +} + +unsigned long +xdr_sizeof (xdrproc_t func, void *data) +{ +        XDR x; +        struct xdr_ops ops; +        bool_t stat; + +#ifdef GF_DARWIN_HOST_OS +        typedef bool_t (*dummyfunc1) (XDR *, int *); +#else +        typedef bool_t (*dummyfunc1) (XDR *, long *); +#endif +        typedef bool_t (*dummyfunc2) (XDR *, caddr_t, u_int); + +        ops.x_putlong = x_putlong; +        ops.x_putbytes = x_putbytes; +        ops.x_inline = x_inline; +        ops.x_getpostn = x_getpostn; +        ops.x_setpostn = x_setpostn; +        ops.x_destroy = x_destroy; + +        /* the other harmless ones */ +        ops.x_getlong = (dummyfunc1) harmless; +        ops.x_getbytes = (dummyfunc2) harmless; + +        x.x_op = XDR_ENCODE; +        x.x_ops = &ops; +        x.x_handy = 0; +        x.x_private = (caddr_t) NULL; +        x.x_base = (caddr_t) 0; + +        stat = func (&x, data, 0); +        if (x.x_private) +                free (x.x_private); +        return (stat == TRUE ? (unsigned) x.x_handy : 0); +} +#endif /* GF_DARWIN_HOST_OS */ diff --git a/contrib/uuid/gen_uuid.c b/contrib/uuid/gen_uuid.c index b3eda9de387..79923cd542f 100644 --- a/contrib/uuid/gen_uuid.c +++ b/contrib/uuid/gen_uuid.c @@ -44,6 +44,18 @@  #include <windows.h>  #define UUID MYUUID  #endif + +#ifdef __APPLE__ +#define PRI_TIME "ld" +#define PRI_TIME_USEC "d" +#define SCAN_TIME "lu" +#else +#define PRI_TIME "lu" +#define PRI_TIME_USEC "lu" +#define SCAN_TIME "ld" +#endif + +  #include <stdio.h>  #ifdef HAVE_UNISTD_H  #include <unistd.h> @@ -354,8 +366,7 @@ static int get_clock(uint32_t *clock_high, uint32_t *clock_low,  		unsigned int cl;  		unsigned long tv1, tv2;  		int a; - -		if (fscanf(state_f, "clock: %04x tv: %lu %lu adj: %d\n", +		if (fscanf(state_f, "clock: %04x tv: %" SCAN_TIME " %" SCAN_TIME " adj: %d\n",  			   &cl, &tv1, &tv2, &a) == 4) {  			clock_seq = cl & 0x3FFF;  			last.tv_sec = tv1; @@ -404,7 +415,7 @@ try_again:  	if (state_fd > 0) {  		rewind(state_f);  		len = fprintf(state_f,  -			      "clock: %04x tv: %016lu %08lu adj: %08d\n", +			      "clock: %04x tv: %016" PRI_TIME "%08" PRI_TIME_USEC "adj: %08d\n",  			      clock_seq, last.tv_sec, last.tv_usec, adjustment);  		fflush(state_f);  		if (ftruncate(state_fd, len) < 0) { diff --git a/contrib/uuid/uuid_time.c b/contrib/uuid/uuid_time.c index f25f5c90fe5..ccaa542fed0 100644 --- a/contrib/uuid/uuid_time.c +++ b/contrib/uuid/uuid_time.c @@ -52,6 +52,7 @@  #include <time.h>  #include "uuidP.h" +#include "logging.h"  time_t uuid_time(const uuid_t uu, struct timeval *ret_tv)  { @@ -163,8 +164,7 @@ main(int argc, char **argv)  		printf("Warning: not a time-based UUID, so UUID time "  		       "decoding will likely not work!\n");  	} -	printf("UUID time is: (%ld, %ld): %s\n", tv.tv_sec, tv.tv_usec, -	       ctime(&time_reg)); +	printf("UUID time is: (%" GF_PRI_SECOND ", %" GF_PRI_USEC "): %s\n", tv.tv_sec, tv.tv_usec, ctime(&time_reg));  	return 0;  } diff --git a/extras/geo-rep/Makefile.am b/extras/geo-rep/Makefile.am index 9435861cf97..6d3d10b88a0 100644 --- a/extras/geo-rep/Makefile.am +++ b/extras/geo-rep/Makefile.am @@ -4,6 +4,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_SOURCES = gsync-sync-gfid.c diff --git a/gen-headers.py b/gen-headers.py index ef9fa77117c..6e40580f696 100755 --- a/gen-headers.py +++ b/gen-headers.py @@ -32,8 +32,13 @@ def genCHeader(logBook,          defineLines.append("#define %-20s %d" % (nameDef, code))          defineLines.append("#define %-20s %s" % (msgNameDef,                                                   json.dumps(msg))) +        caseLines.append("#ifdef HAVE_LIBINTL_H")          caseLines.append("        case %s: return _(%s);" % \                               (nameDef, msgNameDef)) +        caseLines.append("#else") +        caseLines.append("        case %s: return %s;" % \ +                             (nameDef, msgNameDef)) +        caseLines.append("#endif")      d = {'DEFINES': "\n".join(defineLines),           'CASES': "\n".join(caseLines)} diff --git a/gf-error-codes.h.template b/gf-error-codes.h.template index ab6020d640d..5ca64fd90fc 100644 --- a/gf-error-codes.h.template +++ b/gf-error-codes.h.template @@ -9,10 +9,11 @@  #ifndef _GF_ERROR_CODES_H  #define _GF_ERROR_CODES_H +#ifdef HAVE_LIBINTL_H  #include <libintl.h>  #define _(STRING)    gettext(STRING) - +#endif  /** START: ERROR CODE DEFINITIONS **/  $DEFINES diff --git a/glusterfsd/src/Makefile.am b/glusterfsd/src/Makefile.am index 1797c32be35..e66d8ed3199 100644 --- a/glusterfsd/src/Makefile.am +++ b/glusterfsd/src/Makefile.am @@ -13,7 +13,7 @@ AM_CPPFLAGS = $(GF_CPPFLAGS) \  	-DCONFDIR=\"$(sysconfdir)/glusterfs\" \  	-I$(top_srcdir)/rpc/rpc-lib/src -I$(top_srcdir)/rpc/xdr/src -AM_CFLAGS = -Wall $(GF_GLUSTERFS_CFLAGS) +AM_CFLAGS = -Wall $(GF_CFLAGS)  CLEANFILES =  diff --git a/glusterfsd/src/glusterfsd.c b/glusterfsd/src/glusterfsd.c index 531932619bf..219088025a0 100644 --- a/glusterfsd/src/glusterfsd.c +++ b/glusterfsd/src/glusterfsd.c @@ -1516,7 +1516,7 @@ parse_cmdline (int argc, char *argv[], glusterfs_ctx_t *ctx)  #ifdef GF_DARWIN_HOST_OS          if (cmd_args->mount_point) -                cmd_args->mac_compat = GF_OPTION_DEFERRED; +               cmd_args->mac_compat = GF_OPTION_DEFERRED;  #endif          ret = 0; diff --git a/libglusterfs/src/Makefile.am b/libglusterfs/src/Makefile.am index 8934b35f2d8..569d69be330 100644 --- a/libglusterfs/src/Makefile.am +++ b/libglusterfs/src/Makefile.am @@ -26,8 +26,8 @@ libglusterfs_la_SOURCES = dict.c xlator.c logging.c \  	graph-print.c trie.c run.c options.c fd-lk.c circ-buff.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)/stdlib/gf_mkostemp.c strfd.c \ +	$(CONTRIBDIR)/mount/mntent.c  nodist_libglusterfs_la_SOURCES = y.tab.c graph.lex.c gf-error-codes.h @@ -43,7 +43,8 @@ noinst_HEADERS = common-utils.h defaults.h dict.h glusterfs.h hashfn.h timespec.  	$(CONTRIB_BUILDDIR)/uuid/uuid_types.h syncop.h graph-utils.h trie.h \  	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 +	template-component-messages.h strfd.h \ +	$(CONTRIBDIR)/mount/mntent_compat.h lvm-defaults.h  EXTRA_DIST = graph.l graph.y diff --git a/libglusterfs/src/client_t.c b/libglusterfs/src/client_t.c index 1bf3de3f5ff..bdaf5289d16 100644 --- a/libglusterfs/src/client_t.c +++ b/libglusterfs/src/client_t.c @@ -52,7 +52,7 @@ gf_client_clienttable_expand (clienttable_t *clienttable, uint32_t nr)          uint32_t         oldmax_clients = -1;          int              ret            = -1; -        if (clienttable == NULL || nr < 0) { +        if (clienttable == NULL || nr > UINT32_MAX) {                  gf_log_callingfn ("client_t", GF_LOG_ERROR, "invalid argument");                  ret = EINVAL;                  goto out; diff --git a/libglusterfs/src/common-utils.c b/libglusterfs/src/common-utils.c index b7d06d9251e..e63ffa1420a 100644 --- a/libglusterfs/src/common-utils.c +++ b/libglusterfs/src/common-utils.c @@ -1170,7 +1170,7 @@ gf_string2uint8 (const char *str, uint8_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT8_MAX) { +        if (l <= UINT8_MAX) {                  *n = (uint8_t) l;                  return 0;          } @@ -1189,7 +1189,7 @@ gf_string2uint16 (const char *str, uint16_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT16_MAX) { +        if (l <= UINT16_MAX) {                  *n = (uint16_t) l;                  return 0;          } @@ -1208,7 +1208,7 @@ gf_string2uint32 (const char *str, uint32_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT32_MAX) { +	if (l <= UINT32_MAX) {                  *n = (uint32_t) l;                  return 0;          } @@ -1227,7 +1227,7 @@ gf_string2uint64 (const char *str, uint64_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT64_MAX) { +        if (l <= UINT64_MAX) {                  *n = (uint64_t) l;                  return 0;          } @@ -1258,7 +1258,7 @@ gf_string2uint8_base10 (const char *str, uint8_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT8_MAX) { +        if (l <= UINT8_MAX) {                  *n = (uint8_t) l;                  return 0;          } @@ -1277,7 +1277,7 @@ gf_string2uint16_base10 (const char *str, uint16_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT16_MAX) { +        if (l <= UINT16_MAX) {                  *n = (uint16_t) l;                  return 0;          } @@ -1296,7 +1296,7 @@ gf_string2uint32_base10 (const char *str, uint32_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT32_MAX) { +        if (l <= UINT32_MAX) {                  *n = (uint32_t) l;                  return 0;          } @@ -1315,7 +1315,7 @@ gf_string2uint64_base10 (const char *str, uint64_t *n)          if (rv != 0)                  return rv; -        if (l >= 0 && l <= UINT64_MAX) { +        if (l <= UINT64_MAX) {                  *n = (uint64_t) l;                  return 0;          } @@ -1361,7 +1361,7 @@ err:  }  int -gf_string2bytesize (const char *str, uint64_t *n) +gf_string2bytesize_range (const char *str, uint64_t *n, uint64_t max)  {          double value = 0.0;          char *tail = NULL; @@ -1410,7 +1410,7 @@ gf_string2bytesize (const char *str, uint64_t *n)                          return -1;          } -        if ((UINT64_MAX - value) < 0) { +        if ((max - value) < 0) {                  errno = ERANGE;                  return -1;          } @@ -1421,6 +1421,28 @@ gf_string2bytesize (const char *str, uint64_t *n)  }  int +gf_string2bytesize_size (const char *str, size_t *n) +{ +        uint64_t u64; +        size_t max = (size_t) - 1; +        int val = gf_string2bytesize_range (str, &u64, max); +        *n = (size_t) u64; +        return val; +} + +int +gf_string2bytesize (const char *str, uint64_t *n) +{ +        return gf_string2bytesize_range(str, n, UINT64_MAX); +} + +int +gf_string2bytesize_uint64 (const char *str, uint64_t *n) +{ +        return gf_string2bytesize_range(str, n, UINT64_MAX); +} + +int  gf_string2percent_or_bytesize (const char *str,  			       uint64_t *n,  			       gf_boolean_t *is_percent) diff --git a/libglusterfs/src/common-utils.h b/libglusterfs/src/common-utils.h index 3a58a933121..f11c95fa873 100644 --- a/libglusterfs/src/common-utils.h +++ b/libglusterfs/src/common-utils.h @@ -488,12 +488,12 @@ static inline void  gf_time_fmt (char *dst, size_t sz_dst, time_t utime, unsigned int fmt)  {          extern void _gf_timestuff (gf_timefmts *, const char ***, const char ***); -        static gf_timefmts timefmt_last = (gf_timefmts) -1; +        static gf_timefmts timefmt_last = (gf_timefmts) - 1;          static const char **fmts;          static const char **zeros;          struct tm tm; -        if (timefmt_last == -1) +        if (timefmt_last == (gf_timefmts) - 1)                  _gf_timestuff (&timefmt_last, &fmts, &zeros);          if (timefmt_last < fmt) fmt = gf_timefmt_default;          if (utime && gmtime_r (&utime, &tm) != NULL) { @@ -552,8 +552,9 @@ int gf_string2uint8_base10 (const char *str, uint8_t *n);  int gf_string2uint16_base10 (const char *str, uint16_t *n);  int gf_string2uint32_base10 (const char *str, uint32_t *n);  int gf_string2uint64_base10 (const char *str, uint64_t *n); -  int gf_string2bytesize (const char *str, uint64_t *n); +int gf_string2bytesize_size (const char *str, size_t *n); +int gf_string2bytesize_uint64 (const char *str, uint64_t *n);  int gf_string2percent_or_bytesize (const char *str, uint64_t *n,  				   gf_boolean_t *is_percent); @@ -626,7 +627,7 @@ gf_skip_header_section (int fd, int header_len);  struct iatt;  struct _dict; -inline gf_boolean_t +gf_boolean_t  dht_is_linkfile (struct iatt *buf, struct _dict *dict);  int diff --git a/libglusterfs/src/compat.h b/libglusterfs/src/compat.h index 359a4a3b5cf..81408dbd0ae 100644 --- a/libglusterfs/src/compat.h +++ b/libglusterfs/src/compat.h @@ -31,11 +31,21 @@  #include <sys/un.h>  #include <linux/limits.h>  #include <sys/xattr.h> +#include <linux/xattr.h>  #include <endian.h>  #ifdef HAVE_LINUX_FALLOC_H  #include <linux/falloc.h>  #endif +#ifdef HAVE_ENDIAN_H +#include <endian.h> +#endif +#endif /* GF_LINUX_HOST_OS */ + +#ifdef HAVE_XATTR_H +#include <sys/xattr.h> +#endif +  /*   * Define the fallocate flags in case we do not have the header. This also   * accounts for older systems that do not define FALLOC_FL_PUNCH_HOLE. @@ -61,7 +71,29 @@  #define lsetxattr(path,key,value,size,flags) setxattr(path,key,value,size,flags)  #endif /* HAVE_LLISTXATTR */ -#endif /* GF_LINUX_HOST_OS */ + + +#ifdef GF_DARWIN_HOST_OS +#include <machine/endian.h> +#include <libkern/OSByteOrder.h> + +#define htobe16(x) OSSwapHostToBigInt16(x) +#define htole16(x) OSSwapHostToLittleInt16(x) +#define be16toh(x) OSSwapBigToHostInt16(x) +#define le16toh(x) OSSwapLittleToHostInt16(x) + +#define htobe32(x) OSSwapHostToBigInt32(x) +#define htole32(x) OSSwapHostToLittleInt32(x) +#define be32toh(x) OSSwapBigToHostInt32(x) +#define le32toh(x) OSSwapLittleToHostInt32(x) + +#define htobe64(x) OSSwapHostToBigInt64(x) +#define htole64(x) OSSwapHostToLittleInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#define le64toh(x) OSSwapLittleToHostInt64(x) + +#endif +  #ifdef GF_BSD_HOST_OS  /* In case of FreeBSD and NetBSD */ @@ -125,12 +157,29 @@ enum {  #endif /* GF_BSD_HOST_OS */  #ifdef GF_DARWIN_HOST_OS +#include <machine/endian.h> +#include <libkern/OSByteOrder.h> + +#define htobe16(x) OSSwapHostToBigInt16(x) +#define htole16(x) OSSwapHostToLittleInt16(x) +#define be16toh(x) OSSwapBigToHostInt16(x) +#define le16toh(x) OSSwapLittleToHostInt16(x) + +#define htobe32(x) OSSwapHostToBigInt32(x) +#define htole32(x) OSSwapHostToLittleInt32(x) +#define be32toh(x) OSSwapBigToHostInt32(x) +#define le32toh(x) OSSwapLittleToHostInt32(x) + +#define htobe64(x) OSSwapHostToBigInt64(x) +#define htole64(x) OSSwapHostToLittleInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#define le64toh(x) OSSwapLittleToHostInt64(x)  #define UNIX_PATH_MAX 104 +#define AT_SYMLINK_NOFOLLOW 0x100  #include <sys/types.h>  #include <sys/un.h> -#include <machine/endian.h>  #include <sys/xattr.h>  #include <limits.h> diff --git a/libglusterfs/src/dict.c b/libglusterfs/src/dict.c index 1bed8bf9b69..1198c65b1d4 100644 --- a/libglusterfs/src/dict.c +++ b/libglusterfs/src/dict.c @@ -1041,7 +1041,7 @@ data_to_uint8 (data_t *data)  	errno = 0;  	value = strtol (str, NULL, 0); -	if ((UCHAR_MAX - value) < 0) { +	if ((UCHAR_MAX - (uint8_t)value) < 0) {  		errno = ERANGE;  		gf_log_callingfn ("dict", GF_LOG_WARNING,  				  "data conversion overflow detected (%s)", @@ -2157,7 +2157,7 @@ dict_set_bin (dict_t *this, char *key, void *ptr, size_t size)          data_t * data = NULL;          int      ret  = 0; -        if (!ptr || (size < 0)) { +        if (!ptr || (size > ULONG_MAX)) {                  ret = -EINVAL;                  goto err;          } @@ -2185,7 +2185,7 @@ dict_set_static_bin (dict_t *this, char *key, void *ptr, size_t size)          data_t * data = NULL;          int      ret  = 0; -        if (!ptr || (size < 0)) { +        if (!ptr || (size > ULONG_MAX)) {                  ret = -EINVAL;                  goto err;          } diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 36cc4d0561f..2d50aa62e42 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -59,7 +59,7 @@ gf_fd_fdtable_expand (fdtable_t *fdtable, uint32_t nr)          uint32_t     oldmax_fds = -1;          int          ret = -1; -        if (fdtable == NULL || nr < 0) { +        if (fdtable == NULL || nr > UINT32_MAX) {                  gf_log_callingfn ("fd", GF_LOG_ERROR, "invalid argument");                  ret = EINVAL;                  goto out; diff --git a/libglusterfs/src/glusterfs.h b/libglusterfs/src/glusterfs.h index c419308f9b5..96a203770e6 100644 --- a/libglusterfs/src/glusterfs.h +++ b/libglusterfs/src/glusterfs.h @@ -162,7 +162,7 @@  /* TODO: Keeping it to 200, so that we can fit in 2KB buffer for auth data   * in RPC server code, if there is ever need for having more aux-gids, then   * we have to add aux-gid in payload of actors */ -#define GF_MAX_AUX_GROUPS   65536 +#define GF_MAX_AUX_GROUPS   65535  #define GF_UUID_BUF_SIZE 50 diff --git a/libglusterfs/src/logging.c b/libglusterfs/src/logging.c index f343731c7f4..2afa2f35431 100644 --- a/libglusterfs/src/logging.c +++ b/libglusterfs/src/logging.c @@ -21,9 +21,16 @@  #include <locale.h>  #include <string.h>  #include <stdlib.h> +#include <syslog.h> +#ifdef HAVE_LIBINTL_H  #include <libintl.h> -#include <syslog.h> +#endif + +#ifdef HAVE_BACKTRACE +#include <execinfo.h> +#endif +  #include <sys/stat.h>  #include "gf-error-codes.h" @@ -40,14 +47,6 @@  #include "defaults.h"  #include "glusterfs.h" -#ifdef GF_LINUX_HOST_OS -#include <syslog.h> -#endif - -#ifdef HAVE_BACKTRACE -#include <execinfo.h> -#endif -  static char *gf_level_strings[] = {"",  /* NONE */                  "M", /* EMERGENCY */                  "A", /* ALERT */ @@ -374,9 +373,10 @@ gf_openlog (const char *ident, int option, int facility)          /* TODO: Should check for errors here and return appropriately */          setlocale(LC_ALL, ""); +#ifdef HAVE_LIBINTL_H          bindtextdomain("gluster", "/usr/share/locale");          textdomain("gluster"); - +#endif          /* close the previous syslog if open as we are changing settings */          closelog ();          openlog(ident, _option, _facility); diff --git a/libglusterfs/src/logging.h b/libglusterfs/src/logging.h index 210602c3210..3c83ebbc0e3 100644 --- a/libglusterfs/src/logging.h +++ b/libglusterfs/src/logging.h @@ -24,17 +24,27 @@  #ifdef GF_DARWIN_HOST_OS  #define GF_PRI_FSBLK       "u"  #define GF_PRI_DEV         PRId32 -#define GF_PRI_NLINK       PRIu16 +#define GF_PRI_INODE       PRIu64 +#define GF_PRI_NLINK       PRIu32 +#define GF_PRI_SECOND      "ld"  #define GF_PRI_SUSECONDS   "06d" +#define GF_PRI_USEC        "d"  #else  #define GF_PRI_FSBLK       PRIu64  #define GF_PRI_DEV         PRIu64 +#define GF_PRI_INODE       PRIu64  #define GF_PRI_NLINK       PRIu32 +#define GF_PRI_SECOND      "lu"  #define GF_PRI_SUSECONDS   "06ld"  #endif  #define GF_PRI_BLKSIZE     PRId32  #define GF_PRI_SIZET       "zu" +#ifdef GF_DARWIN_HOST_OS +#define GF_PRI_TIME "ld" +#else +#define GF_PRI_TIME PRIu64 +#endif  #if 0  /* Syslog definitions :-) */ diff --git a/libglusterfs/src/lvm-defaults.h b/libglusterfs/src/lvm-defaults.h new file mode 100644 index 00000000000..4d3b010b200 --- /dev/null +++ b/libglusterfs/src/lvm-defaults.h @@ -0,0 +1,25 @@ +/* +  Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com> +  This file is part of GlusterFS. + +  This file is licensed to you under your choice of the GNU Lesser +  General Public License, version 3 or any later version (LGPLv3 or +  later), or the GNU General Public License, version 2 (GPLv2), in all +  cases as published by the Free Software Foundation. +*/ + +#ifndef _LVM_DEFAULTS_H +#define _LVM_DEFAULTS_H + +#ifndef _CONFIG_H +#define _CONFIG_H +#include "config.h" +#endif + +#define LVM_RESIZE "/sbin/lvresize" +#define LVM_CREATE "/sbin/lvcreate" +#define LVM_CONVERT "/sbin/lvconvert" +#define LVM_REMOVE "/sbin/lvremove" +#define LVS "/sbin/lvs" + +#endif /* _LVM_DEFAULTS_H */ diff --git a/libglusterfs/src/options.c b/libglusterfs/src/options.c index a0881b4ad91..f63c60476da 100644 --- a/libglusterfs/src/options.c +++ b/libglusterfs/src/options.c @@ -79,7 +79,7 @@ xlator_option_validate_int (xlator_t *xl, const char *key, const char *value,                  goto out;          } -        if ((opt->validate == GF_OPT_VALIDATE_MIN)) { +        if (opt->validate == GF_OPT_VALIDATE_MIN) {                  if (inputll < opt->min) {                          snprintf (errstr, 256,                                    "'%lld' in 'option %s %s' is smaller than " @@ -88,8 +88,8 @@ xlator_option_validate_int (xlator_t *xl, const char *key, const char *value,                          gf_log (xl->name, GF_LOG_ERROR, "%s", errstr);                          goto out;                  } -        } else if ((opt->validate == GF_OPT_VALIDATE_MAX)) { -                if ((inputll > opt->max)) { +        } else if (opt->validate == GF_OPT_VALIDATE_MAX) { +                if (inputll > opt->max) {                          snprintf (errstr, 256,                                    "'%lld' in 'option %s %s' is greater than "                                    "maximum value '%.0f'", inputll, key, @@ -118,12 +118,12 @@ static int  xlator_option_validate_sizet (xlator_t *xl, const char *key, const char *value,                                volume_option_t *opt, char **op_errstr)  { -        uint64_t  size = 0; +        size_t  size = 0;          int       ret = 0;          char      errstr[256];          /* Check the range */ -        if (gf_string2bytesize (value, &size) != 0) { +        if (gf_string2bytesize_size (value, &size) != 0) {                  snprintf (errstr, 256,                            "invalid number format \"%s\" in option \"%s\"",                            value, key); @@ -142,13 +142,13 @@ xlator_option_validate_sizet (xlator_t *xl, const char *key, const char *value,          if ((size < opt->min) || (size > opt->max)) {                  if ((strncmp (key, "cache-size", 10) == 0) &&                      (size > opt->max)) { -                       snprintf (errstr, 256, "Cache size %"PRId64" is out of " +                       snprintf (errstr, 256, "Cache size %" GF_PRI_SIZET " is out of "                                   "range [%.0f - %.0f]",                                   size, opt->min, opt->max);                         gf_log (xl->name, GF_LOG_WARNING, "%s", errstr);                  } else {                          snprintf (errstr, 256, -                                  "'%"PRId64"' in 'option %s %s' " +                                  "'%" GF_PRI_SIZET "' in 'option %s %s' "                                    "is out of range [%.0f - %.0f]",                                    size, key, value, opt->min, opt->max);                          gf_log (xl->name, GF_LOG_ERROR, "%s", errstr); @@ -478,7 +478,7 @@ xlator_option_validate_double (xlator_t *xl, const char *key, const char *value,                  goto out;          } -        if ((opt->validate == GF_OPT_VALIDATE_MIN)) { +        if (opt->validate == GF_OPT_VALIDATE_MIN) {                  if (input < opt->min) {                          snprintf (errstr, 256,                                    "'%f' in 'option %s %s' is smaller than " @@ -487,8 +487,8 @@ xlator_option_validate_double (xlator_t *xl, const char *key, const char *value,                          gf_log (xl->name, GF_LOG_ERROR, "%s", errstr);                          goto out;                  } -        } else if ((opt->validate == GF_OPT_VALIDATE_MAX)) { -                if ((input > opt->max)) { +        } else if (opt->validate == GF_OPT_VALIDATE_MAX) { +                if (input > opt->max) {                          snprintf (errstr, 256,                                    "'%f' in 'option %s %s' is greater than "                                    "maximum value '%f'", input, key, @@ -617,12 +617,12 @@ out:  static int  gf_validate_size (const char *sizestr, volume_option_t *opt)  { -        uint64_t                value = 0; +        size_t                value = 0;          int                     ret = 0;          GF_ASSERT (opt); -        if (gf_string2bytesize (sizestr, &value) != 0 || +        if (gf_string2bytesize_size (sizestr, &value) != 0 ||              value < opt->min ||              value % 512) {                  ret = -1; @@ -787,7 +787,7 @@ xlator_option_validate (xlator_t *xl, char *key, char *value,                  [GF_OPTION_TYPE_MAX]         = NULL,          }; -        if (opt->type < 0 || opt->type >= GF_OPTION_TYPE_MAX) { +        if (opt->type > GF_OPTION_TYPE_MAX) {                  gf_log (xl->name, GF_LOG_ERROR,                          "unknown option type '%d'", opt->type);                  goto out; @@ -1120,18 +1120,18 @@ pc_or_size (char *in, double *out)  {          double  pc = 0;          int       ret = 0; -        uint64_t  size = 0; +        size_t  size = 0;          if (gf_string2percent (in, &pc) == 0) {                  if (pc > 100.0) { -                        ret = gf_string2bytesize (in, &size); +                        ret = gf_string2bytesize_size (in, &size);                          if (!ret)                                  *out = size;                  } else {                          *out = pc;                  }          } else { -                ret = gf_string2bytesize (in, &size); +                ret = gf_string2bytesize_size (in, &size);                  if (!ret)                          *out = size;          } @@ -1143,7 +1143,8 @@ DEFINE_INIT_OPT(uint64_t, uint64, gf_string2uint64);  DEFINE_INIT_OPT(int64_t, int64, gf_string2int64);  DEFINE_INIT_OPT(uint32_t, uint32, gf_string2uint32);  DEFINE_INIT_OPT(int32_t, int32, gf_string2int32); -DEFINE_INIT_OPT(uint64_t, size, gf_string2bytesize); +DEFINE_INIT_OPT(size_t, size, gf_string2bytesize_size); +DEFINE_INIT_OPT(uint64_t, size_uint64, gf_string2bytesize_uint64);  DEFINE_INIT_OPT(double, percent, gf_string2percent);  DEFINE_INIT_OPT(double, percent_or_size, pc_or_size);  DEFINE_INIT_OPT(gf_boolean_t, bool, gf_string2boolean); @@ -1158,7 +1159,8 @@ DEFINE_RECONF_OPT(uint64_t, uint64, gf_string2uint64);  DEFINE_RECONF_OPT(int64_t, int64, gf_string2int64);  DEFINE_RECONF_OPT(uint32_t, uint32, gf_string2uint32);  DEFINE_RECONF_OPT(int32_t, int32, gf_string2int32); -DEFINE_RECONF_OPT(uint64_t, size, gf_string2bytesize); +DEFINE_RECONF_OPT(size_t, size, gf_string2bytesize_size); +DEFINE_RECONF_OPT(uint64_t, size_uint64, gf_string2bytesize_uint64);  DEFINE_RECONF_OPT(double, percent, gf_string2percent);  DEFINE_RECONF_OPT(double, percent_or_size, pc_or_size);  DEFINE_RECONF_OPT(gf_boolean_t, bool, gf_string2boolean); diff --git a/libglusterfs/src/options.h b/libglusterfs/src/options.h index 134cc360293..05a3d4332cf 100644 --- a/libglusterfs/src/options.h +++ b/libglusterfs/src/options.h @@ -108,7 +108,8 @@ DECLARE_INIT_OPT(uint64_t, uint64);  DECLARE_INIT_OPT(int64_t, int64);  DECLARE_INIT_OPT(uint32_t, uint32);  DECLARE_INIT_OPT(int32_t, int32); -DECLARE_INIT_OPT(uint64_t, size); +DECLARE_INIT_OPT(size_t, size); +DECLARE_INIT_OPT(uint64_t, size_uint64);  DECLARE_INIT_OPT(double, percent);  DECLARE_INIT_OPT(double, percent_or_size);  DECLARE_INIT_OPT(gf_boolean_t, bool); @@ -163,8 +164,12 @@ xlator_option_init_##type (xlator_t *this, dict_t *options, char *key,  \          THIS = this;                                                    \          ret = conv (value, val_p);                                      \          THIS = old_THIS;                                                \ -        if (ret)                                                        \ +        if (ret) {							\ +                gf_log (this->name, GF_LOG_INFO,                        \ +                        "option %s convertion failed value %s",         \ +                        key, value);                                    \                  return ret;                                             \ +	}                                                               \          ret = xlator_option_validate (this, key, value, opt, NULL);     \          return ret;                                                     \  } @@ -189,7 +194,8 @@ DECLARE_RECONF_OPT(uint64_t, uint64);  DECLARE_RECONF_OPT(int64_t, int64);  DECLARE_RECONF_OPT(uint32_t, uint32);  DECLARE_RECONF_OPT(int32_t, int32); -DECLARE_RECONF_OPT(uint64_t, size); +DECLARE_RECONF_OPT(size_t, size); +DECLARE_RECONF_OPT(uint64_t, size_uint64);  DECLARE_RECONF_OPT(double, percent);  DECLARE_RECONF_OPT(double, percent_or_size);  DECLARE_RECONF_OPT(gf_boolean_t, bool); diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c index d1b9ef84c96..7236958677d 100644 --- a/libglusterfs/src/syscall.c +++ b/libglusterfs/src/syscall.c @@ -19,6 +19,7 @@  #include <sys/types.h>  #include <utime.h>  #include <sys/time.h> +#include <fcntl.h>  int  sys_lstat (const char *path, struct stat *buf) @@ -41,12 +42,58 @@ sys_fstat (int fd, struct stat *buf)  } +int +sys_fstatat(int dirfd, const char *pathname, struct stat *buf, int flags) +{ +#ifdef GF_DARWIN_HOST_OS +        if (fchdir(dirfd) < 0) +                return -1; +        if(flags & AT_SYMLINK_NOFOLLOW) +                return lstat(pathname, buf); +        else +                return stat(pathname, buf); +#else +        return fstatat (dirfd, pathname, buf, flags); +#endif +} + + +int +sys_openat(int dirfd, const char *pathname, int flags, ...) +{ +        mode_t mode = 0; +        if (flags & O_CREAT) { +                va_list ap; +                va_start(ap, flags); +                mode = va_arg(ap, int); +                va_end(ap); +        } + +#ifdef GF_DARWIN_HOST_OS +        if (fchdir(dirfd) < 0) +                return -1; +        return open (pathname, flags, mode); +#else +        return openat (dirfd, pathname, flags, mode); +#endif +} +  DIR *  sys_opendir (const char *name)  {          return opendir (name);  } +int sys_mkdirat(int dirfd, const char *pathname, mode_t mode) +{ +#ifdef GF_DARWIN_HOST_OS +        if(fchdir(dirfd) < 0) +                return -1; +        return mkdir(pathname, mode); +#else +        return mkdirat (dirfd, pathname, mode); +#endif +}  struct dirent *  sys_readdir (DIR *dir) @@ -262,13 +309,43 @@ sys_fsync (int fd)  int  sys_fdatasync (int fd)  { -#ifdef HAVE_FDATASYNC -        return fdatasync (fd); +#ifdef GF_DARWIN_HOST_OS +        return fcntl (fd, F_FULLFSYNC);  #else -        return 0; +        return fdatasync (fd);  #endif  } +void +gf_add_prefix(const char *ns, const char *key, char **newkey) +{ +        /* if we dont have any namespace, append USER NS */ +        if (strncmp(key, XATTR_USER_PREFIX,     XATTR_USER_PREFIX_LEN) && +            strncmp(key, XATTR_TRUSTED_PREFIX,  XATTR_TRUSTED_PREFIX_LEN) && +            strncmp(key, XATTR_SECURITY_PREFIX, XATTR_TRUSTED_PREFIX_LEN) && +            strncmp(key, XATTR_SYSTEM_PREFIX,   XATTR_SYSTEM_PREFIX_LEN)) { +                int ns_length =  strlen(ns); +                *newkey = GF_MALLOC(ns_length + strlen(key) + 10, +                                    gf_common_mt_char); +                strcpy(*newkey, ns); +                strcat(*newkey, key); +        } else { +                *newkey = gf_strdup(key); +        } +} + +void +gf_remove_prefix(const char *ns, const char *key, char **newkey) +{ +        int ns_length =  strlen(ns); +        if (strncmp(key, ns, ns_length) == 0) { +                *newkey = GF_MALLOC(-ns_length + strlen(key) + 10, +                                    gf_common_mt_char); +                strcpy(*newkey, key + ns_length); +        } else { +                *newkey = gf_strdup(key); +        } +}  int  sys_lsetxattr (const char *path, const char *name, const void *value, @@ -289,8 +366,11 @@ sys_lsetxattr (const char *path, const char *name, const void *value,  #endif  #ifdef GF_DARWIN_HOST_OS +        /* OS X clients will carry other flags, which will be used on a +           OS X host, but masked out on others. GF assume NOFOLLOW on Linux, +           enforcing  */          return setxattr (path, name, value, size, 0, -                         flags|XATTR_NOFOLLOW); +                         (flags & ~XATTR_NOSECURITY) | XATTR_NOFOLLOW);  #endif  } @@ -313,12 +393,10 @@ sys_llistxattr (const char *path, char *list, size_t size)  #endif  #ifdef GF_DARWIN_HOST_OS -        return listxattr (path, list, size, XATTR_NOFOLLOW); +        return  listxattr (path, list, size, XATTR_NOFOLLOW);  #endif -  } -  ssize_t  sys_lgetxattr (const char *path, const char *name, void *value, size_t size)  { @@ -337,7 +415,7 @@ sys_lgetxattr (const char *path, const char *name, void *value, size_t size)  #endif  #ifdef GF_DARWIN_HOST_OS -        return getxattr (path, name, value, size, 0, XATTR_NOFOLLOW); +         return getxattr (path, name, value, size, 0, XATTR_NOFOLLOW);  #endif  } @@ -412,7 +490,7 @@ sys_fsetxattr (int filedes, const char *name, const void *value,  #endif  #ifdef GF_DARWIN_HOST_OS -        return fsetxattr (filedes, name, value, size, 0, flags); +        return fsetxattr (filedes, name, value, size, 0, flags & ~XATTR_NOSECURITY);  #endif  } @@ -435,7 +513,7 @@ sys_flistxattr (int filedes, char *list, size_t size)  #endif  #ifdef GF_DARWIN_HOST_OS -        return flistxattr (filedes, list, size, XATTR_NOFOLLOW); +	return flistxattr (filedes, list, size, XATTR_NOFOLLOW);  #endif  } @@ -491,4 +569,3 @@ sys_fallocate(int fd, int mode, off_t offset, off_t len)  	errno = ENOSYS;  	return -1;  } - diff --git a/libglusterfs/src/syscall.h b/libglusterfs/src/syscall.h index f1c9f58c3fc..bbf23bef07b 100644 --- a/libglusterfs/src/syscall.h +++ b/libglusterfs/src/syscall.h @@ -11,6 +11,41 @@  #ifndef __SYSCALL_H__  #define __SYSCALL_H__ +/* GF follows the Linux XATTR definition, which differs in Darwin. */ +#define GF_XATTR_CREATE  0x1 /* set value, fail if attr already exists */ +#define GF_XATTR_REPLACE 0x2 /* set value, fail if attr does not exist */ + +/* Linux kernel version 2.6.x don't have these defined +   define if not defined */ + +#ifndef XATTR_SECURITY_PREFIX +#define XATTR_SECURITY_PREFIX "security." +#define XATTR_SECURITY_PREFIX_LEN (sizeof (XATTR_SECURITY_PREFIX) - 1) +#endif + +#ifndef XATTR_SYSTEM_PREFIX +#define XATTR_SYSTEM_PREFIX "system." +#define XATTR_SYSTEM_PREFIX_LEN (sizeof (XATTR_SYSTEM_PREFIX) - 1) +#endif + +#ifndef XATTR_TRUSTED_PREFIX +#define XATTR_TRUSTED_PREFIX "trusted." +#define XATTR_TRUSTED_PREFIX_LEN (sizeof (XATTR_TRUSTED_PREFIX) - 1) +#endif + +#ifndef XATTR_USER_PREFIX +#define XATTR_USER_PREFIX "user." +#define XATTR_USER_PREFIX_LEN (sizeof (XATTR_USER_PREFIX) - 1) +#endif + +#if defined(GF_DARWIN_HOST_OS) +#include <sys/xattr.h> +#define XATTR_DARWIN_NOSECURITY XATTR_NOSECURITY +#define XATTR_DARWIN_NODEFAULT  XATTR_NODEFAULT +#define XATTR_DARWIN_SHOWCOMPRESSION XATTR_SHOWCOMPRESSION +#endif + +  int  sys_lstat (const char *path, struct stat *buf); @@ -20,8 +55,13 @@ sys_stat (const char *path, struct stat *buf);  int  sys_fstat (int fd, struct stat *buf); -DIR * -sys_opendir (const char *name); +int +sys_fstatat (int dirfd, const char *pathname, struct stat *buf, +             int flags); +int +sys_openat (int dirfd, const char *pathname, int flags, ...); + +DIR *sys_opendir (const char *name);  struct dirent *  sys_readdir (DIR *dir); @@ -39,6 +79,9 @@ int  sys_mkdir (const char *pathname, mode_t mode);  int +sys_mkdirat (int dirfd, const char *pathname, mode_t mode); + +int  sys_unlink (const char *pathname);  int @@ -107,6 +150,12 @@ sys_fsync (int fd);  int  sys_fdatasync (int fd); +void +gf_add_prefix(const char *ns, const char *key, char **newkey); + +void +gf_remove_prefix(const char *ns, const char *key, char **newkey); +  int  sys_lsetxattr (const char *path, const char *name, const void *value,                 size_t size, int flags); diff --git a/libglusterfs/src/timespec.c b/libglusterfs/src/timespec.c index a0c281a1efb..5242ecc8cd0 100644 --- a/libglusterfs/src/timespec.c +++ b/libglusterfs/src/timespec.c @@ -10,54 +10,51 @@  #include <stdio.h>  #include <inttypes.h> -#if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || defined GF_BSD_HOST_OS  #include <time.h>  #include <sys/time.h> -#endif  #if defined GF_DARWIN_HOST_OS  #include <mach/mach_time.h> +static mach_timebase_info_data_t gf_timebase;  #endif  #include "logging.h" -#include "time.h" - - -void tv2ts (struct timeval tv, struct timespec *ts) -{ -        ts->tv_sec  = tv.tv_sec; -        ts->tv_nsec = tv.tv_usec * 1000; -} +#include "timespec.h"  void timespec_now (struct timespec *ts)  {  #if defined GF_LINUX_HOST_OS || defined GF_SOLARIS_HOST_OS || defined GF_BSD_HOST_OS -          if (0 == clock_gettime(CLOCK_MONOTONIC, ts))                  return;          else {                  struct timeval tv;                  if (0 == gettimeofday(&tv, NULL)) -                        tv2ts(tv, ts); +                        TIMEVAL_TO_TIMESPEC(&tv, ts);          }  #elif defined GF_DARWIN_HOST_OS -        mach_timebase_info_data_t tb = { 0 }; -        static double timebase = 0.0; -        uint64_t time = 0; -        mach_timebase_info (&tb); +        uint64_t time = mach_absolute_time(); +        static double scaling = 0.0; -        timebase *= info.numer; -        timebase /= info.denom; +        if (mach_timebase_info(&gf_timebase) != KERN_SUCCESS) { +                gf_timebase.numer = 1; +                gf_timebase.denom = 1; +        } +        if (gf_timebase.denom == 0) { +                gf_timebase.numer = 1; +                gf_timebase.denom = 1; +        } -        time = mach_absolute_time(); -        time *= timebase; +        scaling = (double) gf_timebase.numer / (double) gf_timebase.denom; +        time *= scaling;          ts->tv_sec = (time * NANO); -        ts->tv_nsec = (time - (ts.tv_sec * GIGA)); +        ts->tv_nsec = (time - (ts->tv_sec * GIGA));  #endif /* Platform verification */ -        gf_log_callingfn ("timer", GF_LOG_DEBUG, "%"PRIu64".%09"PRIu64, +	/* +        gf_log_callingfn ("timer", GF_LOG_TRACE, "%"GF_PRI_TIME".%09"GF_PRI_TIME,                            ts->tv_sec, ts->tv_nsec); +	*/  }  void timespec_adjust_delta (struct timespec *ts, struct timespec delta) diff --git a/libglusterfs/src/timespec.h b/libglusterfs/src/timespec.h index 490255df9f3..f37194b97cf 100644 --- a/libglusterfs/src/timespec.h +++ b/libglusterfs/src/timespec.h @@ -12,12 +12,12 @@  #define __INCLUDE_TIMESPEC_H__  #include <stdint.h> +#include <sys/time.h>  #define TS(ts)  ((ts.tv_sec * 1000000000LL) + ts.tv_nsec)  #define NANO (+1.0E-9)  #define GIGA UINT64_C(1000000000) -void tv2ts (struct timeval tv, struct timespec *ts);  void timespec_now (struct timespec *ts);  void timespec_adjust_delta (struct timespec *ts, struct timespec delta); diff --git a/rpc/rpc-lib/src/Makefile.am b/rpc/rpc-lib/src/Makefile.am index 4cdeaad0b4d..ee2f27b259b 100644 --- a/rpc/rpc-lib/src/Makefile.am +++ b/rpc/rpc-lib/src/Makefile.am @@ -2,10 +2,10 @@ lib_LTLIBRARIES = libgfrpc.la  libgfrpc_la_SOURCES = auth-unix.c rpcsvc-auth.c rpcsvc.c auth-null.c \  	rpc-transport.c xdr-rpc.c xdr-rpcclnt.c rpc-clnt.c auth-glusterfs.c \ -	rpc-drc.c +	rpc-drc.c $(CONTRIBDIR)/sunrpc/xdr_sizeof.c  libgfrpc_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la -libgfrpc_la_LDFLAGS = -version-info $(LIBGFRPC_LT_VERSION) +libgfrpc_la_LDFLAGS = -version-info $(LIBGFRPC_LT_VERSION) $(GF_LDFLAGS)  noinst_HEADERS = rpcsvc.h rpc-transport.h xdr-common.h xdr-rpc.h xdr-rpcclnt.h \  	rpc-clnt.h rpcsvc-common.h protocol-common.h rpc-drc.h diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c index e095c55b3d9..3106342e970 100644 --- a/rpc/rpc-lib/src/rpc-clnt.c +++ b/rpc/rpc-lib/src/rpc-clnt.c @@ -717,8 +717,9 @@ rpc_clnt_handle_cbk (struct rpc_clnt *clnt, rpc_transport_pollin_t *msg)          }          gf_log (clnt->conn.name, GF_LOG_TRACE, -                "received rpc message (XID: 0x%lx, " -                "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) " +		"receivd rpc message (XID: 0x%" GF_PRI_RPC_XID ", " +		"Ver: %" GF_PRI_RPC_VERSION ", Program: %" GF_PRI_RPC_PROG_ID ", " +		"ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC ") "                  "from rpc-transport (%s)", rpc_call_xid (&rpcmsg),                  rpc_call_rpcvers (&rpcmsg), rpc_call_program (&rpcmsg),                  rpc_call_progver (&rpcmsg), rpc_call_progproc (&rpcmsg), @@ -1141,7 +1142,7 @@ xdr_serialize_glusterfs_auth (char *dest, struct auth_glusterfs_parms_v2 *au)  {          ssize_t ret = -1;          XDR     xdr; -        uint64_t ngroups = 0; +        u_long  ngroups = 0;          int     max_groups = 0;          if ((!dest) || (!au)) diff --git a/rpc/rpc-lib/src/rpc-drc.c b/rpc/rpc-lib/src/rpc-drc.c index 7e77e038e5d..0babb9bc43c 100644 --- a/rpc/rpc-lib/src/rpc-drc.c +++ b/rpc/rpc-lib/src/rpc-drc.c @@ -460,7 +460,7 @@ rpcsvc_vacate_drc_entries (rpcsvc_drc_globals_t *drc)                  client = reply->client; -                (void *)rb_delete (client->rbtree, reply); +                rb_delete (client->rbtree, reply);                  rpcsvc_drc_op_destroy (drc, reply);                  rpcsvc_drc_client_unref (drc, client); diff --git a/rpc/rpc-lib/src/rpcsvc.c b/rpc/rpc-lib/src/rpcsvc.c index 34ee6f21b49..f2cdfb23819 100644 --- a/rpc/rpc-lib/src/rpcsvc.c +++ b/rpc/rpc-lib/src/rpcsvc.c @@ -423,9 +423,10 @@ rpcsvc_request_create (rpcsvc_t *svc, rpc_transport_t *trans,          ret = -1;          rpcsvc_request_init (svc, trans, &rpcmsg, progmsg, msg, req); -        gf_log (GF_RPCSVC, GF_LOG_TRACE, "received rpc-message (XID: 0x%lx, " -                "Ver: %ld, Program: %ld, ProgVers: %ld, Proc: %ld) from" -                " rpc-transport (%s)", rpc_call_xid (&rpcmsg), +        gf_log (GF_RPCSVC, GF_LOG_TRACE, "received rpc-message " +		"(XID: 0x%" GF_PRI_RPC_XID ", Ver: %" GF_PRI_RPC_VERSION ", Program: %" GF_PRI_RPC_PROG_ID ", " +		"ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC ") " +                "from rpc-transport (%s)", rpc_call_xid (&rpcmsg),                  rpc_call_rpcvers (&rpcmsg), rpc_call_program (&rpcmsg),                  rpc_call_progver (&rpcmsg), rpc_call_progproc (&rpcmsg),                  trans->name); @@ -434,8 +435,9 @@ rpcsvc_request_create (rpcsvc_t *svc, rpc_transport_t *trans,                  /* LOG- TODO: print rpc version, also print the peerinfo                     from transport */                  gf_log (GF_RPCSVC, GF_LOG_ERROR, "RPC version not supported " -                        "(XID: 0x%lx, Ver: %ld, Prog: %ld, ProgVers: %ld, " -                        "Proc: %ld) from trans (%s)", rpc_call_xid (&rpcmsg), +			"(XID: 0x%" GF_PRI_RPC_XID ", Ver: %" GF_PRI_RPC_VERSION ", Program: %" GF_PRI_RPC_PROG_ID ", " +			"ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC ") " +			"from trans (%s)", rpc_call_xid (&rpcmsg),                          rpc_call_rpcvers (&rpcmsg), rpc_call_program (&rpcmsg),                          rpc_call_progver (&rpcmsg), rpc_call_progproc (&rpcmsg),                          trans->name); @@ -451,8 +453,9 @@ rpcsvc_request_create (rpcsvc_t *svc, rpc_transport_t *trans,                   */                  rpcsvc_request_seterr (req, AUTH_ERROR);                  gf_log (GF_RPCSVC, GF_LOG_ERROR, "auth failed on request. " -                        "(XID: 0x%lx, Ver: %ld, Prog: %ld, ProgVers: %ld, " -                        "Proc: %ld) from trans (%s)", rpc_call_xid (&rpcmsg), +			"(XID: 0x%" GF_PRI_RPC_XID ", Ver: %" GF_PRI_RPC_VERSION ", Program: %" GF_PRI_RPC_PROG_ID ", " +			"ProgVers: %" GF_PRI_RPC_PROG_VERS ", Proc: %" GF_PRI_RPC_PROC ") " +                        "from trans (%s)", rpc_call_xid (&rpcmsg),                          rpc_call_rpcvers (&rpcmsg), rpc_call_program (&rpcmsg),                          rpc_call_progver (&rpcmsg), rpc_call_progproc (&rpcmsg),                          trans->name); @@ -797,15 +800,9 @@ err:          return txrecord;  } -static inline int -rpcsvc_get_callid (rpcsvc_t *rpc) -{ -        return GF_UNIVERSAL_ANSWER; -} -  int  rpcsvc_fill_callback (int prognum, int progver, int procnum, int payload, -                      uint64_t xid, struct rpc_msg *request) +                      uint32_t xid, struct rpc_msg *request)  {          int   ret          = -1; @@ -870,9 +867,9 @@ out:          return txrecord;  } -struct iobuf * +static struct iobuf *  rpcsvc_callback_build_record (rpcsvc_t *rpc, int prognum, int progver, -                              int procnum, size_t payload, uint64_t xid, +                              int procnum, size_t payload, u_long xid,                                struct iovec *recbuf)  {          struct rpc_msg           request     = {0, }; @@ -892,7 +889,7 @@ rpcsvc_callback_build_record (rpcsvc_t *rpc, int prognum, int progver,                                      &request);          if (ret == -1) {                  gf_log ("rpcsvc", GF_LOG_WARNING, "cannot build a rpc-request " -                        "xid (%"PRIu64")", xid); +                        "xid (%" GF_PRI_RPC_XID ")", xid);                  goto out;          } @@ -939,7 +936,6 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,          rpc_transport_req_t    req;          int                    ret         = -1;          int                    proglen     = 0; -        uint64_t               callid      = 0;          if (!rpc) {                  goto out; @@ -947,15 +943,14 @@ rpcsvc_callback_submit (rpcsvc_t *rpc, rpc_transport_t *trans,          memset (&req, 0, sizeof (req)); -        callid = rpcsvc_get_callid (rpc); -          if (proghdr) {                  proglen += iov_length (proghdr, proghdrcount);          }          request_iob = rpcsvc_callback_build_record (rpc, prog->prognum,                                                      prog->progver, procnum, -                                                    proglen, callid, +                                                    proglen, +                                                    GF_UNIVERSAL_ANSWER,                                                      &rpchdr);          if (!request_iob) {                  gf_log ("rpcsvc", GF_LOG_WARNING, @@ -1256,7 +1251,7 @@ rpcsvc_program_register_portmap (rpcsvc_program_t *newprog, uint32_t port)          if (!(pmap_set (newprog->prognum, newprog->progver, IPPROTO_TCP,                          port))) {                  gf_log (GF_RPCSVC, GF_LOG_ERROR, "Could not register with" -                        " portmap"); +                        " portmap %d %d %u", newprog->prognum, newprog->progver, port);                  goto out;          } diff --git a/rpc/rpc-lib/src/xdr-common.h b/rpc/rpc-lib/src/xdr-common.h index f221192adbe..78c72e509ef 100644 --- a/rpc/rpc-lib/src/xdr-common.h +++ b/rpc/rpc-lib/src/xdr-common.h @@ -18,8 +18,8 @@  #include <rpc/types.h>  #include <sys/types.h> -#include <rpc/auth.h>  #include <rpc/xdr.h> +#include <rpc/auth.h>  #include <sys/uio.h>  #ifdef __NetBSD__ @@ -68,7 +68,9 @@ enum gf_dump_procnum {  #define xdr_u_quad_t xdr_u_int64_t  #define xdr_quad_t   xdr_int64_t  #define xdr_uint32_t xdr_u_int32_t -#define uint64_t u_int64_t +#define xdr_uint64_t xdr_u_int64_t + +unsigned long xdr_sizeof (xdrproc_t func, void *data);  #endif  #if defined(__NetBSD__) diff --git a/rpc/rpc-lib/src/xdr-rpc.h b/rpc/rpc-lib/src/xdr-rpc.h index f5f4a941e92..4663ef7966a 100644 --- a/rpc/rpc-lib/src/xdr-rpc.h +++ b/rpc/rpc-lib/src/xdr-rpc.h @@ -78,4 +78,21 @@ xdr_to_auth_unix_cred (char *msgbuf, int msglen, struct authunix_parms *au,  #define rpc_call_verf_flavour(call)     (rpc_opaque_auth_flavour ((&(call)->ru.RM_cmb.cb_verf)))  #define rpc_call_verf_len(call)         (rpc_opaque_auth_len ((&(call)->ru.RM_cmb.cb_verf))) + +#ifdef GF_DARWIN_HOST_OS +#define GF_PRI_RPC_XID          PRIu32 +#define GF_PRI_RPC_VERSION      PRIu32 +#define GF_PRI_RPC_PROG_ID      PRIu32 +#define GF_PRI_RPC_PROG_VERS    PRIu32 +#define GF_PRI_RPC_PROC         PRIu32 +#define GF_PRI_RPC_PROC_VERSION PRIu32 +#else +#define GF_PRI_RPC_XID          PRIu64 +#define GF_PRI_RPC_VERSION      PRIu64 +#define GF_PRI_RPC_PROG_ID      PRIu64 +#define GF_PRI_RPC_PROG_VERS    PRIu64 +#define GF_PRI_RPC_PROC         PRIu64 +#define GF_PRI_RPC_PROC_VERSION PRIu64 +#endif +  #endif diff --git a/rpc/rpc-transport/rdma/src/Makefile.am b/rpc/rpc-transport/rdma/src/Makefile.am index 2bf7cf2386a..e66006e52fe 100644 --- a/rpc/rpc-transport/rdma/src/Makefile.am +++ b/rpc/rpc-transport/rdma/src/Makefile.am @@ -3,7 +3,7 @@  transport_LTLIBRARIES = rdma.la  transportdir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/rpc-transport -rdma_la_LDFLAGS = -module -avoid-version +rdma_la_LDFLAGS = -module -avoid-version -nostartfiles  rdma_la_SOURCES = rdma.c name.c  rdma_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la     \ @@ -11,7 +11,7 @@ rdma_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la     \  noinst_HEADERS = rdma.h name.h  	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \ -	-I$(top_srcdir)/xlators/protocol/lib/src/ -shared -nostartfiles $(GF_CFLAGS) +	-I$(top_srcdir)/xlators/protocol/lib/src/ -shared $(GF_CFLAGS)  AM_CPPFLAGS = $(GF_CPPFLAGS) \  	-I$(top_srcdir)/libglusterfs/src -I$(top_srcdir)/rpc/rpc-lib/src/ \ diff --git a/rpc/rpc-transport/rdma/src/rdma.c b/rpc/rpc-transport/rdma/src/rdma.c index 701abdba771..c7510f6bb53 100644 --- a/rpc/rpc-transport/rdma/src/rdma.c +++ b/rpc/rpc-transport/rdma/src/rdma.c @@ -2027,7 +2027,7 @@ out:  } -inline int32_t +static inline int32_t  __gf_rdma_register_local_mr_for_rdma (gf_rdma_peer_t *peer,                                        struct iovec *vector, int count,                                        gf_rdma_post_context_t *ctx) @@ -3074,7 +3074,7 @@ out:  } -inline int32_t +static inline int32_t  gf_rdma_decode_error_msg (gf_rdma_peer_t *peer, gf_rdma_post_t *post,                            size_t bytes_in_post)  { @@ -3616,7 +3616,7 @@ out:  } -inline int32_t +static inline int32_t  gf_rdma_recv_request (gf_rdma_peer_t *peer, gf_rdma_post_t *post,                        gf_rdma_read_chunk_t *readch)  { diff --git a/rpc/rpc-transport/socket/src/socket.c b/rpc/rpc-transport/socket/src/socket.c index c5e8b889f88..6f566e49345 100644 --- a/rpc/rpc-transport/socket/src/socket.c +++ b/rpc/rpc-transport/socket/src/socket.c @@ -3346,7 +3346,7 @@ reconfigure (rpc_transport_t *this, dict_t *options)          optstr = NULL;          if (dict_get_str (this->options, "tcp-window-size",                            &optstr) == 0) { -                if (gf_string2bytesize (optstr, &windowsize) != 0) { +                if (gf_string2uint64 (optstr, &windowsize) != 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "invalid number format: %s", optstr);                          goto out; @@ -3467,7 +3467,7 @@ socket_init (rpc_transport_t *this)          optstr = NULL;          if (dict_get_str (this->options, "tcp-window-size",                            &optstr) == 0) { -                if (gf_string2bytesize (optstr, &windowsize) != 0) { +                if (gf_string2uint64 (optstr, &windowsize) != 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "invalid number format: %s", optstr);                          return -1; diff --git a/rpc/xdr/src/nlm4-xdr.h b/rpc/xdr/src/nlm4-xdr.h index 4391a479019..8545694a658 100644 --- a/rpc/xdr/src/nlm4-xdr.h +++ b/rpc/xdr/src/nlm4-xdr.h @@ -17,13 +17,7 @@  #define _NLM_H_RPCGEN  #include <rpc/rpc.h> - -#if defined(__NetBSD__) -#define xdr_u_quad_t xdr_u_int64_t -#define xdr_quad_t   xdr_int64_t -#define xdr_uint32_t xdr_u_int32_t -#define xdr_uint64_t xdr_u_int64_t -#endif +#include "xdr-common.h"  #ifdef __cplusplus  extern "C" { @@ -33,6 +27,14 @@ extern "C" {  #define LM_MAXSTRLEN 1024  #define MAXNAMELEN 1025 +#if defined(GF_DARWIN_HOST_OS) +#define xdr_u_quad_t xdr_u_int64_t +#define xdr_quad_t   xdr_int64_t +#define xdr_uint32_t xdr_u_int32_t +#define xdr_uint64_t xdr_u_int64_t +#define uint64_t     u_int64_t +#endif +  #if defined(__NetBSD__)  #define xdr_u_quad_t xdr_u_int64_t  #define xdr_quad_t   xdr_int64_t diff --git a/rpc/xdr/src/xdr-generic.c b/rpc/xdr/src/xdr-generic.c index 58d1ee77ee2..ee29f3dfa4e 100644 --- a/rpc/xdr/src/xdr-generic.c +++ b/rpc/xdr/src/xdr-generic.c @@ -24,7 +24,7 @@ xdr_serialize_generic (struct iovec outmsg, void *res, xdrproc_t proc)          xdrmem_create (&xdr, outmsg.iov_base, (unsigned int)outmsg.iov_len,                         XDR_ENCODE); -        if (!proc (&xdr, res)) { +        if (!proc (&xdr, res, 0)) {                  ret = -1;                  goto ret;          } @@ -48,7 +48,7 @@ xdr_to_generic (struct iovec inmsg, void *args, xdrproc_t proc)          xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,                         XDR_DECODE); -        if (!proc (&xdr, args)) { +        if (!proc (&xdr, args, 0)) {                  ret  = -1;                  goto ret;          } @@ -72,7 +72,7 @@ xdr_to_generic_payload (struct iovec inmsg, void *args, xdrproc_t proc,          xdrmem_create (&xdr, inmsg.iov_base, (unsigned int)inmsg.iov_len,                         XDR_DECODE); -        if (!proc (&xdr, args)) { +        if (!proc (&xdr, args, 0)) {                  ret  = -1;                  goto ret;          } diff --git a/rpc/xdr/src/xdr-nfs3.h b/rpc/xdr/src/xdr-nfs3.h index 6f6b0e1f9b0..3861771e299 100644 --- a/rpc/xdr/src/xdr-nfs3.h +++ b/rpc/xdr/src/xdr-nfs3.h @@ -95,6 +95,7 @@ enum nfsstat3 {  	NFS3ERR_SERVERFAULT = 10006,  	NFS3ERR_BADTYPE = 10007,  	NFS3ERR_JUKEBOX = 10008, +	NFS3ERR_END_OF_LIST = -1,  };  typedef enum nfsstat3 nfsstat3; diff --git a/tests/basic/pgfid-feat.t b/tests/basic/pgfid-feat.t index 8784cc7bf0e..3978f9c97b2 100644 --- a/tests/basic/pgfid-feat.t +++ b/tests/basic/pgfid-feat.t @@ -24,11 +24,10 @@ TEST $CLI volume set $V0 build-pgfid on;  TEST mkdir $M0/a;  TEST touch $M0/a/b; -getfattr -e text -n glusterfs.ancestry.path "$M0/a/b" | grep "^glusterfs.ancestry.path" | cut -d"=" -f2 | tr -d \";  EXPECT "/a/b" get_ancestry_path "/a/b";  TEST $CLI volume set $V0 build-pgfid off; -TEST ! getfattr -e text -n "glusterfs.ancestry.path" $M0/a/b; +EXPECT "" get_ancestry_path "/a/b";  TEST $CLI volume stop $V0;  TEST $CLI volume delete $V0; diff --git a/tests/basic/volume-snapshot.t b/tests/basic/volume-snapshot.t index c826631cad9..e6c47f0d527 100755 --- a/tests/basic/volume-snapshot.t +++ b/tests/basic/volume-snapshot.t @@ -5,6 +5,7 @@  . $(dirname $0)/../cluster.rc  . $(dirname $0)/../snapshot.rc +  V1="patchy2"  function create_volumes() { @@ -48,6 +49,7 @@ function restore_snapshots() {  }  cleanup; +TEST verify_lvm_version;  #Create cluster with 3 nodes  TEST launch_cluster 3;  TEST setup_lvm 3 @@ -92,4 +94,3 @@ TEST ! volume_exists $V0  TEST ! volume_exists $V1  cleanup; - diff --git a/tests/bugs/bug-1045333.t b/tests/bugs/bug-1045333.t index 8f4798ebc23..f5985d29cba 100755 --- a/tests/bugs/bug-1045333.t +++ b/tests/bugs/bug-1045333.t @@ -4,6 +4,7 @@  . $(dirname $0)/../snapshot.rc  cleanup; +TEST verify_lvm_version;  TEST glusterd;  TEST pidof glusterd; diff --git a/tests/bugs/bug-1049834.t b/tests/bugs/bug-1049834.t index c1b126ba1b1..eea3297ed56 100755 --- a/tests/bugs/bug-1049834.t +++ b/tests/bugs/bug-1049834.t @@ -6,7 +6,7 @@  . $(dirname $0)/../snapshot.rc  cleanup; - +TEST verify_lvm_version  TEST launch_cluster 2  TEST setup_lvm 2 diff --git a/tests/snapshot.rc b/tests/snapshot.rc index 440059fc1af..87ea0df9190 100755 --- a/tests/snapshot.rc +++ b/tests/snapshot.rc @@ -46,6 +46,13 @@ function init_lvm() {      return 0  } +function verify_lvm_version() { +    if `/sbin/lvcreate --help | grep -q thin`; then +        return 0; +    fi +    return 1; +} +  function setup_lvm() {      init_lvm $@ || return 1      _setup_lvm @@ -287,4 +294,3 @@ function volume_exists() {                  return 0          fi  } - diff --git a/xlators/cluster/afr/src/afr-inode-write.c b/xlators/cluster/afr/src/afr-inode-write.c index 3013ae7307f..00e0d26768b 100644 --- a/xlators/cluster/afr/src/afr-inode-write.c +++ b/xlators/cluster/afr/src/afr-inode-write.c @@ -37,7 +37,6 @@  #include "afr.h"  #include "afr-transaction.h" -//#include "afr-self-heal-common.h"  static void @@ -1750,5 +1749,3 @@ out:  }  /* }}} */ - - diff --git a/xlators/cluster/afr/src/afr-self-heal-entry.c b/xlators/cluster/afr/src/afr-self-heal-entry.c index 9605d69f417..9e714b0263c 100644 --- a/xlators/cluster/afr/src/afr-self-heal-entry.c +++ b/xlators/cluster/afr/src/afr-self-heal-entry.c @@ -585,12 +585,10 @@ afr_selfheal_data_opendir (xlator_t *this, inode_t *inode)  	}  	loc_wipe (&loc); - -	return fd; +        return fd;  } -  int  afr_selfheal_entry (call_frame_t *frame, xlator_t *this, inode_t *inode)  { diff --git a/xlators/cluster/afr/src/afr-self-heal-metadata.c b/xlators/cluster/afr/src/afr-self-heal-metadata.c index b31a33237f5..83628297fd1 100644 --- a/xlators/cluster/afr/src/afr-self-heal-metadata.c +++ b/xlators/cluster/afr/src/afr-self-heal-metadata.c @@ -18,7 +18,6 @@  #include "afr-self-heal.h"  #include "byte-order.h" -  #define AFR_HEAL_ATTR (GF_SET_ATTR_UID|GF_SET_ATTR_GID|GF_SET_ATTR_MODE)  int diff --git a/xlators/cluster/afr/src/afr.c b/xlators/cluster/afr/src/afr.c index 5e12910b7c6..ead08425f2c 100644 --- a/xlators/cluster/afr/src/afr.c +++ b/xlators/cluster/afr/src/afr.c @@ -185,7 +185,7 @@ reconfigure (xlator_t *this, dict_t *options)  			  uint32, out);          GF_OPTION_RECONF (AFR_SH_READDIR_SIZE_KEY, priv->sh_readdir_size, -                          options, size, out); +                          options, size_uint64, out);          /* Reset this so we re-discover in case the topology changed.  */          GF_OPTION_RECONF ("ensure-durability", priv->ensure_durability, options,                            bool, out); @@ -331,7 +331,7 @@ init (xlator_t *this)          GF_OPTION_INIT ("eager-lock", priv->eager_lock, bool, out);          GF_OPTION_INIT ("quorum-type", qtype, str, out);          GF_OPTION_INIT ("quorum-count", priv->quorum_count, uint32, out); -        GF_OPTION_INIT (AFR_SH_READDIR_SIZE_KEY, priv->sh_readdir_size, size, +        GF_OPTION_INIT (AFR_SH_READDIR_SIZE_KEY, priv->sh_readdir_size, size_uint64,                          out);          fix_quorum_options(this,priv,qtype); @@ -436,7 +436,7 @@ fini (xlator_t *this)          priv = this->private;          this->private = NULL;          afr_priv_destroy (priv); -        if (this->itable);//I dont see any destroy func +        //if (this->itable);//I dont see any destroy func          return 0;  } diff --git a/xlators/cluster/dht/src/Makefile.am b/xlators/cluster/dht/src/Makefile.am index 174bea84110..3fc29bf8154 100644 --- a/xlators/cluster/dht/src/Makefile.am +++ b/xlators/cluster/dht/src/Makefile.am @@ -1,4 +1,3 @@ -  xlator_LTLIBRARIES = dht.la nufa.la switch.la  xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster diff --git a/xlators/cluster/dht/src/dht-common.h b/xlators/cluster/dht/src/dht-common.h index d74d0dfd4ec..2ece28a616b 100644 --- a/xlators/cluster/dht/src/dht-common.h +++ b/xlators/cluster/dht/src/dht-common.h @@ -47,7 +47,7 @@ struct dht_layout {          int                gen;          int                type;          int                ref; /* use with dht_conf_t->layout_lock */ -        int                search_unhashed; +        gf_boolean_t       search_unhashed;          struct {                  int        err;   /* 0 = normal                                       -1 = dir exists and no xattr @@ -263,7 +263,7 @@ struct dht_conf {          int            gen;          dht_du_t      *du_stats;          double         min_free_disk; -	double         min_free_inodes; +        double         min_free_inodes;          char           disk_unit;          int32_t        refresh_interval;          gf_boolean_t   unhashed_sticky_bit; diff --git a/xlators/cluster/dht/src/dht-shared.c b/xlators/cluster/dht/src/dht-shared.c index 36c07397378..f2e7467abe7 100644 --- a/xlators/cluster/dht/src/dht-shared.c +++ b/xlators/cluster/dht/src/dht-shared.c @@ -366,7 +366,6 @@ dht_reconfigure (xlator_t *this, dict_t *options)                                         " lookup-unhashed should be boolean,"                                         " not (%s), defaulting to (%d)",                                         temp_str, conf->search_unhashed); -                                //return -1;                                  ret = -1;                                  goto out;                          } @@ -449,11 +448,11 @@ gf_defrag_pattern_list_fill (xlator_t *this, gf_defrag_info_t *defrag, char *dat                  if (!pattern)                          goto out;                  if (!num) { -                        if (gf_string2bytesize(pattern, &pattern_list->size) +                        if (gf_string2bytesize_uint64(pattern, &pattern_list->size)                               == 0) {                                  pattern = "*";                          } -                } else if (gf_string2bytesize (num, &pattern_list->size) != 0) { +                } else if (gf_string2bytesize_uint64 (num, &pattern_list->size) != 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "invalid number format \"%s\"", num);                          goto out; diff --git a/xlators/cluster/stripe/src/Makefile.am b/xlators/cluster/stripe/src/Makefile.am index 2d151422ab6..4268d6f0382 100644 --- a/xlators/cluster/stripe/src/Makefile.am +++ b/xlators/cluster/stripe/src/Makefile.am @@ -1,4 +1,3 @@ -  xlator_LTLIBRARIES = stripe.la  xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/cluster diff --git a/xlators/cluster/stripe/src/stripe-helpers.c b/xlators/cluster/stripe/src/stripe-helpers.c index a047d4a2e97..3c12809d625 100644 --- a/xlators/cluster/stripe/src/stripe-helpers.c +++ b/xlators/cluster/stripe/src/stripe-helpers.c @@ -13,6 +13,7 @@  #include "stripe.h"  #include "byte-order.h"  #include "mem-types.h" +#include "logging.h"  void  stripe_local_wipe (stripe_local_t *local) @@ -260,8 +261,8 @@ stripe_fill_pathinfo_xattr (xlator_t *this, stripe_local_t *local,                  goto out;          } -        (void) snprintf (stripe_size_str, 20, "%ld", -                         (local->fctx) ? local->fctx->stripe_size : 0); +        (void) snprintf (stripe_size_str, 20, "%"PRId64, +                         (long long) (local->fctx) ? local->fctx->stripe_size : 0);          /* extra bytes for decorations (brackets and <>'s) */          padding = strlen (this->name) + strlen (STRIPE_PATHINFO_HEADER) @@ -504,7 +505,7 @@ set_default_block_size (stripe_private_t *priv, char *num)          GF_VALIDATE_OR_GOTO (THIS->name, num, out); -        if (gf_string2bytesize (num, &priv->block_size) != 0) { +        if (gf_string2bytesize_uint64 (num, &priv->block_size) != 0) {                  gf_log (THIS->name, GF_LOG_ERROR,                          "invalid number format \"%s\"", num);                  goto out; @@ -554,7 +555,7 @@ set_stripe_block_size (xlator_t *this, stripe_private_t *priv, char *data)                          if (ret)                                  goto out;                  } -                if (gf_string2bytesize (num, &stripe_opt->block_size) != 0) { +                if (gf_string2bytesize_uint64 (num, &stripe_opt->block_size) != 0) {                          gf_log (this->name, GF_LOG_ERROR,                                  "invalid number format \"%s\"", num);                          goto out; @@ -674,4 +675,3 @@ uncoalesced_size(off_t size, uint64_t stripe_size, int stripe_count,          return size;  } - diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index 79e80b51381..0ebea81684f 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -4459,7 +4459,7 @@ stripe_is_bd (dict_t *this, char *key, data_t *value, void *data)          return 0;  } -inline gf_boolean_t +static inline gf_boolean_t  stripe_setxattr_is_bd (dict_t *dict)  {          gf_boolean_t is_bd = _gf_false; @@ -4628,7 +4628,7 @@ out:          return ret;  } -inline gf_boolean_t +static inline gf_boolean_t  stripe_fsetxattr_is_special (dict_t *dict)  {          gf_boolean_t is_spl = _gf_false; @@ -5080,7 +5080,7 @@ reconfigure (xlator_t *this, dict_t *options)                                  goto unlock;                          } -                        if (gf_string2bytesize (opt->default_value, &priv->block_size)){ +                        if (gf_string2bytesize_uint64 (opt->default_value, &priv->block_size)){                                  gf_log (this->name, GF_LOG_ERROR,                                          "Unable to set default block-size ");                                  ret = -1; @@ -5187,7 +5187,7 @@ init (xlator_t *this)                          ret = -1;                          goto unlock;                  } -                if (gf_string2bytesize (opt->default_value, &priv->block_size)){ +                if (gf_string2bytesize_uint64 (opt->default_value, &priv->block_size)){                          gf_log (this->name, GF_LOG_ERROR,                                  "Unable to set default block-size ");                          ret = -1; @@ -5601,7 +5601,7 @@ err:          return 0;  } -inline gf_boolean_t +static inline gf_boolean_t  stripe_is_special_xattr (const char *name)  {          gf_boolean_t    is_spl = _gf_false; diff --git a/xlators/debug/io-stats/src/io-stats.c b/xlators/debug/io-stats/src/io-stats.c index d63fbb26c4f..5b4c833fbc0 100644 --- a/xlators/debug/io-stats/src/io-stats.c +++ b/xlators/debug/io-stats/src/io-stats.c @@ -509,7 +509,7 @@ out:          return 0;  } -inline int +static inline int  ios_stats_cleanup (xlator_t *this, inode_t *inode)  { diff --git a/xlators/debug/trace/src/trace.c b/xlators/debug/trace/src/trace.c index c9d83935647..1efd50e656b 100644 --- a/xlators/debug/trace/src/trace.c +++ b/xlators/debug/trace/src/trace.c @@ -18,6 +18,44 @@   *    Very helpful translator for debugging.   */ +static inline void +trace_stat_to_str(struct iatt *buf, char *str) +{ +        char     atime_buf[256]    = {0,}; +        char     mtime_buf[256]    = {0,}; +        char     ctime_buf[256]    = {0,}; +        uint64_t ia_time           = 0; + +        if (!buf) +                return; + +        ia_time = buf->ia_atime; +        strftime (atime_buf, 256, "[%b %d %H:%M:%S]", +                  localtime ((time_t *)&ia_time)); +        ia_time = buf->ia_mtime; +        strftime (mtime_buf, 256, "[%b %d %H:%M:%S]", +                  localtime ((time_t *)&ia_time)); + +        ia_time = buf->ia_ctime; +        strftime (ctime_buf, 256, "[%b %d %H:%M:%S]", +                  localtime ((time_t *)&ia_time)); + +        snprintf (str, sizeof (str), +                  "gfid=%s ino=%"PRIu64", mode=%o, " +                  "nlink=%"GF_PRI_NLINK", uid=%u, " +                  "gid=%u, size=%"PRIu64", " +                  "blocks=%"PRIu64", atime=%s, " +                  "mtime=%s, ctime=%s", +                  uuid_utoa (buf->ia_gfid), +                  buf->ia_ino, +                  st_mode_from_ia (buf->ia_prot, buf->ia_type), +                  buf->ia_nlink, buf->ia_uid, +                  buf->ia_gid, buf->ia_size, +                  buf->ia_blocks, atime_buf, +                  mtime_buf, ctime_buf); +} + +  int  dump_history_trace (circular_buffer_t *cb, void *data)  { diff --git a/xlators/debug/trace/src/trace.h b/xlators/debug/trace/src/trace.h index 045eefb3682..62d1bc9c921 100644 --- a/xlators/debug/trace/src/trace.h +++ b/xlators/debug/trace/src/trace.h @@ -59,40 +59,3 @@ typedef struct {                                          "%s", _string);                 \                  }                                                       \          } while (0); - -#define trace_stat_to_str(buf, statstr)                                 \ -        do {                                                            \ -                char     atime_buf[256]    = {0,};                      \ -                char     mtime_buf[256]    = {0,};                      \ -                char     ctime_buf[256]    = {0,};                      \ -                uint64_t ia_time           = 0;                         \ -                                                                        \ -                if (!buf)                                               \ -                        break;                                          \ -                                                                        \ -                ia_time = buf->ia_atime;                                \ -                strftime (atime_buf, 256, "[%b %d %H:%M:%S]",           \ -                          localtime ((time_t *)&ia_time));              \ -                                                                        \ -                ia_time = buf->ia_mtime;                                \ -                strftime (mtime_buf, 256, "[%b %d %H:%M:%S]",           \ -                          localtime ((time_t *)&ia_time));              \ -                                                                        \ -                ia_time = buf->ia_ctime;                                \ -                strftime (ctime_buf, 256, "[%b %d %H:%M:%S]",           \ -                          localtime ((time_t *)&ia_time));              \ -                                                                        \ -                snprintf (statstr, sizeof (statstr),                    \ -                          "gfid=%s ino=%"PRIu64", mode=%o, "            \ -                          "nlink=%"GF_PRI_NLINK", uid=%u, "             \ -                          "gid=%u, size=%"PRIu64", "                    \ -                          "blocks=%"PRIu64", atime=%s, "                \ -                          "mtime=%s, ctime=%s",                         \ -                          uuid_utoa (buf->ia_gfid), buf->ia_ino,        \ -                          st_mode_from_ia (buf->ia_prot,                \ -                                           buf->ia_type),               \ -                          buf->ia_nlink, buf->ia_uid,                   \ -                          buf->ia_gid, buf->ia_size,                    \ -                          buf->ia_blocks, atime_buf,                    \ -                          mtime_buf, ctime_buf);                        \ -        } while (0); diff --git a/xlators/encryption/crypt/src/crypt.c b/xlators/encryption/crypt/src/crypt.c index 1abdad31d99..13b1bd96248 100644 --- a/xlators/encryption/crypt/src/crypt.c +++ b/xlators/encryption/crypt/src/crypt.c @@ -4169,9 +4169,9 @@ int32_t master_set_block_size (xlator_t *this, crypt_private_t *priv,  	if (options != NULL)  		GF_OPTION_RECONF("block-size", block_size, options, -				 size, error); +				 size_uint64, error);  	else -		GF_OPTION_INIT("block-size", block_size, size, error); +		GF_OPTION_INIT("block-size", block_size, size_uint64, error);  	switch (block_size) {  	case 512: @@ -4224,9 +4224,9 @@ static int master_set_data_key_size (xlator_t *this, crypt_private_t *priv,  	if (options != NULL)  		GF_OPTION_RECONF("data-key-size", key_size, options, -				 size, error); +				 uint64, error);  	else -		GF_OPTION_INIT("data-key-size", key_size, size, error); +		GF_OPTION_INIT("data-key-size", key_size, uint64, error);  	ret = data_cipher_algs[master->m_alg][master->m_mode].check_key(key_size);  	if (ret) { diff --git a/xlators/encryption/crypt/src/crypt.h b/xlators/encryption/crypt/src/crypt.h index ff8eb571b40..eb7291f13c5 100644 --- a/xlators/encryption/crypt/src/crypt.h +++ b/xlators/encryption/crypt/src/crypt.h @@ -22,6 +22,7 @@  #include <openssl/cmac.h>  #include <openssl/modes.h>  #include "crypt-mem-types.h" +#include "compat.h"  #define CRYPT_XLATOR_ID  (0) @@ -38,13 +39,17 @@  #define MASTER_VOL_KEY_SIZE (32)  #define NMTD_VOL_KEY_SIZE (16) -#ifdef __NetBSD__ +#if defined(__NetBSD__)  typedef off_t loff_t;  #endif +#if defined(GF_DARWIN_HOST_OS) +typedef uint64_t loff_t; +#endif +  struct crypt_key {  	uint32_t len; -	const char *label;	 +	const char *label;  };  /* @@ -124,7 +129,7 @@ struct master_cipher_info {  	 * master key  	 */  	unsigned char m_key[MASTER_VOL_KEY_SIZE]; -	/*  +	/*  	 * volume key for oid authentication  	 */  	unsigned char m_nmtd_key[NMTD_VOL_KEY_SIZE]; @@ -870,8 +875,8 @@ static inline linkop_unwind_handler_t linkop_unwind_dispatch(glusterfs_fop_t fop  		return rename_unwind;  	default:  		gf_log("crypt", GF_LOG_ERROR, "Bad link operation %d", fop); -		return NULL;		 -	}	 +		return NULL; +	}  }  static inline mtd_op_t linkop_mtdop_dispatch(glusterfs_fop_t fop) diff --git a/xlators/features/changelog/src/Makefile.am b/xlators/features/changelog/src/Makefile.am index 54c21ac213c..c5d5e100e41 100644 --- a/xlators/features/changelog/src/Makefile.am +++ b/xlators/features/changelog/src/Makefile.am @@ -12,7 +12,7 @@ changelog_la_SOURCES = changelog.c changelog-rt.c changelog-helpers.c \  changelog_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la  AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src -fPIC -D_FILE_OFFSET_BITS=64 \ -	-D_GNU_SOURCE -D$(GF_HOST_OS) -shared -nostartfiles -DDATADIR=\"$(localstatedir)\" +	-D_GNU_SOURCE -D$(GF_HOST_OS) -shared -DDATADIR=\"$(localstatedir)\"  AM_CFLAGS = -Wall $(GF_CFLAGS) diff --git a/xlators/features/changelog/src/changelog-helpers.h b/xlators/features/changelog/src/changelog-helpers.h index b441f706869..53588f55efa 100644 --- a/xlators/features/changelog/src/changelog-helpers.h +++ b/xlators/features/changelog/src/changelog-helpers.h @@ -268,9 +268,11 @@ typedef struct {  void  changelog_thread_cleanup (xlator_t *this, pthread_t thr_id); -inline void * + +void *  changelog_get_usable_buffer (changelog_local_t *local); -inline void + +void  changelog_set_usable_record_and_length (changelog_local_t *local,                                          size_t len, int xr);  void @@ -290,16 +292,16 @@ int  changelog_inject_single_event (xlator_t *this,                                 changelog_priv_t *priv,                                 changelog_log_data_t *cld); -inline size_t +size_t  changelog_entry_length (); -inline int +int  changelog_write (int fd, char *buffer, size_t len);  int  changelog_write_change (changelog_priv_t *priv, char *buffer, size_t len); -inline int +int  changelog_handle_change (xlator_t *this,                           changelog_priv_t *priv, changelog_log_data_t *cld); -inline void +void  changelog_update (xlator_t *this, changelog_priv_t *priv,                    changelog_local_t *local, changelog_log_type type);  void * diff --git a/xlators/features/compress/src/Makefile.am b/xlators/features/compress/src/Makefile.am index 0bf757c063e..263b21b783b 100644 --- a/xlators/features/compress/src/Makefile.am +++ b/xlators/features/compress/src/Makefile.am @@ -10,7 +10,7 @@ cdc_la_SOURCES = cdc.c cdc-helper.c  cdc_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la  AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src -fPIC -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D$(GF_HOST_OS) \ --shared -nostartfiles  $(LIBZ_CFLAGS) +-shared $(LIBZ_CFLAGS)  AM_CFLAGS = -Wall $(GF_CFLAGS) diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index 5c1c65fbd21..4b2eb2e29ba 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -497,13 +497,13 @@ fop_fxattrop_index_action (xlator_t *this, inode_t *inode, dict_t *xattr)          _xattrop_index_action (this, inode, xattr);  } -inline gf_boolean_t +static inline gf_boolean_t  index_xattrop_track (loc_t *loc, gf_xattrop_flags_t flags, dict_t *dict)  {          return (flags == GF_XATTROP_ADD_ARRAY);  } -inline gf_boolean_t +static inline gf_boolean_t  index_fxattrop_track (fd_t *fd, gf_xattrop_flags_t flags, dict_t *dict)  {          return (flags == GF_XATTROP_ADD_ARRAY); diff --git a/xlators/features/locks/src/inodelk.c b/xlators/features/locks/src/inodelk.c index e7093e60ed5..2d9aa83eca4 100644 --- a/xlators/features/locks/src/inodelk.c +++ b/xlators/features/locks/src/inodelk.c @@ -35,7 +35,7 @@ __pl_inodelk_ref (pl_inode_lock_t *lock)          lock->ref++;  } -void +inline void  __pl_inodelk_unref (pl_inode_lock_t *lock)  {          lock->ref--; diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c index 2db327687f3..337623d6577 100644 --- a/xlators/features/locks/src/posix.c +++ b/xlators/features/locks/src/posix.c @@ -294,7 +294,7 @@ pl_locks_by_fd (pl_inode_t *pl_inode, fd_t *fd)         {                 list_for_each_entry (l, &pl_inode->ext_list, list) { -                       if ((l->fd_num == fd_to_fdnum(fd))) { +                       if (l->fd_num == fd_to_fdnum(fd)) {                                 found = 1;                                 break;                         } @@ -319,7 +319,7 @@ delete_locks_of_fd (xlator_t *this, pl_inode_t *pl_inode, fd_t *fd)         {                 list_for_each_entry_safe (l, tmp, &pl_inode->ext_list, list) { -                       if ((l->fd_num == fd_to_fdnum(fd))) { +                       if (l->fd_num == fd_to_fdnum(fd)) {                                 if (l->blocked) {                                         list_move_tail (&l->list, &blocked_list);                                         continue; @@ -644,7 +644,8 @@ pl_fgetxattr_handle_lockinfo (xlator_t *this, fd_t *fd,          pl_inode_t    *pl_inode = NULL;          char          *key      = NULL, *buf = NULL;          int32_t        op_ret   = 0; -        unsigned long  fdnum    = 0, len = 0; +        unsigned long  fdnum    = 0; +	int32_t        len      = 0;          dict_t        *tmp      = NULL;          pl_inode = pl_inode_get (this, fd->inode); @@ -1340,7 +1341,7 @@ __fd_has_locks (pl_inode_t *pl_inode, fd_t *fd)          posix_lock_t *l     = NULL;          list_for_each_entry (l, &pl_inode->ext_list, list) { -                if ((l->fd_num == fd_to_fdnum(fd))) { +                if (l->fd_num == fd_to_fdnum(fd)) {                          found = 1;                          break;                  } @@ -1369,7 +1370,7 @@ __dup_locks_to_fdctx (pl_inode_t *pl_inode, fd_t *fd,          int ret = 0;          list_for_each_entry (l, &pl_inode->ext_list, list) { -                if ((l->fd_num == fd_to_fdnum(fd))) { +                if (l->fd_num == fd_to_fdnum(fd)) {                          duplock = lock_dup (l);                          if (!duplock) {                                  ret = -1; diff --git a/xlators/features/mac-compat/src/Makefile.am b/xlators/features/mac-compat/src/Makefile.am index f8567edce71..42ed350e93e 100644 --- a/xlators/features/mac-compat/src/Makefile.am +++ b/xlators/features/mac-compat/src/Makefile.am @@ -6,9 +6,10 @@ mac_compat_la_LDFLAGS = -module -avoid-version  mac_compat_la_SOURCES = mac-compat.c  mac_compat_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la +noinst_HEADERS = mac-compat.h +  AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src  AM_CFLAGS = -Wall $(GF_CFLAGS) -CLEANFILES =  - +CLEANFILES = diff --git a/xlators/features/mac-compat/src/mac-compat.c b/xlators/features/mac-compat/src/mac-compat.c index 7cb550ad581..0eaf563e889 100644 --- a/xlators/features/mac-compat/src/mac-compat.c +++ b/xlators/features/mac-compat/src/mac-compat.c @@ -15,35 +15,28 @@  #include "xlator.h"  #include "defaults.h"  #include "compat-errno.h" +#include "syscall.h" +#include "mem-pool.h" +#include "mac-compat.h" - -enum apple_xattr { -        GF_FINDER_INFO_XATTR, -        GF_RESOURCE_FORK_XATTR, -        GF_XATTR_ALL, -        GF_XATTR_NONE -}; - -static char *apple_xattr_name[] = { -        [GF_FINDER_INFO_XATTR]   = "com.apple.FinderInfo", -        [GF_RESOURCE_FORK_XATTR] = "com.apple.ResourceFork" -}; - -static const char *apple_xattr_value[] = { -        [GF_FINDER_INFO_XATTR]   = -        /* 1 2 3 4 5 6 7 8 */ -         "\0\0\0\0\0\0\0\0" -         "\0\0\0\0\0\0\0\0" -         "\0\0\0\0\0\0\0\0" -         "\0\0\0\0\0\0\0\0", -        [GF_RESOURCE_FORK_XATTR] = "" -}; - -static int32_t apple_xattr_len[] = { -        [GF_FINDER_INFO_XATTR]   = 32, -        [GF_RESOURCE_FORK_XATTR] = 1 -}; - +static int +dict_key_remove_namespace(dict_t *dict, char *key, data_t *value, void *data) +{ +  /* +    char buffer[3*value->len+1]; +    int index = 0; +    for (index = 0; index < value->len; index++) +    sprintf(buffer+3*index, " %02x", value->data[index]); +  */ +        xlator_t *this = (xlator_t *) data; +        if (strncmp(key, "user.", 5) == 0) { +                dict_set (dict, key + 5, value); +                gf_log (this->name, GF_LOG_DEBUG, +                        "remove_namespace_dict: %s -> %s ", key, key + 5); +                dict_del (dict, key); +        } +        return 0; +}  int32_t  maccomp_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, @@ -53,54 +46,91 @@ maccomp_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          intptr_t ax = (intptr_t)this->private;          int i = 0; +        gf_log (this->name, GF_LOG_DEBUG, +                "getxattr_cbk: dict %p private: %p xdata %p ", dict, +                this->private, xdata); + +        if (dict) { +                dict_foreach(dict, dict_key_remove_namespace, this); +        } +        else { +                // TODO: we expect dict to exist here, don't know why this +                // this is needed +                dict = dict_new(); +        } +        gf_log (this->name, GF_LOG_DEBUG, +                "getxattr_cbk: dict %p ax: %ld op_ret %d op_err %d  ", dict, ax, +                op_ret, op_errno);          if ((ax == GF_XATTR_ALL && op_ret >= 0) || ax != GF_XATTR_NONE) {                  op_ret = op_errno = 0; -                  for (i = 0; i < GF_XATTR_ALL; i++) {                          if (dict_get (dict, apple_xattr_name[i]))                                  continue; - +                        /* set dummy data */ +                        gf_log (this->name, GF_LOG_DEBUG, +                                "getxattr_cbk: setting dummy data %p, %s", dict, +                                apple_xattr_name[i]);                          if (dict_set (dict, apple_xattr_name[i],                                        bin_to_data ((void *)apple_xattr_value[i],                                                     apple_xattr_len[i])) == -1) {                                  op_ret = -1; -                                op_errno = ENOMEM; +                                op_errno = ENOATTR;                                  break;                          }                  }           } -          STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict, xdata); -          return 0;  } -int32_t -maccomp_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, -                  const char *name, dict_t *xdata) +static +int prepend_xattr_user_namespace(dict_t *dict, char *key, data_t *value, void *obj)  { -        intptr_t ax = GF_XATTR_NONE; -        int i = 0; +        xlator_t *this = (xlator_t *) obj; +        dict_t *newdict = (dict_t *) this->private; +        char *newkey = NULL; +        gf_add_prefix(XATTR_USER_PREFIX, key, &newkey); +        key = newkey; +        dict_set(newdict, (char *)key, value); +        if (newkey) +                GF_FREE(newkey); +        return 0; +} +intptr_t +check_name(const char *name, char **newkey) +{ +        intptr_t ax = GF_XATTR_NONE;          if (name) { +                int i = 0;                  for (i = 0; i < GF_XATTR_ALL; i++) {                          if (strcmp (apple_xattr_name[i], name) == 0) {                                  ax = i; -                                  break;                          }                  } +                gf_add_prefix("user.", name, newkey);          } else                  ax = GF_XATTR_ALL; +        return ax; +} -        this->private = (void *)ax; +int32_t +maccomp_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, +                  const char *name, dict_t *xdata) +{ +        char *newkey = NULL; +        this->private = (void *) check_name(name, &newkey); +        gf_log (this->name, GF_LOG_DEBUG, +                "getxattr: name %s private: %p xdata %p ", name, +                this->private, xdata);          STACK_WIND (frame, maccomp_getxattr_cbk,                      FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->getxattr, -                    loc, name, xdata); +                    loc, newkey, xdata);          return 0;  } @@ -109,30 +139,17 @@ int32_t  maccomp_fgetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd,                     const char *name, dict_t *xdata)  { -        intptr_t ax = GF_XATTR_NONE; -        int i = 0; - -        if (name) { -                for (i = 0; i < GF_XATTR_ALL; i++) { -                        if (strcmp (apple_xattr_name[i], name) == 0) { -                                ax = i; - -                                break; -                        } -                } -        } else -                ax = GF_XATTR_ALL; - -        this->private = (void *)ax; +        char *newkey = NULL; +        this->private = (void *) check_name(name, &newkey);          STACK_WIND (frame, maccomp_getxattr_cbk,                      FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->fgetxattr, -                    fd, name, xdata); +                    fd, newkey, xdata); +        GF_FREE(newkey);          return 0;  } -  int32_t  maccomp_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,                        int32_t op_ret, int32_t op_errno, dict_t *xdata) @@ -141,12 +158,56 @@ maccomp_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          if (op_ret == -1 && ax != GF_XATTR_NONE)                  op_ret = op_errno = 0; - +        gf_log (this->name, GF_LOG_DEBUG, +                "setxattr_cbk op_ret %d op_errno %d private: %p xdata %p ", +                op_ret, op_errno, this->private, xdata);          STACK_UNWIND_STRICT (setxattr, frame, op_ret, op_errno, xdata); +        return 0; +} +int32_t +maccomp_setattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, +                     int32_t op_ret, int32_t op_errno, struct iatt *iatt1, +                     struct iatt *iattr2, dict_t *xdata) +{ +        gf_log (this->name, GF_LOG_DEBUG, +                "setattr_cbk op_ret %d op_errno %d private: %p xdata %p ", +                op_ret, op_errno, this->private, xdata); +        STACK_UNWIND_STRICT (setattr, frame, op_ret, op_errno, +                             iatt1, iattr2, xdata);          return 0;  } +int map_flags(int flags) +{ +        /* DARWIN has different defines on XATTR_ flags. +           There do not seem to be a POSIX standard +           Parse any other flags over. +           NOFOLLOW is always true on Linux and Darwin +        */ +        int linux_flags = flags & ~(GF_XATTR_CREATE | GF_XATTR_REPLACE | XATTR_REPLACE); +        if (XATTR_CREATE & flags) +                linux_flags |= GF_XATTR_CREATE; +        if (XATTR_REPLACE & flags) +                linux_flags |= GF_XATTR_REPLACE; +        return linux_flags; +} + +int32_t +maccomp_fremovexattr (call_frame_t *frame, xlator_t *this, fd_t *fd, +                   const char *name, dict_t *xdata) +{ +        char *newkey = NULL; + +        this->private = (void *) check_name(name, &newkey); + +        STACK_WIND (frame, default_fremovexattr_cbk, +                    FIRST_CHILD(this), +                    FIRST_CHILD(this)->fops->fremovexattr, +                    fd, newkey, xdata); +        GF_FREE(newkey); +        return 0; +}  int32_t  maccomp_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict, @@ -162,16 +223,56 @@ maccomp_setxattr (call_frame_t *frame, xlator_t *this, loc_t *loc, dict_t *dict,                          break;                  }          } +        dict_t *newdict = dict_new(); +        this->private = (void *) newdict; +        dict_foreach(dict, prepend_xattr_user_namespace, this);          this->private = (void *)ax; - +        int linux_flags = map_flags(flags); +        gf_log (this->name, GF_LOG_DEBUG, +                "setxattr flags: %d -> %d dict %p private: %p xdata %p ", +                flags, linux_flags, dict, this->private, xdata);          STACK_WIND (frame, maccomp_setxattr_cbk,                      FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->setxattr, -                    loc, dict, flags, xdata); +                    loc, newdict, linux_flags, xdata); +        dict_unref(newdict);          return 0;  } +int32_t +maccomp_setattr (call_frame_t *frame, xlator_t *this, loc_t *loc, struct iatt *iattr, +                  int32_t flags, dict_t *xdata) +{ +        gf_log (this->name, GF_LOG_DEBUG, +                "setattr iattr %p private: %p xdata %p ", +                iattr, this->private, xdata); +        STACK_WIND (frame, maccomp_setattr_cbk, +                    FIRST_CHILD(this), +                    FIRST_CHILD(this)->fops->setattr, +                    loc, iattr, flags, xdata); +        return 0; +} + +int32_t +maccomp_removexattr (call_frame_t *frame, xlator_t *this, loc_t *loc, +                     const char *name, dict_t *xdata) +{ +        char *newkey = NULL; +        this->private = (void *) check_name(name, &newkey); + +        STACK_WIND (frame, default_removexattr_cbk, +                    FIRST_CHILD(this), +                    FIRST_CHILD(this)->fops->removexattr, +                    loc, newkey, xdata); + +        gf_log (this->name, GF_LOG_TRACE, +                "removeattr name %p private: %p xdata %p ", +                name, this->private, xdata); +        GF_FREE(newkey); +        return 0; + +}  int32_t  maccomp_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict, @@ -188,12 +289,20 @@ maccomp_fsetxattr (call_frame_t *frame, xlator_t *this, fd_t *fd, dict_t *dict,                  }          } -        this->private = (void *)ax; +        dict_t *newdict = dict_new(); +        this->private = (void *) newdict; +        dict_foreach(dict, prepend_xattr_user_namespace, this); +        this->private = (void *)ax; +        int linux_flags = map_flags(flags); +        gf_log (this->name, GF_LOG_DEBUG, +                "fsetxattr flags: %d -> %d dict %p private: %p xdata %p ", +                flags, linux_flags, dict, this->private, xdata);          STACK_WIND (frame, maccomp_setxattr_cbk,                      FIRST_CHILD(this),                      FIRST_CHILD(this)->fops->fsetxattr, -                    fd, dict, flags, xdata); +                    fd, newdict, linux_flags, xdata); +        dict_unref(newdict);          return 0;  } @@ -224,10 +333,13 @@ fini (xlator_t *this)  struct xlator_fops fops = { -        .getxattr    = maccomp_getxattr, -        .fgetxattr   = maccomp_fgetxattr, -        .setxattr    = maccomp_setxattr, -        .fsetxattr   = maccomp_fsetxattr, +        .getxattr       = maccomp_getxattr, +        .fgetxattr      = maccomp_fgetxattr, +        .setxattr       = maccomp_setxattr, +        .setattr        = maccomp_setattr, +        .fsetxattr      = maccomp_fsetxattr, +        .removexattr    = maccomp_removexattr, +        .fremovexattr   = maccomp_fremovexattr,  };  struct xlator_cbks cbks; diff --git a/xlators/features/mac-compat/src/mac-compat.h b/xlators/features/mac-compat/src/mac-compat.h new file mode 100644 index 00000000000..b033ca0e4d8 --- /dev/null +++ b/xlators/features/mac-compat/src/mac-compat.h @@ -0,0 +1,41 @@ +/* +   Copyright (c) 2014 Red Hat, Inc. <http://www.redhat.com> +   This file is part of GlusterFS. + +   This file is licensed to you under your choice of the GNU Lesser +   General Public License, version 3 or any later version (LGPLv3 or +   later), or the GNU General Public License, version 2 (GPLv2), in all +   cases as published by the Free Software Foundation. +*/ + +#ifndef __MAC_COMPAT_H__ +#define __MAC_COMPAT_H__ + +enum apple_xattr { +        GF_FINDER_INFO_XATTR, +        GF_RESOURCE_FORK_XATTR, +        GF_XATTR_ALL, +        GF_XATTR_NONE +}; + +static char *apple_xattr_name[] = { +        [GF_FINDER_INFO_XATTR]   = "com.apple.FinderInfo", +        [GF_RESOURCE_FORK_XATTR] = "com.apple.ResourceFork" +}; + +static const char *apple_xattr_value[] = { +        [GF_FINDER_INFO_XATTR]   = +        /* 1 2 3 4 5 6 7 8 */ +         "\0\0\0\0\0\0\0\0" +         "\0\0\0\0\0\0\0\0" +         "\0\0\0\0\0\0\0\0" +         "\0\0\0\0\0\0\0\0", +        [GF_RESOURCE_FORK_XATTR] = "" +}; + +static int32_t apple_xattr_len[] = { +        [GF_FINDER_INFO_XATTR]   = 32, +        [GF_RESOURCE_FORK_XATTR] = 1 +}; + +#endif /* __MAC_COMPAT_H__ */ diff --git a/xlators/features/marker/src/marker-quota-helper.h b/xlators/features/marker/src/marker-quota-helper.h index 6cdd148810b..b200413b0ad 100644 --- a/xlators/features/marker/src/marker-quota-helper.h +++ b/xlators/features/marker/src/marker-quota-helper.h @@ -9,7 +9,7 @@  */  #ifndef _MARKER_QUOTA_HELPER_H -#define _MARKER_QUOTA_HELPER +#define _MARKER_QUOTA_HELPER_H  #ifndef _CONFIG_H  #define _CONFIG_H diff --git a/xlators/features/marker/src/marker-quota.c b/xlators/features/marker/src/marker-quota.c index a758e938f69..1903fdc4052 100644 --- a/xlators/features/marker/src/marker-quota.c +++ b/xlators/features/marker/src/marker-quota.c @@ -365,7 +365,10 @@ mq_update_size_xattr (call_frame_t *frame, void *cookie, xlator_t *this,                  local->loc.path, ntoh64 (*delta));          new_dict = dict_new (); -        if (!new_dict); +        if (!new_dict) { +		errno = ENOMEM; +		goto err; +	}          ret = dict_set_bin (new_dict, QUOTA_SIZE_KEY, delta, 8);          if (ret) @@ -385,7 +388,6 @@ mq_update_size_xattr (call_frame_t *frame, void *cookie, xlator_t *this,  err:          if (op_ret == -1 || ret == -1) {                  local->err = -1; -                  mq_release_lock_on_dirty_inode (frame, NULL, this, 0, 0, NULL);          } diff --git a/xlators/features/marker/src/marker.c b/xlators/features/marker/src/marker.c index a27a266f004..adcf3d8e7b8 100644 --- a/xlators/features/marker/src/marker.c +++ b/xlators/features/marker/src/marker.c @@ -255,18 +255,18 @@ out:          return 0;  } -int32_t +gf_boolean_t  call_from_special_client (call_frame_t *frame, xlator_t *this, const char *name)  {          struct volume_mark     *vol_mark   = NULL;          marker_conf_t          *priv       = NULL; -        gf_boolean_t            ret        = _gf_true; +        gf_boolean_t           is_true     = _gf_true;          priv = (marker_conf_t *)this->private;          if (frame->root->pid != GF_CLIENT_PID_GSYNCD || name == NULL ||              strcmp (name, MARKER_XATTR_PREFIX "." VOLUME_MARK) != 0) { -                ret = _gf_false; +                is_true = _gf_false;                  goto out;          } @@ -274,7 +274,7 @@ call_from_special_client (call_frame_t *frame, xlator_t *this, const char *name)          marker_getxattr_stampfile_cbk (frame, this, name, vol_mark, NULL);  out: -        return ret; +        return is_true;  }  int32_t @@ -348,10 +348,10 @@ int32_t  marker_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,                   const char *name, dict_t *xdata)  { -        gf_boolean_t   ret    = _gf_false; -        marker_conf_t *priv   = NULL; -        unsigned long  cookie = 0; -        marker_local_t *local = NULL; +        gf_boolean_t    is_true  = _gf_false; +        marker_conf_t   *priv    = NULL; +        unsigned long   cookie   = 0; +        marker_local_t  *local   = NULL;          priv = this->private; @@ -362,16 +362,15 @@ marker_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,          MARKER_INIT_LOCAL (frame, local); -        ret = loc_copy (&local->loc, loc); -        if (ret < 0) -                goto out; +        if ((loc_copy (&local->loc, loc)) < 0) +		goto out;          gf_log (this->name, GF_LOG_DEBUG, "USER:PID = %d", frame->root->pid);          if (priv && priv->feature_enabled & GF_XTIME) -                ret = call_from_special_client (frame, this, name); +                is_true = call_from_special_client (frame, this, name); -        if (ret == _gf_false) { +        if (is_true == _gf_false) {                  if (name == NULL) {                          /* Signifies that marker translator                           * has to filter the quota's xattr's, @@ -380,10 +379,11 @@ marker_getxattr (call_frame_t *frame, xlator_t *this, loc_t *loc,                           */                          cookie = 1;                  } -                STACK_WIND_COOKIE (frame, marker_getxattr_cbk, (void *)cookie, +                STACK_WIND_COOKIE (frame, marker_getxattr_cbk, +				   (void *)cookie,                                     FIRST_CHILD(this), -                                   FIRST_CHILD(this)->fops->getxattr, loc, -                                   name, xdata); +                                   FIRST_CHILD(this)->fops->getxattr, +				   loc, name, xdata);          }          return 0; diff --git a/xlators/features/quota/src/quota.c b/xlators/features/quota/src/quota.c index 4beaae34188..2ca4da0c15f 100644 --- a/xlators/features/quota/src/quota.c +++ b/xlators/features/quota/src/quota.c @@ -244,7 +244,7 @@ out:          return;  } -inline void +static inline void  quota_link_count_decrement (quota_local_t *local)  {          call_stub_t *stub       = NULL; @@ -270,7 +270,7 @@ out:          return;  } -inline void +static inline void  quota_handle_validate_error (quota_local_t *local, int32_t op_ret,                               int32_t op_errno)  { @@ -377,7 +377,7 @@ quota_timeout (struct timeval *tv, int32_t timeout)          return timed_out;  } -inline void +static inline void  quota_add_parent (quota_dentry_t *dentry, struct list_head *list)  {          quota_dentry_t *entry = NULL; @@ -928,7 +928,7 @@ err:          return 0;  } -inline int +static inline int  quota_get_limits (xlator_t *this, dict_t *dict, int64_t *hard_lim,                    int64_t *soft_lim)  { diff --git a/xlators/features/quota/src/quotad-aggregator.c b/xlators/features/quota/src/quotad-aggregator.c index f3f65ca2a04..5f13fd251c2 100644 --- a/xlators/features/quota/src/quotad-aggregator.c +++ b/xlators/features/quota/src/quotad-aggregator.c @@ -227,7 +227,7 @@ quotad_aggregator_getlimit (rpcsvc_request_t *req)          if (ret)                  goto err; -        ret = dict_set_int32 (state->xdata, GET_ANCESTRY_PATH_KEY,42); +        ret = dict_set_int32 (state->xdata, GET_ANCESTRY_PATH_KEY, 42);          if (ret)                  goto err; diff --git a/xlators/mgmt/glusterd/src/Makefile.am b/xlators/mgmt/glusterd/src/Makefile.am index 933c440196d..b89ec6ddc81 100644 --- a/xlators/mgmt/glusterd/src/Makefile.am +++ b/xlators/mgmt/glusterd/src/Makefile.am @@ -29,7 +29,7 @@ noinst_HEADERS = glusterd.h glusterd-utils.h glusterd-op-sm.h \  AM_CPPFLAGS = $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src \  	-I$(rpclibdir) -I$(CONTRIBDIR)/rbtree \  	-I$(top_srcdir)/rpc/xdr/src -I$(top_srcdir)/rpc/rpc-lib/src \ -	-I$(CONTRIBDIR)/uuid \ +	-I$(CONTRIBDIR)/uuid -I$(CONTRIBDIR)/mount \  	-DSBIN_DIR=\"$(sbindir)\" -DDATADIR=\"$(localstatedir)\" \  	-DGSYNCD_PREFIX=\"$(libexecdir)/glusterfs\"\          -DSYNCDAEMON_COMPILE=$(SYNCDAEMON_COMPILE) $(XML_CPPFLAGS) diff --git a/xlators/mgmt/glusterd/src/glusterd-hooks.c b/xlators/mgmt/glusterd/src/glusterd-hooks.c index 352b6ba1197..78730a5645f 100644 --- a/xlators/mgmt/glusterd/src/glusterd-hooks.c +++ b/xlators/mgmt/glusterd/src/glusterd-hooks.c @@ -181,7 +181,7 @@ glusterd_hooks_set_volume_args (dict_t *dict, runner_t *runner)                  goto out;          runner_add_arg (runner, "-o"); -        for (i = 1; (ret == 0); i++) { +        for (i = 1; ret == 0; i++) {                  snprintf (query, sizeof (query), "key%d", i);                  ret = dict_get_str (dict, query, &key);                  if (ret) diff --git a/xlators/mgmt/glusterd/src/glusterd-op-sm.c b/xlators/mgmt/glusterd/src/glusterd-op-sm.c index fb5e097d9c1..c22c2ea63b9 100644 --- a/xlators/mgmt/glusterd/src/glusterd-op-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-op-sm.c @@ -1020,7 +1020,7 @@ glusterd_op_stage_reset_volume (dict_t *dict, char **op_errstr)  {          int                                      ret           = 0;          char                                    *volname       = NULL; -        gf_boolean_t                             exists        = _gf_false; +        int                                     exists         = 0;          char                                    msg[2048]      = {0};          char                                    *key = NULL;          char                                    *key_fixed = NULL; @@ -1068,6 +1068,7 @@ glusterd_op_stage_reset_volume (dict_t *dict, char **op_errstr)                          ret = -1;                          goto out;                  } +                  if (!exists) {                          ret = snprintf (msg, sizeof (msg),                                          "Option %s does not exist", key); @@ -1819,7 +1820,7 @@ glusterd_op_set_volume (dict_t *dict)          if (dict_count == 0) {                  ret = glusterd_volset_help (NULL, &op_errstr);                  if (ret) { -                        gf_log (this->name, GF_LOG_ERROR, "%s",  +                        gf_log (this->name, GF_LOG_ERROR, "%s",                                         (op_errstr)? op_errstr:                                         "Volume set help internal error");                  } @@ -3262,7 +3263,7 @@ glusterd_is_get_op (xlator_t *this, glusterd_op_t op, dict_t *dict)          if (op == GD_OP_STATUS_VOLUME)                  return _gf_true; -        if ((op == GD_OP_SET_VOLUME)) { +        if (op == GD_OP_SET_VOLUME) {                  //check for set volume help                  ret = dict_get_str (dict, "volname", &volname);                  if (volname && diff --git a/xlators/mgmt/glusterd/src/glusterd-quota.c b/xlators/mgmt/glusterd/src/glusterd-quota.c index cf23b640478..7f798ad26de 100644 --- a/xlators/mgmt/glusterd/src/glusterd-quota.c +++ b/xlators/mgmt/glusterd/src/glusterd-quota.c @@ -474,7 +474,7 @@ glusterd_set_quota_limit (char *volname, char *path, char *hard_limit,          new_limit.sl = hton64 (new_limit.sl); -        ret = gf_string2bytesize (hard_limit, (uint64_t*)&new_limit.hl); +        ret = gf_string2bytesize_uint64 (hard_limit, (uint64_t*)&new_limit.hl);          if (ret)                  goto out; @@ -1400,13 +1400,13 @@ glusterd_op_stage_quota (dict_t *dict, char **op_errstr, dict_t *rsp_dict)                                  "Faild to get hard-limit from dict");                          goto out;                  } -                ret = gf_string2bytesize (hard_limit_str, &hard_limit); +                ret = gf_string2bytesize_uint64 (hard_limit_str, &hard_limit);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR,                                  "Failed to convert hard-limit string to value");                          goto out;                  } -                if (hard_limit > INT64_MAX) { +                if (hard_limit > UINT64_MAX) {                          ret = -1;                          ret = gf_asprintf (op_errstr, "Hard-limit %s is greater"                                             " than %"PRId64"bytes. Please set a " diff --git a/xlators/mgmt/glusterd/src/glusterd-snapshot.c b/xlators/mgmt/glusterd/src/glusterd-snapshot.c index d11abee7060..b294d1bc6b2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-snapshot.c +++ b/xlators/mgmt/glusterd/src/glusterd-snapshot.c @@ -18,6 +18,14 @@  #include <sys/resource.h>  #include <sys/statvfs.h>  #include <sys/mount.h> +#include <signal.h> + + +#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS) +#include <mntent.h> +#else +#include "mntent_compat.h" +#endif  #include "globals.h"  #include "compat.h" @@ -40,9 +48,7 @@  #include "cli1-xdr.h"  #include "xdr-generic.h" -#ifdef GF_LINUX_HOST_OS -#include <mntent.h> -#endif +#include "lvm-defaults.h"  char snap_mount_folder[PATH_MAX]; @@ -267,7 +273,7 @@ out:  int  snap_max_hard_limits_validate (dict_t *dict, char *volname, -                          uint64_t value, char **op_errstr) +                               uint64_t value, char **op_errstr)  {          char                err_str[PATH_MAX] = "";          glusterd_conf_t    *conf              = NULL; @@ -449,7 +455,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)          for (i = 0; i < volume_count; i++) {                  memset (snapbrckcnt, '\0', sizeof(snapbrckcnt));                  ret = snprintf (snapbrckcnt, sizeof(snapbrckcnt) - 1, -                                "vol%ld_brickcount", i+1); +                                "vol%"PRId64"_brickcount", i+1);                  ret = dict_get_int64 (src, snapbrckcnt, &brick_count);                  if (ret) {                          gf_log (this->name, GF_LOG_TRACE, @@ -460,7 +466,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)                  for (j = 0; j < brick_count; j++) {                          /* Fetching data from source dict */                          snprintf (key, sizeof(key) - 1, -                                  "vol%ld.brickdir%ld", i+1, j); +                                  "vol%"PRId64".brickdir%"PRId64, i+1, j);                          ret = dict_get_ptr (src, key,                                              (void **)&snap_brick_dir); @@ -471,7 +477,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (key, sizeof(key) - 1, -                                  "vol%ld.brick_snapdevice%ld", i+1, j); +                                  "vol%"PRId64".brick_snapdevice%"PRId64, i+1, j);                          ret = dict_get_ptr (src, key,                                              (void **)&snap_device); @@ -482,7 +488,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (snapbrckord, sizeof(snapbrckord) - 1, -                                  "vol%ld.brick%ld.order", i+1, j); +                                  "vol%"PRId64".brick%"PRId64".order", i+1, j);                          ret = dict_get_int64 (src, snapbrckord, &brick_order);                          if (ret) { @@ -493,7 +499,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)                          /* Adding the data in the dst dict */                          snprintf (key, sizeof(key) - 1, -                                  "vol%ld.brickdir%ld", i+1, brick_order); +                                  "vol%"PRId64".brickdir%"PRId64, i+1, brick_order);                          tmpstr = gf_strdup (snap_brick_dir);                          if (!tmpstr) { @@ -511,7 +517,7 @@ glusterd_snap_create_pre_val_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (key, sizeof(key) - 1, -                                  "vol%ld.brick_snapdevice%ld", +                                  "vol%"PRId64".brick_snapdevice%"PRId64,                                    i+1, brick_order);                          tmpstr = gf_strdup (snap_device); @@ -618,8 +624,8 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                  goto out;          }          if (volcount <= 0) { -                snprintf (err_str, sizeof (err_str), "Invalid volume count %ld " -                          "supplied", volcount); +                snprintf (err_str, sizeof (err_str), "Invalid volume count %"PRId64 +                          " supplied", volcount);                  ret = -1;                  goto out;          } @@ -638,7 +644,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,          }          for (i = 1; i <= volcount; i++) { -                snprintf (key, sizeof (key), "volname%ld", i); +                snprintf (key, sizeof (key), "volname%"PRId64, i);                  ret = dict_get_str (dict, key, &volname);                  if (ret) {                          snprintf (err_str, sizeof (err_str), @@ -690,7 +696,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                          goto out;                  } -                snprintf (key, sizeof(key) - 1, "vol%ld_volid", i); +                snprintf (key, sizeof(key) - 1, "vol%"PRId64"_volid", i);                  ret = dict_get_bin (dict, key, (void **)&snap_volid);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR, @@ -745,7 +751,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                          }                          snprintf (key, sizeof(key), -                                  "vol%ld.brick_snapdevice%ld", i, +                                  "vol%"PRId64".brick_snapdevice%"PRId64, i,                                    brick_count);                          ret = dict_set_dynstr (rsp_dict, key, device);                          if (ret) { @@ -783,7 +789,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                                  ret = -1;                                  goto out;                          } -                        snprintf (key, sizeof(key), "vol%ld.brickdir%ld", i, +                        snprintf (key, sizeof(key), "vol%"PRId64".brickdir%"PRId64, i,                                    brick_count);                          ret = dict_set_dynstr (rsp_dict, key, tmpstr);                          if (ret) { @@ -793,7 +799,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                          }                          tmpstr = NULL; -                        snprintf (key, sizeof(key) - 1, "vol%ld.brick%ld.order", +                        snprintf (key, sizeof(key) - 1, "vol%"PRId64".brick%"PRId64".order",                                    i, brick_count);                          ret = dict_set_int64 (rsp_dict, key, brick_order);                          if (ret) { @@ -805,7 +811,7 @@ glusterd_snapshot_create_prevalidate (dict_t *dict, char **op_errstr,                          brick_count++;                          brick_order++;                  } -                snprintf (key, sizeof(key) - 1, "vol%ld_brickcount", i); +                snprintf (key, sizeof(key) - 1, "vol%"PRId64"_brickcount", i);                  ret = dict_set_int64 (rsp_dict, key, brick_count);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR, "Failed to set %s", @@ -1002,7 +1008,7 @@ glusterd_do_lvm_snapshot_remove (glusterd_volinfo_t *snap_vol,          snprintf (msg, sizeof(msg), "remove snapshot of the brick %s:%s, "                    "device: %s", brickinfo->hostname, brickinfo->path,                    snap_device); -        runner_add_args (&runner, "/sbin/lvremove", "-f", snap_device, NULL); +        runner_add_args (&runner, LVM_REMOVE, "-f", snap_device, NULL);          runner_log (&runner, "", GF_LOG_DEBUG, msg);          ret = runner_run (&runner); @@ -2047,8 +2053,8 @@ glusterd_handle_snapshot_create (rpcsvc_request_t *req, glusterd_op_t op,                  goto out;          }          if (volcount <= 0) { -                gf_log (this->name, GF_LOG_ERROR, "Invalid volume count %ld " -                        "supplied", volcount); +                gf_log (this->name, GF_LOG_ERROR, "Invalid volume count %"PRId64 +                        " supplied", volcount);                  ret = -1;                  goto out;          } @@ -2476,7 +2482,7 @@ glusterd_create_snap_object (dict_t *dict, dict_t *rsp_dict)          }          if (time_stamp <= 0) {                  ret = -1; -                gf_log (this->name, GF_LOG_ERROR, "Invalid time-stamp: %ld", +                gf_log (this->name, GF_LOG_ERROR, "Invalid time-stamp: %"PRId64,                          time_stamp);                  goto out;          } @@ -2715,7 +2721,7 @@ glusterd_take_lvm_snapshot (glusterd_volinfo_t *snap_vol,          /* Figuring out if setactivationskip flag is supported or not */          runinit (&runner);          snprintf (msg, sizeof (msg), "running lvcreate help"); -        runner_add_args (&runner, "/sbin/lvcreate", "--help", NULL); +        runner_add_args (&runner, LVM_CREATE, "--help", NULL);          runner_log (&runner, "", GF_LOG_DEBUG, msg);          runner_redir (&runner, STDOUT_FILENO, RUN_PIPE);          ret = runner_start (&runner); @@ -2744,11 +2750,11 @@ glusterd_take_lvm_snapshot (glusterd_volinfo_t *snap_vol,          snprintf (msg, sizeof (msg), "taking snapshot of the brick %s:%s",                    brickinfo->hostname, brickinfo->path);          if (match == _gf_true) -                runner_add_args (&runner, "/sbin/lvcreate", "-s", device, +                runner_add_args (&runner, LVM_CREATE, "-s", device,                                   "--setactivationskip", "n", "--name",                                   snap_vol->volname, NULL);          else -                runner_add_args (&runner, "/sbin/lvcreate", "-s", device, +                runner_add_args (&runner, LVM_CREATE, "-s", device,                                   "--name", snap_vol->volname, NULL);          runner_log (&runner, "", GF_LOG_DEBUG, msg);          ret = runner_start (&runner); @@ -2862,7 +2868,11 @@ out:          if (ret) {                  gf_log (this->name, GF_LOG_WARNING, "unmounting the snap brick"                          " mount %s", snap_brick_mount_path); +#if !defined(GF_DARWIN_HOST_OS)                  umount (snap_brick_mount_path); +#else +		unmount (snap_brick_mount_path, 0); +#endif          }          gf_log (this->name, GF_LOG_TRACE, "Returning %d", ret); @@ -2893,7 +2903,7 @@ glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict,          GF_ASSERT (snap_brickinfo);          GF_ASSERT (snap_brick_dir); -        snprintf (key, sizeof(key) - 1, "vol%ld.brickdir%d", volcount, +        snprintf (key, sizeof(key) - 1, "vol%"PRId64".brickdir%d", volcount,                    brick_count);          ret = dict_get_ptr (dict, key, (void **)snap_brick_dir);          if (ret) { @@ -2951,7 +2961,7 @@ glusterd_add_bricks_to_snap_volume (dict_t *dict, dict_t *rsp_dict,                  }          } -        snprintf (key, sizeof(key), "vol%ld.brick_snapdevice%d", +        snprintf (key, sizeof(key), "vol%"PRId64".brick_snapdevice%d",                    volcount, brick_count);          ret = dict_get_ptr (dict, key, (void **)&snap_device);          if (ret) { @@ -3129,7 +3139,7 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,          GF_ASSERT (rsp_dict);          /* fetch username, password and vol_id from dict*/ -        snprintf (key, sizeof(key), "volume%ld_username", volcount); +        snprintf (key, sizeof(key), "volume%"PRId64"_username", volcount);          ret = dict_get_str (dict, key, &username);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "Failed to get %s for " @@ -3137,7 +3147,7 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,                  goto out;          } -        snprintf (key, sizeof(key), "volume%ld_password", volcount); +        snprintf (key, sizeof(key), "volume%"PRId64"_password", volcount);          ret = dict_get_str (dict, key, &password);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, "Failed to get %s for " @@ -3145,7 +3155,7 @@ glusterd_do_snap_vol (glusterd_volinfo_t *origin_vol, glusterd_snap_t *snap,                  goto out;          } -        snprintf (key, sizeof(key) - 1, "vol%ld_volid", volcount); +        snprintf (key, sizeof(key) - 1, "vol%"PRId64"_volid", volcount);          ret = dict_get_bin (dict, key, (void **)&snap_volid);          if (ret) {                  gf_log (this->name, GF_LOG_ERROR, @@ -3367,7 +3377,7 @@ glusterd_handle_snapshot_remove (rpcsvc_request_t *req, glusterd_op_t op,                          goto out;                  } -                snprintf (key, sizeof (key), "volname%ld", volcount); +                snprintf (key, sizeof (key), "volname%"PRId64, volcount);                  ret = dict_set_dynstr (dict, key, volname);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR, "Failed to set " @@ -3771,7 +3781,7 @@ glusterd_snapshot_create_commit (dict_t *dict, char **op_errstr,          }          for (i = 1; i <= volcount; i++) { -                snprintf (key, sizeof (key), "volname%ld", i); +                snprintf (key, sizeof (key), "volname%"PRId64, i);                  ret = dict_get_str (dict, key, &volname);                  if (ret) {                          gf_log (this->name, GF_LOG_ERROR, @@ -3922,7 +3932,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                          soft_limit_value = (active_hard_limit *                                              conf->snap_max_soft_limit) / 100; -                        snprintf (buf, sizeof(buf), "volume%ld-volname", count); +                        snprintf (buf, sizeof(buf), "volume%"PRIu64"-volname", count);                          ret = dict_set_str (rsp_dict, buf, volinfo->volname);                          if (ret) {                                  snprintf (err_str, PATH_MAX, @@ -3931,7 +3941,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                          }                          snprintf (buf, sizeof(buf), -                                  "volume%ld-snap-max-hard-limit", count); +                                  "volume%"PRIu64"-snap-max-hard-limit", count);                          ret = dict_set_uint64 (rsp_dict, buf, snap_max_limit);                          if (ret) {                                  snprintf (err_str, PATH_MAX, @@ -3940,7 +3950,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                          }                          snprintf (buf, sizeof(buf), -                                  "volume%ld-active-hard-limit", count); +                                  "volume%"PRIu64"-active-hard-limit", count);                          ret = dict_set_uint64 (rsp_dict, buf,                                                 active_hard_limit);                          if (ret) { @@ -3950,7 +3960,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                          }                          snprintf (buf, sizeof(buf), -                                  "volume%ld-snap-max-soft-limit", count); +                                  "volume%"PRIu64"-snap-max-soft-limit", count);                          ret = dict_set_uint64 (rsp_dict, buf, soft_limit_value);                          if (ret) {                                  snprintf (err_str, PATH_MAX, @@ -3984,7 +3994,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                  soft_limit_value = (active_hard_limit *                                      conf->snap_max_soft_limit) / 100; -                snprintf (buf, sizeof(buf), "volume%ld-volname", count); +                snprintf (buf, sizeof(buf), "volume%"PRIu64"-volname", count);                  ret = dict_set_str (rsp_dict, buf, volinfo->volname);                  if (ret) {                          snprintf (err_str, PATH_MAX, @@ -3993,7 +4003,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                  }                  snprintf (buf, sizeof(buf), -                          "volume%ld-snap-max-hard-limit", count); +                          "volume%"PRIu64"-snap-max-hard-limit", count);                  ret = dict_set_uint64 (rsp_dict, buf, snap_max_limit);                  if (ret) {                          snprintf (err_str, PATH_MAX, @@ -4002,7 +4012,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                  }                  snprintf (buf, sizeof(buf), -                          "volume%ld-active-hard-limit", count); +                          "volume%"PRIu64"-active-hard-limit", count);                  ret = dict_set_uint64 (rsp_dict, buf, active_hard_limit);                  if (ret) {                          snprintf (err_str, PATH_MAX, @@ -4011,7 +4021,7 @@ snap_max_limits_display_commit (dict_t *rsp_dict, char *volname,                  }                  snprintf (buf, sizeof(buf), -                          "volume%ld-snap-max-soft-limit", count); +                          "volume%"PRIu64"-snap-max-soft-limit", count);                  ret = dict_set_uint64 (rsp_dict, buf, soft_limit_value);                  if (ret) {                          snprintf (err_str, PATH_MAX, @@ -4196,7 +4206,7 @@ glusterd_get_brick_lvm_details (dict_t *rsp_dict,           * for the above given command with separator ":",           * The output will be "vgname:lvsize"           */ -        runner_add_args (&runner, "lvs", device, "--noheading", "-o", +        runner_add_args (&runner, LVS, device, "--noheading", "-o",                           "vg_name,data_percent,lv_size",                           "--separator", ":", NULL);          runner_redir (&runner, STDOUT_FILENO, RUN_PIPE); diff --git a/xlators/mgmt/glusterd/src/glusterd-store.c b/xlators/mgmt/glusterd/src/glusterd-store.c index e28a30c5ac4..b803ba28253 100644 --- a/xlators/mgmt/glusterd/src/glusterd-store.c +++ b/xlators/mgmt/glusterd/src/glusterd-store.c @@ -2615,7 +2615,7 @@ out:          return volinfo;  } -inline void +static inline void  glusterd_store_set_options_path (glusterd_conf_t *conf, char *path, size_t len)  {          snprintf (path, len, "%s/options", conf->workdir); @@ -3722,7 +3722,7 @@ glusterd_store_retrieve_quota_version (glusterd_volinfo_t *volinfo)          }          version = strtoul (version_str, &tmp, 10); -         if (version < 0) { +	if ((errno == ERANGE) || (errno == EINVAL)) {                   gf_log (this->name, GF_LOG_DEBUG, "Invalid version number");                   goto out;          } diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.c b/xlators/mgmt/glusterd/src/glusterd-utils.c index bb8028003ce..be2022da42d 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.c +++ b/xlators/mgmt/glusterd/src/glusterd-utils.c @@ -13,6 +13,12 @@  #endif  #include <inttypes.h> +#if !defined(__NetBSD__) && !defined(GF_DARWIN_HOST_OS) +#include <mntent.h> +#else +#include "mntent_compat.h" +#endif +  #include "globals.h"  #include "glusterfs.h"  #include "compat.h" @@ -44,7 +50,6 @@  #include <inttypes.h>  #include <signal.h>  #include <sys/types.h> -#include <net/if.h>  #include <sys/ioctl.h>  #include <sys/socket.h>  #include <rpc/pmap_clnt.h> @@ -56,11 +61,6 @@  #include <lvm2app.h>  #endif - -#ifdef GF_LINUX_HOST_OS -#include <mntent.h> -#endif -  #ifdef GF_SOLARIS_HOST_OS  #include <sys/sockio.h>  #endif @@ -4520,14 +4520,16 @@ glusterd_nodesvc_start (char *server, gf_boolean_t wait)                                   "--trace-children=yes", "--track-origins=yes",                                   NULL);                  runner_argprintf (&runner, "--log-file=%s", valgrind_logfile); -        } +       }          runner_add_args (&runner, SBIN_DIR"/glusterfs",                           "-s", "localhost",                           "--volfile-id", volfileid,                           "-p", pidfile,                           "-l", logfile, -                         "-S", sockfpath, NULL); +                         "-S", sockfpath, +			 "-L", "DEBUG", +			 NULL);          if (!strcmp (server, "glustershd")) {                  snprintf (glusterd_uuid_option, sizeof (glusterd_uuid_option), @@ -5454,7 +5456,6 @@ out:          return -1;  } -#ifdef GF_LINUX_HOST_OS  int  glusterd_get_brick_root (char *path, char **mount_point)  { @@ -5750,7 +5751,6 @@ out:          return device;  } -#endif  int  glusterd_add_brick_detail_to_dict (glusterd_volinfo_t *volinfo, @@ -5824,13 +5824,12 @@ glusterd_add_brick_detail_to_dict (glusterd_volinfo_t *volinfo,                  if (ret)                          goto out;          } -#ifdef GF_LINUX_HOST_OS +          ret = glusterd_add_brick_mount_details (brickinfo, dict, count);          if (ret)                  goto out;          ret = glusterd_add_inode_size_to_dict (dict, count); -#endif   out:          if (ret)                  gf_log (this->name, GF_LOG_DEBUG, "Error adding brick" @@ -8828,7 +8827,7 @@ glusterd_snap_config_use_rsp_dict (dict_t *dst, dict_t *src)                  }                  for (i = 0; i < voldisplaycount; i++) { -                        snprintf (buf, sizeof(buf), "volume%ld-volname", i); +                        snprintf (buf, sizeof(buf), "volume%"PRIu64"-volname", i);                          ret = dict_get_str (src, buf, &volname);                          if (ret) {                                  gf_log ("", GF_LOG_ERROR, @@ -8843,7 +8842,7 @@ glusterd_snap_config_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (buf, sizeof(buf), -                                  "volume%ld-snap-max-hard-limit", i); +                                  "volume%"PRIu64"-snap-max-hard-limit", i);                          ret = dict_get_uint64 (src, buf, &value);                          if (ret) {                                  gf_log ("", GF_LOG_ERROR, @@ -8858,7 +8857,7 @@ glusterd_snap_config_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (buf, sizeof(buf), -                                  "volume%ld-active-hard-limit", i); +                                  "volume%"PRIu64"-active-hard-limit", i);                          ret = dict_get_uint64 (src, buf, &value);                          if (ret) {                                  gf_log ("", GF_LOG_ERROR, @@ -8873,7 +8872,7 @@ glusterd_snap_config_use_rsp_dict (dict_t *dst, dict_t *src)                          }                          snprintf (buf, sizeof(buf), -                                  "volume%ld-snap-max-soft-limit", i); +                                  "volume%"PRIu64"-snap-max-soft-limit", i);                          ret = dict_get_uint64 (src, buf, &value);                          if (ret) {                                  gf_log ("", GF_LOG_ERROR, diff --git a/xlators/mgmt/glusterd/src/glusterd-utils.h b/xlators/mgmt/glusterd/src/glusterd-utils.h index 23f8ad7f66b..d2121778a10 100644 --- a/xlators/mgmt/glusterd/src/glusterd-utils.h +++ b/xlators/mgmt/glusterd/src/glusterd-utils.h @@ -8,7 +8,7 @@     cases as published by the Free Software Foundation.  */  #ifndef _GLUSTERD_UTILS_H -#define _GLUSTERD_UTILS_H_ +#define _GLUSTERD_UTILS_H  #ifndef _CONFIG_H  #define _CONFIG_H @@ -684,14 +684,16 @@ glusterd_rpc_clnt_unref (glusterd_conf_t *conf, rpc_clnt_t *rpc);  int32_t  glusterd_compare_volume_name(struct list_head *, struct list_head *); -#ifdef GF_LINUX_HOST_OS +  char*  glusterd_get_brick_mount_details (glusterd_brickinfo_t *brickinfo); +  struct mntent *  glusterd_get_mnt_entry_info (char *mnt_pt, FILE *mtab); +  int  glusterd_get_brick_root (char *path, char **mount_point); -#endif //LINUX_HOST +  int  glusterd_compare_snap_time(struct list_head *, struct list_head *); diff --git a/xlators/mgmt/glusterd/src/glusterd-volgen.c b/xlators/mgmt/glusterd/src/glusterd-volgen.c index ca799aefc8e..316b70f7782 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volgen.c +++ b/xlators/mgmt/glusterd/src/glusterd-volgen.c @@ -741,7 +741,7 @@ int  glusterd_volinfo_get_boolean (glusterd_volinfo_t *volinfo, char *key)  {          char *val = NULL; -        gf_boolean_t  boo = _gf_false; +        gf_boolean_t  enabled = _gf_false;          int ret = 0;          ret = glusterd_volinfo_get (volinfo, key, &val); @@ -749,14 +749,14 @@ glusterd_volinfo_get_boolean (glusterd_volinfo_t *volinfo, char *key)                  return -1;          if (val) -                ret = gf_string2boolean (val, &boo); +                ret = gf_string2boolean (val, &enabled);          if (ret) {                  gf_log ("", GF_LOG_ERROR, "value for %s option is not valid", key);                  return -1;          } -        return boo; +        return enabled;  }  gf_boolean_t @@ -1258,8 +1258,8 @@ static int  server_check_marker_off (volgen_graph_t *graph, struct volopt_map_entry *vme,                           glusterd_volinfo_t *volinfo)  { -        gf_boolean_t           bool = _gf_false; -        int                    ret = 0; +        gf_boolean_t enabled = _gf_false; +        int ret = 0;          GF_ASSERT (volinfo);          GF_ASSERT (vme); @@ -1267,8 +1267,8 @@ server_check_marker_off (volgen_graph_t *graph, struct volopt_map_entry *vme,          if (strcmp (vme->option, "!xtime") != 0)                  return 0; -        ret = gf_string2boolean (vme->value, &bool); -        if (ret || bool) +        ret = gf_string2boolean (vme->value, &enabled); +        if (ret || enabled)                  goto out;          ret = glusterd_volinfo_get_boolean (volinfo, VKEY_MARKER_XTIME); @@ -1279,10 +1279,10 @@ server_check_marker_off (volgen_graph_t *graph, struct volopt_map_entry *vme,          }          if (ret) { -                bool = _gf_false; -                ret = glusterd_check_gsync_running (volinfo, &bool); +                enabled = _gf_false; +                ret = glusterd_check_gsync_running (volinfo, &enabled); -                if (bool) { +                if (enabled) {                          gf_log ("", GF_LOG_WARNING, GEOREP" sessions active"                                  "for the volume %s, cannot disable marker "                                  ,volinfo->volname); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c index eac926d9533..504aeb839bc 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-ops.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-ops.c @@ -1213,7 +1213,7 @@ glusterd_op_stage_delete_volume (dict_t *dict, char **op_errstr)          if (volinfo->snap_count > 0 || !list_empty(&volinfo->snap_volumes)) {                  snprintf (msg, sizeof (msg), "Cannot delete Volume %s ," -                        "as it has %ld snapshots. " +                        "as it has %"PRIu64" snapshots. "                          "To delete the volume, "                          "first delete all the snapshots under it.",                            volname, volinfo->snap_count); diff --git a/xlators/mgmt/glusterd/src/glusterd-volume-set.c b/xlators/mgmt/glusterd/src/glusterd-volume-set.c index 29e9f2b877c..1c5d359d9e3 100644 --- a/xlators/mgmt/glusterd/src/glusterd-volume-set.c +++ b/xlators/mgmt/glusterd/src/glusterd-volume-set.c @@ -116,8 +116,8 @@ validate_cache_max_min_size (dict_t *dict, char *key, char *value,                                        "performance.cache-max-file-size",                                        ¤t_max_value);                  if (current_max_value) { -                        gf_string2bytesize (current_max_value, &max_value); -                        gf_string2bytesize (value, &min_value); +                        gf_string2bytesize_uint64 (current_max_value, &max_value); +                        gf_string2bytesize_uint64 (value, &min_value);                          current_min_value = value;                  }          } else  if ((!strcmp (key, "performance.cache-max-file-size")) || @@ -126,8 +126,8 @@ validate_cache_max_min_size (dict_t *dict, char *key, char *value,                                        "performance.cache-min-file-size",                                        ¤t_min_value);                  if (current_min_value) { -                        gf_string2bytesize (current_min_value, &min_value); -                        gf_string2bytesize (value, &max_value); +                        gf_string2bytesize_uint64 (current_min_value, &min_value); +                        gf_string2bytesize_uint64 (value, &max_value);                          current_max_value = value;                  }          } @@ -1370,6 +1370,18 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .type        = GLOBAL_DOC,            .op_version  = 1          }, +        { .key         = "nfs.rpc-statd", +          .voltype     = "nfs/server", +          .option      = "nfs.rpc-statd", +          .type        = NO_DOC, +          .op_version  = 4, +        }, +        { .key         = "nfs.log-level", +          .voltype     = "nfs/server", +          .option      = "nfs.log-level", +          .type        = NO_DOC, +          .op_version  = 4, +        },          { .key         = "nfs.server-aux-gids",            .voltype     = "nfs/server",            .option      = "nfs.server-aux-gids", @@ -1434,6 +1446,10 @@ struct volopt_map_entry glusterd_volopt_map[] = {            .voltype     = "storage/posix",            .op_version  = 3          }, +        { .key         = "storage.xattr-user-namespace-mode", +          .voltype     = "storage/posix", +          .op_version  = 4 +        },          { .key         = "storage.owner-uid",            .voltype     = "storage/posix",            .option      = "brick-uid", diff --git a/xlators/mgmt/glusterd/src/glusterd.c b/xlators/mgmt/glusterd/src/glusterd.c index 85a6b920adf..abef538d8f0 100644 --- a/xlators/mgmt/glusterd/src/glusterd.c +++ b/xlators/mgmt/glusterd/src/glusterd.c @@ -30,6 +30,7 @@  #include "dict.h"  #include "compat.h"  #include "compat-errno.h" +#include "syscall.h"  #include "statedump.h"  #include "glusterd-sm.h"  #include "glusterd-op-sm.h" @@ -311,7 +312,7 @@ out:  } -inline int32_t +static inline int32_t  glusterd_program_register (xlator_t *this, rpcsvc_t *svc,                             rpcsvc_program_t *prog)  { @@ -804,7 +805,7 @@ check_prepare_mountbroker_root (char *mountbroker_root)          dfd0 = dup (dfd);          for (;;) { -                ret = openat (dfd, "..", O_RDONLY); +                ret = sys_openat (dfd, "..", O_RDONLY);                  if (ret != -1) {                          dfd2 = ret;                          ret = fstat (dfd2, &st2); @@ -839,11 +840,11 @@ check_prepare_mountbroker_root (char *mountbroker_root)                  st = st2;          } -        ret = mkdirat (dfd0, MB_HIVE, 0711); +        ret = sys_mkdirat (dfd0, MB_HIVE, 0711);          if (ret == -1 && errno == EEXIST)                  ret = 0;          if (ret != -1) -                ret = fstatat (dfd0, MB_HIVE, &st, AT_SYMLINK_NOFOLLOW); +                ret = sys_fstatat (dfd0, MB_HIVE, &st, AT_SYMLINK_NOFOLLOW);          if (ret == -1 || st.st_mode != (S_IFDIR|0711)) {                  gf_log ("", GF_LOG_ERROR,                          "failed to set up mountbroker-root directory %s", diff --git a/xlators/mount/fuse/src/fuse-bridge.c b/xlators/mount/fuse/src/fuse-bridge.c index fd44c4fb5f5..745617a71c1 100644 --- a/xlators/mount/fuse/src/fuse-bridge.c +++ b/xlators/mount/fuse/src/fuse-bridge.c @@ -29,6 +29,7 @@ static void fuse_invalidate_inode(xlator_t *this, uint64_t fuse_ino);   * Send an invalidate notification up to fuse to purge the file from local   * page cache.   */ +  static int32_t  fuse_invalidate(xlator_t *this, inode_t *inode)  { @@ -45,8 +46,8 @@ fuse_invalidate(xlator_t *this, inode_t *inode)                  return 0;          nodeid = inode_to_fuse_nodeid(inode); -        gf_log(this->name, GF_LOG_DEBUG, "Invalidate inode id %lu.", nodeid); -        fuse_log_eh (this, "Sending invalidate inode id: %lu gfid: %s", nodeid, +        gf_log(this->name, GF_LOG_DEBUG, "Invalidate inode id %"GF_PRI_INODE"." , nodeid); +        fuse_log_eh (this, "Sending invalidate inode id: %"GF_PRI_INODE" gfid: %s", nodeid,                       uuid_utoa (inode->gfid));          fuse_invalidate_inode(this, nodeid); @@ -236,6 +237,7 @@ send_fuse_data (xlator_t *this, fuse_in_header_t *finh, void *data, size_t size)          send_fuse_data (this, finh, obj, sizeof (*(obj))) +#if FUSE_KERNEL_MINOR_VERSION >= 11  static void  fuse_invalidate_entry (xlator_t *this, uint64_t fuse_ino)  { @@ -293,6 +295,7 @@ fuse_invalidate_entry (xlator_t *this, uint64_t fuse_ino)          if (inode)                  inode_unref (inode);  } +#endif  /*   * Send an inval inode notification to fuse. This causes an invalidation of the @@ -301,6 +304,7 @@ fuse_invalidate_entry (xlator_t *this, uint64_t fuse_ino)  static void  fuse_invalidate_inode(xlator_t *this, uint64_t fuse_ino)  { +#if FUSE_KERNEL_MINOR_VERSION >= 11          struct fuse_out_header *fouh = NULL;          struct fuse_notify_inval_inode_out *fniio = NULL;          fuse_private_t *priv = NULL; @@ -346,8 +350,13 @@ fuse_invalidate_inode(xlator_t *this, uint64_t fuse_ino)          if (inode)                  inode_unref (inode); +#else +	gf_log ("glusterfs-fuse", GF_LOG_WARNING, +		"fuse_invalidate_inode not implemented on OS X due to missing FUSE notification"); +#endif  } +  int  send_fuse_err (xlator_t *this, fuse_in_header_t *finh, int error)  { @@ -368,7 +377,7 @@ send_fuse_err (xlator_t *this, fuse_in_header_t *finh, int error)                                       uuid_utoa (inode->gfid));                  } else {                          fuse_log_eh (this, "Sending %s for operation %d on " -                                     "inode %ld", strerror (error), +                                     "inode %" GF_PRI_INODE,  strerror (error),                                       finh->opcode, finh->nodeid);                  }          } @@ -624,6 +633,7 @@ fuse_forget (xlator_t *this, fuse_in_header_t *finh, void *msg)          GF_FREE (finh);  } +#if FUSE_KERNEL_MINOR_VERSION >= 16  static void  fuse_batch_forget(xlator_t *this, fuse_in_header_t *finh, void *msg)  { @@ -640,9 +650,9 @@ fuse_batch_forget(xlator_t *this, fuse_in_header_t *finh, void *msg)                          continue;  		do_forget(this, finh->unique, ffo[i].nodeid, ffo[i].nlookup);          } -  	GF_FREE(finh);  } +#endif  static int  fuse_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this, @@ -1142,7 +1152,9 @@ fuse_setattr (xlator_t *this, fuse_in_header_t *finh, void *msg)  {          struct fuse_setattr_in *fsi = msg; +#if FUSE_KERNEL_MINOR_VERSION >= 9          fuse_private_t  *priv = NULL; +#endif          fuse_state_t *state = NULL;          GET_STATE (this, finh, state); @@ -1170,8 +1182,8 @@ fuse_setattr (xlator_t *this, fuse_in_header_t *finh, void *msg)           * http://git.kernel.org/?p=linux/kernel/git/torvalds/           * linux-2.6.git;a=commit;h=v2.6.23-5896-gf333211           */ -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >= 9 +        priv = this->private;          if (priv->proto_minor >= 9 && fsi->valid & FATTR_LOCKOWNER)                  state->lk_owner = fsi->lock_owner;  #endif @@ -1448,11 +1460,11 @@ fuse_mknod (xlator_t *this, fuse_in_header_t *finh, void *msg)          char         *name = (char *)(fmi + 1);          fuse_state_t   *state = NULL; +#if FUSE_KERNEL_MINOR_VERSION >= 12          fuse_private_t *priv = NULL; -        int32_t         ret = -1; +        int32_t         ret  = -1;          priv = this->private; -#if FUSE_KERNEL_MINOR_VERSION >= 12          if (priv->proto_minor < 12)                  name = (char *)msg + FUSE_COMPAT_MKNOD_IN_SIZE;  #endif @@ -1466,8 +1478,8 @@ fuse_mknod (xlator_t *this, fuse_in_header_t *finh, void *msg)          state->mode = fmi->mode;          state->rdev = fmi->rdev; -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >=12 +        priv = this->private;          FUSE_ENTRY_CREATE(this, priv, finh, state, fmi, "MKNOD");  #endif @@ -1515,10 +1527,12 @@ fuse_mkdir (xlator_t *this, fuse_in_header_t *finh, void *msg)  {          struct fuse_mkdir_in *fmi = msg;          char *name = (char *)(fmi + 1); +#if FUSE_KERNEL_MINOR_VERSION >=12          fuse_private_t *priv = NULL; +        int32_t         ret = -1; +#endif          fuse_state_t *state; -        int32_t ret = -1;          GET_STATE (this, finh, state); @@ -1528,8 +1542,8 @@ fuse_mkdir (xlator_t *this, fuse_in_header_t *finh, void *msg)          state->mode = fmi->mode; -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >=12 +        priv = this->private;          FUSE_ENTRY_CREATE(this, priv, finh, state, fmi, "MKDIR");  #endif @@ -2004,17 +2018,17 @@ fuse_create (xlator_t *this, fuse_in_header_t *finh, void *msg)  {  #if FUSE_KERNEL_MINOR_VERSION >= 12          struct fuse_create_in *fci = msg; +        fuse_private_t        *priv = NULL; +	int32_t                ret = -1;  #else          struct fuse_open_in *fci = msg;  #endif          char         *name = (char *)(fci + 1); -        fuse_private_t        *priv = NULL;          fuse_state_t *state = NULL; -        int32_t       ret = -1; -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >= 12 +        priv = this->private;          if (priv->proto_minor < 12)                  name = (char *)((struct fuse_open_in *)msg + 1);  #endif @@ -2028,8 +2042,8 @@ fuse_create (xlator_t *this, fuse_in_header_t *finh, void *msg)          state->mode = fci->mode;          state->flags = fci->flags; -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >=12 +        priv = this->private;          FUSE_ENTRY_CREATE(this, priv, finh, state, fci, "CREATE");  #endif          fuse_resolve_and_resume (state, fuse_create_resume); @@ -2167,7 +2181,9 @@ fuse_readv (xlator_t *this, fuse_in_header_t *finh, void *msg)  {          struct fuse_read_in *fri = msg; +#if FUSE_KERNEL_MINOR_VERSION >= 9          fuse_private_t  *priv = NULL; +#endif          fuse_state_t *state = NULL;          fd_t         *fd = NULL; @@ -2179,8 +2195,8 @@ fuse_readv (xlator_t *this, fuse_in_header_t *finh, void *msg)          fuse_resolve_fd_init (state, &state->resolve, fd);          /* See comment by similar code in fuse_settatr */ -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >= 9 +        priv = this->private;          if (priv->proto_minor >= 9 && fri->read_flags & FUSE_READ_LOCKOWNER)                  state->lk_owner = fri->lock_owner;  #endif @@ -2188,8 +2204,9 @@ fuse_readv (xlator_t *this, fuse_in_header_t *finh, void *msg)          state->size = fri->size;          state->off = fri->offset;          /* lets ignore 'fri->read_flags', but just consider 'fri->flags' */ +#if FUSE_KERNEL_MINOR_VERSION >= 9          state->io_flags = fri->flags; - +#endif          fuse_resolve_and_resume (state, fuse_readv_resume);  } @@ -2270,11 +2287,12 @@ fuse_write (xlator_t *this, fuse_in_header_t *finh, void *msg)          struct fuse_write_in *fwi = (struct fuse_write_in *)                                        (finh + 1); -        fuse_private_t  *priv = NULL;          fuse_state_t    *state = NULL;          fd_t            *fd = NULL; - +#if FUSE_KERNEL_MINOR_VERSION >= 9 +        fuse_private_t  *priv = NULL;          priv = this->private; +#endif          GET_STATE (this, finh, state);          fd          = FH_TO_FD (fwi->fh); @@ -2283,7 +2301,11 @@ fuse_write (xlator_t *this, fuse_in_header_t *finh, void *msg)          state->off  = fwi->offset;          /* lets ignore 'fwi->write_flags', but just consider 'fwi->flags' */ +#if FUSE_KERNEL_MINOR_VERSION >= 9          state->io_flags = fwi->flags; +#else +	state->io_flags = fwi->write_flags; +#endif          /* TODO: may need to handle below flag             (fwi->write_flags & FUSE_WRITE_CACHE);          */ @@ -2292,8 +2314,8 @@ fuse_write (xlator_t *this, fuse_in_header_t *finh, void *msg)          fuse_resolve_fd_init (state, &state->resolve, fd);          /* See comment by similar code in fuse_settatr */ -        priv = this->private;  #if FUSE_KERNEL_MINOR_VERSION >= 9 +        priv = this->private;          if (priv->proto_minor >= 9 && fwi->write_flags & FUSE_WRITE_LOCKOWNER)                  state->lk_owner = fwi->lock_owner;  #endif @@ -2636,7 +2658,7 @@ fuse_readdir (xlator_t *this, fuse_in_header_t *finh, void *msg)          fuse_resolve_and_resume (state, fuse_readdir_resume);  } - +#if FUSE_KERNEL_MINOR_VERSION >= 20  static int  fuse_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this,  		   int32_t op_ret, int32_t op_errno, gf_dirent_t *entries, @@ -2751,7 +2773,6 @@ out:  } -  void  fuse_readdirp_resume (fuse_state_t *state)  { @@ -2782,7 +2803,9 @@ fuse_readdirp (xlator_t *this, fuse_in_header_t *finh, void *msg)  	fuse_resolve_and_resume (state, fuse_readdirp_resume);  } +#endif +#if FUSE_KERNEL_MINOR_VERSION >= 19  #ifdef FALLOC_FL_KEEP_SIZE  static int  fuse_fallocate_cbk(call_frame_t *frame, void *cookie, xlator_t *this, @@ -2825,7 +2848,7 @@ fuse_fallocate(xlator_t *this, fuse_in_header_t *finh, void *msg)  	fuse_resolve_and_resume(state, fuse_fallocate_resume);  }  #endif /* FALLOC_FL_KEEP_SIZE */ - +#endif /* FUSE minor version >= 19 */  static void  fuse_releasedir (xlator_t *this, fuse_in_header_t *finh, void *msg) @@ -3097,7 +3120,9 @@ fuse_setxattr (xlator_t *this, fuse_in_header_t *finh, void *msg)                  gf_log ("fuse", GF_LOG_TRACE,                          "got request to invalidate %"PRIu64, finh->nodeid);                  send_fuse_err (this, finh, 0); +#if FUSE_KERNEL_MINOR_VERSION >= 11                  fuse_invalidate_entry (this, finh->nodeid); +#endif                  GF_FREE (finh);                  return;          } @@ -3746,7 +3771,7 @@ fuse_setlk (xlator_t *this, fuse_in_header_t *finh, void *msg)          return;  } - +#if FUSE_KERNEL_MINOR_VERSION >= 11  static void *  notify_kernel_loop (void *data)  { @@ -3782,7 +3807,7 @@ notify_kernel_loop (void *data)          return NULL;  } - +#endif  static void  fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg) @@ -3791,8 +3816,10 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)          struct fuse_init_out  fino      = {0,};          fuse_private_t       *priv      = NULL;          int                   ret       = 0; +#if FUSE_KERNEL_MINOR_VERSION >= 9          int                   pfd[2]    = {0,};          pthread_t             messenger; +#endif          priv = this->private; @@ -3885,16 +3912,17 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)          }          if (fini->minor < 9)                  *priv->msg0_len_p = sizeof(*finh) + FUSE_COMPAT_WRITE_IN_SIZE; -#endif +          if (priv->use_readdirp) {                  if (fini->flags & FUSE_DO_READDIRPLUS)                          fino.flags |= FUSE_DO_READDIRPLUS;          } - +#endif  	if (priv->fopen_keep_cache == 2) {  		/* If user did not explicitly set --fopen-keep-cache[=off],  		   then check if kernel support FUSE_AUTO_INVAL_DATA and ...  		*/ +#if FUSE_KERNEL_MINOR_VERSION >= 20  		if (fini->flags & FUSE_AUTO_INVAL_DATA) {  			/* ... enable fopen_keep_cache mode if supported.  			*/ @@ -3903,7 +3931,10 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)  				"fopen_keep_cache automatically.");  			fino.flags |= FUSE_AUTO_INVAL_DATA;  			priv->fopen_keep_cache = 1; -		} else { +		} else +#endif +		{ +  			gf_log ("glusterfs-fuse", GF_LOG_DEBUG, "No support "  				"for FUSE_AUTO_INVAL_DATA. Disabling "  				"fopen_keep_cache."); @@ -3914,20 +3945,24 @@ fuse_init (xlator_t *this, fuse_in_header_t *finh, void *msg)  		/* If user explicitly set --fopen-keep-cache[=on],  		   then enable FUSE_AUTO_INVAL_DATA if possible.  		*/ +#if FUSE_KERNEL_MINOR_VERSION >= 20  		if (fini->flags & FUSE_AUTO_INVAL_DATA) {  			gf_log ("glusterfs-fuse", GF_LOG_DEBUG, "fopen_keep_cache "  				"is explicitly set. Enabling FUSE_AUTO_INVAL_DATA");  			fino.flags |= FUSE_AUTO_INVAL_DATA; -		} else { +		} else +#endif +		{  			gf_log ("glusterfs-fuse", GF_LOG_WARNING, "fopen_keep_cache "  				"is explicitly set. Support for "  				"FUSE_AUTO_INVAL_DATA is missing");  		}  	} +#if FUSE_KERNEL_MINOR_VERSION >= 22  	if (fini->flags & FUSE_ASYNC_DIO)  		fino.flags |= FUSE_ASYNC_DIO; - +#endif          ret = send_fuse_obj (this, finh, &fino);          if (ret == 0)                  gf_log ("glusterfs-fuse", GF_LOG_INFO, @@ -5142,11 +5177,20 @@ static fuse_handler_t *fuse_std_ops[FUSE_OP_HIGH] = {       /* [FUSE_IOCTL] */       /* [FUSE_POLL] */       /* [FUSE_NOTIFY_REPLY] */ + +#if FUSE_KERNEL_MINOR_VERSION >= 16  	[FUSE_BATCH_FORGET]= fuse_batch_forget, +#endif + +#if FUSE_KERNEL_MINOR_VERSION >= 19  #ifdef FALLOC_FL_KEEP_SIZE  	[FUSE_FALLOCATE]   = fuse_fallocate,  #endif /* FALLOC_FL_KEEP_SIZE */ +#endif + +#if FUSE_KERNEL_MINOR_VERSION >= 21  	[FUSE_READDIRPLUS] = fuse_readdirp, +#endif  }; @@ -5279,13 +5323,13 @@ init (xlator_t *this_xl)                  goto cleanup_exit;          } -        GF_OPTION_INIT ("attribute-timeout", priv->attribute_timeout, double, +        GF_OPTION_INIT (ZR_ATTR_TIMEOUT_OPT, priv->attribute_timeout, double,                          cleanup_exit); -        GF_OPTION_INIT ("entry-timeout", priv->entry_timeout, double, +        GF_OPTION_INIT (ZR_ENTRY_TIMEOUT_OPT, priv->entry_timeout, double,                          cleanup_exit); -        GF_OPTION_INIT ("negative-timeout", priv->negative_timeout, double, +        GF_OPTION_INIT (ZR_NEGATIVE_TIMEOUT_OPT, priv->negative_timeout, double,                          cleanup_exit);          GF_OPTION_INIT ("client-pid", priv->client_pid, int32, cleanup_exit); diff --git a/xlators/mount/fuse/src/fuse-helpers.c b/xlators/mount/fuse/src/fuse-helpers.c index 2774bdaa812..0936d63111a 100644 --- a/xlators/mount/fuse/src/fuse-helpers.c +++ b/xlators/mount/fuse/src/fuse-helpers.c @@ -235,7 +235,7 @@ out:          if (sysctl(name, namelen, &kp, &kplen, NULL, 0) != 0)                  return; -        ngroups = MIN(kp.kp_eproc.e_ucred.cr_ngroups, GF_MAX_AUX_GROUPS); +        ngroups = MIN(kp.kp_eproc.e_ucred.cr_ngroups, NGROUPS_MAX);  	if (call_stack_alloc_groups (frame->root, ngroups) != 0)  		return;          for (i = 0; i < ngroups; i++) diff --git a/xlators/mount/fuse/utils/mount_glusterfs.in b/xlators/mount/fuse/utils/mount_glusterfs.in index b12b4e04e78..539b0f558c2 100755 --- a/xlators/mount/fuse/utils/mount_glusterfs.in +++ b/xlators/mount/fuse/utils/mount_glusterfs.in @@ -1,188 +1,538 @@  #!/bin/sh -# (C) 2008 Gluster Inc. <http://www.gluster.com> -#  +# (C) 2014 Red Hat Inc. <http://www.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 2 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, write to the Free  # Software Foundation, Inc., 51 Franklin Street, Fifth Floor,  # Boston, MA 02110-1301 USA +warn () +{ +   echo "$@" >/dev/stderr +}  _init ()  { +      # log level definitions      LOG_NONE=NONE;      LOG_CRITICAL=CRITICAL;      LOG_ERROR=ERROR;      LOG_WARNING=WARNING; -    LOG_INFO=INFO; +    LOG_INFO=INFO      LOG_DEBUG=DEBUG; +    LOG_TRACE=TRACE; -    # set default log level to ERROR -    log_level=$LOG_INFO; -} +    HOST_NAME_MAX=64; -start_glusterfs () -{      prefix="@prefix@";      exec_prefix=@exec_prefix@;      cmd_line=$(echo "@sbindir@/glusterfs"); -     + +    alias lsL='ls -L' +    uname_s=`uname -s` +    case ${uname_s} in +        Darwin) +            getinode="stat -f %i" +            getdev="stat -f %d" +            ;; +    esac +} + +is_valid_hostname () +{ +    local server=$1 + +    length=$(echo $server | wc -c) +    if [ ${length} -gt ${HOST_NAME_MAX} ]; then +        return 1 +    fi +} + +parse_backup_volfile_servers () +{ +    local server_list=$1 +    local servers="" +    local new_servers="" + +    servers=$(echo ${server_list} | sed 's/\:/ /g') +    for server in ${servers}; do +        is_valid_hostname ${server} +        if [ $? -eq 1 ]; then +            continue +        fi +        new_servers=$(echo "${new_servers} ${server}") +    done + +    echo ${new_servers} +} + +parse_volfile_servers () +{ +    local server_list=$1 +    local servers="" +    local new_servers="" + +    servers=$(echo ${server_list} | sed 's/,/ /g') +    for server in ${servers}; do +        is_valid_hostname ${server} +        if [ $? -eq 1 ]; then +            continue +        fi +        new_servers=$(echo "${new_servers} ${server}") +    done + +    echo ${new_servers} +} + +start_glusterfs () +{      if [ -n "$log_level_str" ]; then -	case "$log_level_str" in -	    "ERROR") -		log_level=$LOG_ERROR; -		;; +        case "$( echo $log_level_str | awk '{print toupper($0)}')" in +            "ERROR") +                log_level=$LOG_ERROR; +                ;;              "INFO")                  log_level=$LOG_INFO;                  ;; -	    "DEBUG") -		log_level=$LOG_DEBUG; -		;; -	    "CRITICAL") -		log_level=$LOG_CRITICAL; -		;; -	    "WARNING") -		log_level=$LOG_WARNING; -		;; -	    "NONE") -		log_level=$LOG_NONE; -		;; -	    *) -		echo "invalid log level $log_level_str, using INFO"; -		log_level=$LOG_INFO; -		;; -	esac -    fi -    cmd_line=$(echo "$cmd_line --log-level=$log_level"); -     -    if [ -n "$log_file" ]; then -	cmd_line=$(echo "$cmd_line --log-file=$log_file"); +            "DEBUG") +                log_level=$LOG_DEBUG; +                ;; +            "CRITICAL") +                log_level=$LOG_CRITICAL; +                ;; +            "WARNING") +                log_level=$LOG_WARNING; +                ;; +            "TRACE") +                log_level=$LOG_TRACE; +                ;; +            "NONE") +                log_level=$LOG_NONE; +                ;; +            *) +                warn "invalid log level $log_level_str, using INFO"; +                log_level=$LOG_INFO; +                ;; +        esac +    fi + +    # options without values start here +    if [ -n "$read_only" ]; then +        cmd_line=$(echo "$cmd_line --read-only"); +    fi + +    if [ -n "$acl" ]; then +        cmd_line=$(echo "$cmd_line --acl"); +    fi + +    if [ -n "$selinux" ]; then +         cmd_line=$(echo "$cmd_line --selinux"); +    fi + +    if [ -n "$enable_ino32" ]; then +        cmd_line=$(echo "$cmd_line --enable-ino32"); +    fi + +    if [ -n "$worm" ]; then +        cmd_line=$(echo "$cmd_line --worm"); +    fi +    if [ -n "$volfile_max_fetch_attempts" ]; then +       cmd_line=$(echo "$cmd_line --volfile-max-fetch-attempts=$volfile_max_fetch_attempts") +    fi + +    if [ -n "$fopen_keep_cache" ]; then +        cmd_line=$(echo "$cmd_line --fopen-keep-cache");      fi      if [ -n "$volfile_check" ]; then -	cmd_line=$(echo "$cmd_line --volfile-check"); +        cmd_line=$(echo "$cmd_line --volfile-check"); +    fi + +    if [ -n "$mem_accounting" ]; then +        cmd_line=$(echo "$cmd_line --mem-accounting"); +    fi + +    if [ -n "$aux_gfid_mount" ]; then +        cmd_line=$(echo "$cmd_line --aux-gfid-mount"); +    fi + +    if [ -n "$no_root_squash" ]; then +        cmd_line=$(echo "$cmd_line --no-root-squash"); +    fi + +#options with values start here +    if [ -n "$log_level" ]; then +        cmd_line=$(echo "$cmd_line --log-level=$log_level"); +    fi + +    if [ -n "$log_file" ]; then +        cmd_line=$(echo "$cmd_line --log-file=$log_file");      fi      if [ -n "$direct_io_mode" ]; then -	cmd_line=$(echo "$cmd_line --disable-direct-io-mode"); +        cmd_line=$(echo "$cmd_line --direct-io-mode=$direct_io_mode");      fi -     -    if [ -z "$volfile_loc" ]; then -	if [ -n "$transport" ]; then  -	    cmd_line=$(echo "$cmd_line \ ---volfile-server=$server_ip \ ---volfile-server-transport=$transport"); -	else -	    cmd_line=$(echo "$cmd_line \ ---volfile-server=$server_ip"); -	fi -    else -	cmd_line=$(echo "$cmd_line --volfile=$volfile_loc"); + +    if [ -n "$mac_compat" ]; then +        cmd_line=$(echo "$cmd_line --mac-compat=$mac_compat"); +    fi + +    if [ -n "$use_readdirp" ]; then +        cmd_line=$(echo "$cmd_line --use-readdirp=$use_readdirp");      fi      if [ -n "$volume_name" ]; then          cmd_line=$(echo "$cmd_line --volume-name=$volume_name");      fi -     -    if [ -n "$volume_id" ]; then -        cmd_line=$(echo "$cmd_line --volfile-id=$volume_id"); + +    if [ -n "$attribute_timeout" ]; then +        cmd_line=$(echo "$cmd_line --attribute-timeout=$attribute_timeout"); +    fi + +    if [ -n "$entry_timeout" ]; then +        cmd_line=$(echo "$cmd_line --entry-timeout=$entry_timeout"); +    fi + +    if [ -n "$negative_timeout" ]; then +        cmd_line=$(echo "$cmd_line --negative-timeout=$negative_timeout"); +    fi + +    if [ -n "$gid_timeout" ]; then +        cmd_line=$(echo "$cmd_line --gid-timeout=$gid_timeout"); +    fi + +    if [ -n "$bg_qlen" ]; then +        cmd_line=$(echo "$cmd_line --background-qlen=$bg_qlen"); +    fi + +    if [ -n "$cong_threshold" ]; then +        cmd_line=$(echo "$cmd_line --congestion-threshold=$cong_threshold"); +    fi + +    if [ -n "$fuse_mountopts" ]; then +        cmd_line=$(echo "$cmd_line --fuse-mountopts=$fuse_mountopts"); +    fi + +    if [ -n "$xlator_option" ]; then +        cmd_line=$(echo "$cmd_line --xlator-option=$xlator_option"); +    fi + +    # for rdma volume, we have to fetch volfile with '.rdma' added +    # to volume name, so that it fetches the right client vol file +    volume_id_rdma=""; + +    if [ -z "$volfile_loc" ]; then +        if  [ -n "$server_ip" ]; then + +            servers=$(parse_volfile_servers ${server_ip}); +            if [ -n "$servers" ]; then +                for i in $(echo ${servers}); do +                    cmd_line=$(echo "$cmd_line --volfile-server=$i"); +                done +            else +                warn "ERROR: No valid servers found on command line.. exiting" +                print_usage +                exit 1 +            fi + +            if [ -n "$backupvolfile_server" ]; then +                if [ -z "$backup_volfile_servers" ]; then +                    is_valid_hostname ${backupvolfile_server}; +                    if [ $? -eq 1 ]; then +                        warn "ERROR: Invalid backup server specified.. exiting" +                        exit 1 +                    fi +                    cmd_line=$(echo "$cmd_line --volfile-server=$backupvolfile_server"); +                fi +            fi + +            if [ -n "$backup_volfile_servers" ]; then +                backup_servers=$(parse_backup_volfile_servers ${backup_volfile_servers}) +                for i in $(echo ${backup_servers}); do +                    cmd_line=$(echo "$cmd_line --volfile-server=$i"); +                done +            fi + +            if [ -n "$server_port" ]; then +                cmd_line=$(echo "$cmd_line --volfile-server-port=$server_port"); +            fi + +            if [ -n "$transport" ]; then +                cmd_line=$(echo "$cmd_line --volfile-server-transport=$transport"); +                if [ "$transport" = "rdma" ]; then +                    volume_id_rdma=".rdma"; +                fi +            fi + +            if [ -n "$volume_id" ]; then +                if [ -n "$volume_id_rdma" ]; then +                    volume_id="$volume_id$volume_id_rdma"; +                fi +                cmd_line=$(echo "$cmd_line --volfile-id=$volume_id"); +            fi +        fi +    else +        cmd_line=$(echo "$cmd_line --volfile=$volfile_loc"); +    fi + +    if [ -n "$fuse_mountopts" ]; then +        cmd_line=$(echo "$cmd_line --fuse-mountopts=$fuse_mountopts");      fi      cmd_line=$(echo "$cmd_line $mount_point"); -    exec $cmd_line; +    $cmd_line; + +    if [ $? -ne 0 ]; then +        exit 1; +    fi  } +print_usage () +{ +cat << EOF >/dev/stderr +Usage: $0 <volumeserver>:<volumeid/volumeport> -o<options> <mountpoint> +Options: +man 8 $0 +To display the version number of the mount helper: $0 -V +EOF +} -main () +with_options()  { -     -    new_log_level="" -    log_file="" -    transport="" -    direct_io_mode="" -    volume_name="" -    new_fs_options="" -    volfile_check="" - -    while getopts o: opt; do -	case "$opt" in -	    o)  -		options=$(echo $OPTARG | sed -n 's/.*\-o[ ]*\([^ ]*\).*/\1/p'); -		[ -z $new_log_level ] && { -		    new_log_level=$(echo "$options" | sed -n 's/.*log-level=\([^,]*\).*/\1/p'); -		} -		 -		[ -z $log_file ] && { -		    log_file=$(echo "$options" | sed -n 's/.*log-file=\([^,]*\).*/\1/p'); -		} -		 -		[ -z $transport ] && { -		    transport=$(echo "$options" | sed -n 's/.*transport=\([^,]*\).*/\1/p'); -		} -		 -		[ -z $direct_io_mode ] && { -		    direct_io_mode=$(echo "$options" | sed -n 's/.*direct-io-mode=\([^,]*\).*/\1/p'); -		} -		 -		[ -z $volfile_check ] && { -		    volfile_check=$(echo "$options" | sed -n 's/.*volfile-check=\([^,]*\).*/\1/p'); -		} -		 -		[ -z $volume_name ] && { -		    volume_name=$(echo "$options" | sed -n 's/.*volume-name=\([^,]*\).*/\1/p'); -		} - -		[ -z $volume_id ] && { -		    volume_id=$(echo "$options" | sed -n 's/.*volume-id=\([^,]*\).*/\1/p'); -		} - -		this_option=$(echo "$options" | sed -e 's/[,]*log-file=[^,]*//' \ -		    -e 's/[,]*log-level=[^,]*//' \ -		    -e 's/[,]*volume-name=[^,]*//' \ -		    -e 's/[,]*volfile-check=[^,]*//' \ -		    -e 's/[,]*direct-io-mode=[^,]*//' \ -		    -e 's/[,]*transport=[^,]*//' \ -		    -e 's/[,]*volume-id=[^,]*//'); -		new_fs_options="$new_fs_options $this_option";		 -		;; -	esac +    local key=$1 +    local value=$2 + +    # Handle options with values. +    case "$key" in +        "log-level") +            log_level_str=$value +            ;; +        "log-file") +            log_file=$value +            ;; +        "transport") +            transport=$value +            ;; +        "direct-io-mode") +            direct_io_mode=$value +            ;; +        "mac-compat") +            mac_compat=$value +            ;; +        "volume-name") +            volume_name=$value +            ;; +        "volume-id") +            volume_id=$value +            ;; +        "volfile-check") +            volfile_check=$value +            ;; +        "server-port") +            server_port=$value +            ;; +        "attribute-timeout") +            attribute_timeout=$value +            ;; +        "entry-timeout") +            entry_timeout=$value +            ;; +        "negative-timeout") +            negative_timeout=$value +            ;; +        "gid-timeout") +            gid_timeout=$value +            ;; +        "background-qlen") +            bg_qlen=$value +            ;; +        "backup-volfile-servers") +            backup_volfile_servers=$value +            ;; +        "backupvolfile-server") +            backupvolfile_server=$value +            ;; +        "fetch-attempts") +            volfile_max_fetch_attempts=$value +            ;; +        "congestion-threshold") +            cong_threshold=$value +            ;; +        "xlator-option") +            xlator_option=$value +            ;; +        "fuse-mountopts") +            fuse_mountopts=$value +            ;; +        "use-readdirp") +            use_readdirp=$value +            ;; +        "no-root-squash") +            if [ $value == "yes" ] || +                [ $value == "on" ] || +                [ $value == "enable" ] || +                [ $value == "true" ] ; then +                no_root_squash=1; +            fi ;; +        "root-squash") +            if [ $value == "no" ] || +                [ $value == "off" ] || +                [ $value == "disable" ] || +                [ $value == "false" ] ; then +                no_root_squash=1; +            fi ;; +        *) +            warn "Invalid option: $key" +            exit 1 +            ;; +    esac +} + +without_options() +{ +    local option=$1 +    # Handle options without values. +    case "$option" in +        "ro") +            read_only=1 +            ;; +        "acl") +            acl=1 +            ;; +        "selinux") +            selinux=1 +            ;; +        "worm") +            worm=1 +            ;; +        "fopen-keep-cache") +            fopen_keep_cache=1 +            ;; +        "enable-ino32") +            enable_ino32=1 +            ;; +        "mem-accounting") +            mem_accounting=1 +            ;; +        "aux-gfid-mount") +            if [ ${uname_s} = "Linux" ]; then +                aux_gfid_mount=1 +            fi +            ;; +         # "mount -t glusterfs" sends this, but it's useless. +        "rw") +            ;; +         # these ones are interpreted during system initialization +        "noauto") +            ;; +        "_netdev") +            ;; +        *) +            warn "Invalid option $option"; +            exit 1 +            ;; +    esac +} + +parse_options() +{ +    local optarg=${1} +    for pair in $(echo ${optarg//,/ }); do +        key=$(echo "$pair" | cut -f1 -d'='); +        value=$(echo "$pair" | cut -f2- -d'='); +        if [ "$key" = "$value" ]; then +            without_options $pair; +        else +            with_options $key $value; +        fi      done +} -    [ -n "$new_log_level" ] && { -	log_level_str="$new_log_level"; -    } +main () +{ +    ## `mount` on OSX specifies options as first argument +    if [[ $1 =~ "-o" ]]; then +        volfile_loc=$3 +        mount_point=$4 +    else +        volfile_loc=$1 +        mount_point=$2 +    fi -    # TODO: use getopt. This is very much darwin specific -    volfile_loc="$1"; -    while [ "$volfile_loc" = "-o" ] ; do -	shift ; -	shift ; -	volfile_loc="$1"; +    while getopts "Vo:h" opt; do +        case "${opt}" in +            o) +                parse_options ${OPTARG}; +                ;; +            V) +                ${cmd_line} -V; +                exit 0; +                ;; +            h) +                print_usage; +                exit 0; +                ;; +            ?) +                print_usage; +                exit 0; +                ;; +        esac      done -     +      [ -r "$volfile_loc" ] || {          server_ip=$(echo "$volfile_loc" | sed -n 's/\([a-zA-Z0-9:.\-]*\):.*/\1/p'); -        volume_id=$(echo "$volfile_loc" | sed -n 's/[a-zA-Z0-9:.\-]*:\(.*\)/\1/p'); -	volfile_loc=""; +        volume_str=$(echo "$volfile_loc" | sed -n 's/.*:\([^ ]*\).*/\1/p'); +        [ -n "$volume_str" ] && { +            volume_id="$volume_str"; +        } +        volfile_loc=""; +    } + +    [ -z "$volume_id" -o -z "$server_ip" ] && { +        cat <<EOF >/dev/stderr +ERROR: Server name/volume name unspecified cannot proceed further.. +Please specify correct format +Usage: +man 8 $0 +EOF +        exit 1; +    } + +    grep_ret=$(echo ${mount_point} | grep '^\-o'); +    [ "x" != "x${grep_ret}" ] && { +        cat <<EOF >/dev/stderr +ERROR: -o options cannot be specified in either first two arguments.. +Please specify correct style +Usage: +man 8 $0 +EOF +        exit 1; +    } + +    # No need to do a ! -d test, it is taken care while initializing the +    # variable mount_point +    [ -z "$mount_point" -o ! -d "$mount_point" ] && { +        cat <<EOF >/dev/stderr +ERROR: Mount point does not exist +Please specify a mount point +Usage: +man 8 $0 +EOF +        exit 1;      } -    # following line is product of love towards sed -    # $2=$(echo "$@" | sed -n 's/[^ ]* \([^ ]*\).*/\1/p'); -     -    mount_point="$2"; -    fs_options=$(echo "$fs_options,$new_fs_options"); -          start_glusterfs;  } diff --git a/xlators/nfs/server/src/nfs-fops.c b/xlators/nfs/server/src/nfs-fops.c index b91f73a5378..56d4cba47c6 100644 --- a/xlators/nfs/server/src/nfs-fops.c +++ b/xlators/nfs/server/src/nfs-fops.c @@ -38,20 +38,25 @@ nfs_fix_groups (xlator_t *this, call_stack_t *root)          struct passwd    mypw;          char             mystrs[1024];          struct passwd    *result; +#ifdef GF_DARWIN_HOST_OS +        /* BSD/DARWIN does not correctly uses gid_t in getgrouplist */ +        int              mygroups[GF_MAX_AUX_GROUPS]; +#else          gid_t            mygroups[GF_MAX_AUX_GROUPS]; +#endif          int              ngroups;          int              i;          int              max_groups;          struct nfs_state *priv = this->private;          const gid_list_t *agl; -	gid_list_t gl; +        gid_list_t gl;          if (!priv->server_aux_gids) {                  return;          } -	/* RPC enforces the GF_AUTH_GLUSTERFS_MAX_GROUPS limit */ -	max_groups = GF_AUTH_GLUSTERFS_MAX_GROUPS(root->lk_owner.len); +        /* RPC enforces the GF_AUTH_GLUSTERFS_MAX_GROUPS limit */ +        max_groups = GF_AUTH_GLUSTERFS_MAX_GROUPS(root->lk_owner.len);  	agl = gid_cache_lookup(&priv->gid_cache, root->uid, 0, 0);  	if (agl) { diff --git a/xlators/nfs/server/src/nfs.c b/xlators/nfs/server/src/nfs.c index d962663bafa..918e8631255 100644 --- a/xlators/nfs/server/src/nfs.c +++ b/xlators/nfs/server/src/nfs.c @@ -35,12 +35,16 @@  #include "options.h"  #include "acl3.h"  #include "rpc-drc.h" +#include "syscall.h"  #define STRINGIFY(val) #val  #define TOSTRING(val) STRINGIFY(val)  #define OPT_SERVER_AUX_GIDS             "nfs.server-aux-gids"  #define OPT_SERVER_GID_CACHE_TIMEOUT    "nfs.server.aux-gid-timeout" +#define OPT_SERVER_RPC_STATD             "nfs.rpc-statd" +#define OPT_SERVER_RPC_STATD_PIDFILE     "nfs.rpc-statd-pidfile" +#define OPT_SERVER_RPC_STATD_NOTIFY_PIDFILE "nfs.rpc-statd-notify-pidfile"  /* TODO: DATADIR should be based on configure's $(localstatedir) */  #define DATADIR                         "/var/lib/glusterd" @@ -942,10 +946,14 @@ nfs_init_state (xlator_t *this)                          goto free_foppool;                  }          } +	GF_OPTION_INIT (OPT_SERVER_RPC_STATD, nfs->rpc_statd, path, free_foppool); + +	GF_OPTION_INIT (OPT_SERVER_RPC_STATD_PIDFILE, nfs->rpc_statd_pid_file, path, free_foppool);          GF_OPTION_INIT (OPT_SERVER_AUX_GIDS, nfs->server_aux_gids,                          bool, free_foppool); -        GF_OPTION_INIT (OPT_SERVER_GID_CACHE_TIMEOUT, nfs->server_aux_gids_max_age, +        GF_OPTION_INIT (OPT_SERVER_GID_CACHE_TIMEOUT, +                        nfs->server_aux_gids_max_age,                          uint32, free_foppool);          if (gid_cache_init(&nfs->gid_cache, nfs->server_aux_gids_max_age) < 0) { @@ -953,9 +961,17 @@ nfs_init_state (xlator_t *this)                  goto free_foppool;          } -        if (stat("/sbin/rpc.statd", &stbuf) == -1) { -                gf_log (GF_NFS, GF_LOG_WARNING, "/sbin/rpc.statd not found. " -                        "Disabling NLM"); +        ret = sys_access (nfs->rpc_statd, X_OK); +        if (ret) { +                gf_log (GF_NFS, GF_LOG_WARNING, "%s not enough permissions to" +                        " access. Disabling NLM", nfs->rpc_statd); +                nfs->enable_nlm = _gf_false; +        } + +        ret = sys_stat (nfs->rpc_statd, &stbuf); +        if (ret || !S_ISREG (stbuf.st_mode)) { +                gf_log (GF_NFS, GF_LOG_WARNING, "%s not a regular file." +                        " Disabling NLM", nfs->rpc_statd);                  nfs->enable_nlm = _gf_false;          } @@ -968,8 +984,8 @@ nfs_init_state (xlator_t *this)          }          ret = rpcsvc_set_outstanding_rpc_limit (nfs->rpcsvc, -                                  this->options, -                                  RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT); +                                                this->options, +                                                RPCSVC_DEF_NFS_OUTSTANDING_RPC_LIMIT);          if (ret < 0) {                  gf_log (GF_NFS, GF_LOG_ERROR,                          "Failed to configure outstanding-rpc-limit"); @@ -1023,7 +1039,8 @@ nfs_reconfigure_state (xlator_t *this, dict_t *options)  {          int                 ret = 0;          int                 keyindx = 0; -        char                *optstr = NULL; +        char                *rmtab = NULL; +        char                *rpc_statd = NULL;          gf_boolean_t        optbool;          uint32_t            optuint32;          struct nfs_state    *nfs = NULL; @@ -1068,19 +1085,36 @@ nfs_reconfigure_state (xlator_t *this, dict_t *options)                  goto out;          } +        /* reconfig nfs.rpc-statd...  */ +        rpc_statd = GF_RPC_STATD_PROG; +        if (dict_get (options, OPT_SERVER_RPC_STATD_PIDFILE)) { +                ret = dict_get_str (options, "nfs.rpc-statd", &rpc_statd); +                if (ret < 0) { +                        gf_log (GF_NFS, GF_LOG_ERROR, "Failed to read " +                                "reconfigured option: nfs.rpc-statd"); +                        goto out; +                } +        } + +        if (strcmp(nfs->rpc_statd, rpc_statd) != 0) { +                gf_log (GF_NFS, GF_LOG_INFO, +                        "Reconfiguring nfs.rpc-statd needs NFS restart"); +                goto out; +        } +          /* reconfig nfs.mount-rmtab */ -        optstr = NFS_DATADIR "/rmtab"; +        rmtab = NFS_DATADIR "/rmtab";          if (dict_get (options, "nfs.mount-rmtab")) { -                ret = dict_get_str (options, "nfs.mount-rmtab", &optstr); +                ret = dict_get_str (options, "nfs.mount-rmtab", &rmtab);                  if (ret < 0) {                          gf_log (GF_NFS, GF_LOG_ERROR, "Failed to read "                                  "reconfigured option: nfs.mount-rmtab");                          goto out;                  } -                gf_path_strip_trailing_slashes (optstr); +                gf_path_strip_trailing_slashes (rmtab);          } -        if (strcmp (nfs->rmtab, optstr) != 0) { -                mount_rewrite_rmtab (nfs->mstate, optstr); +        if (strcmp (nfs->rmtab, rmtab) != 0) { +                mount_rewrite_rmtab (nfs->mstate, rmtab);                  gf_log (GF_NFS, GF_LOG_INFO,                                  "Reconfigured nfs.mount-rmtab path: %s",                                  nfs->rmtab); @@ -1819,6 +1853,18 @@ struct volume_options options[] = {                           "storage, all GlusterFS servers will update and "                           "output (with 'showmount') the same list."          }, +        { .key = {OPT_SERVER_RPC_STATD}, +          .type = GF_OPTION_TYPE_PATH, +          .default_value = GF_RPC_STATD_PROG, +          .description = "The executable of RPC statd utility. " +                         "Defaults to " GF_RPC_STATD_PROG +        }, +        { .key = {OPT_SERVER_RPC_STATD_PIDFILE}, +          .type = GF_OPTION_TYPE_PATH, +          .default_value = GF_RPC_STATD_PIDFILE, +          .description = "The pid file of RPC statd utility. " +                         "Defaults to " GF_RPC_STATD_PIDFILE +        },          { .key = {OPT_SERVER_AUX_GIDS},            .type = GF_OPTION_TYPE_BOOL,            .default_value = "off", diff --git a/xlators/nfs/server/src/nfs.h b/xlators/nfs/server/src/nfs.h index 00c7f80469c..fc745fbbdc4 100644 --- a/xlators/nfs/server/src/nfs.h +++ b/xlators/nfs/server/src/nfs.h @@ -86,6 +86,8 @@ struct nfs_state {  	gid_cache_t		gid_cache;          uint32_t                generation;          gf_boolean_t            register_portmap; +        char                    *rpc_statd; +        char                    *rpc_statd_pid_file;  };  struct nfs_inode_ctx { diff --git a/xlators/nfs/server/src/nfs3-helpers.c b/xlators/nfs/server/src/nfs3-helpers.c index 9059fc341d9..f67cccf1a9b 100644 --- a/xlators/nfs/server/src/nfs3-helpers.c +++ b/xlators/nfs/server/src/nfs3-helpers.c @@ -85,7 +85,7 @@ struct nfs3stat_strerror nfs3stat_strerror_table[] = {          { NFS3ERR_SERVERFAULT,  "Error occurred on the server or IO Error" },          { NFS3ERR_BADTYPE,      "Type not supported by the server"      },          { NFS3ERR_JUKEBOX,      "Cannot complete server initiated request" }, -        { -1,                   "IO Error"                              }, +        { NFS3ERR_END_OF_LIST,  "IO Error"                              },  }; @@ -543,7 +543,7 @@ char *  nfsstat3_strerror(int stat)  {          int i; -        for(i = 0; nfs3stat_strerror_table[i].stat != -1; i++) { +        for(i = 0; nfs3stat_strerror_table[i].stat != NFS3ERR_END_OF_LIST ; i++) {                  if (nfs3stat_strerror_table[i].stat == stat)                          return nfs3stat_strerror_table[i].strerror;          } diff --git a/xlators/nfs/server/src/nfs3.c b/xlators/nfs/server/src/nfs3.c index 0fea135c784..6361f9e20aa 100644 --- a/xlators/nfs/server/src/nfs3.c +++ b/xlators/nfs/server/src/nfs3.c @@ -5186,7 +5186,7 @@ nfs3_init_options (struct nfs3_state *nfs3, dict_t *options)                          goto err;                  } -                ret = gf_string2bytesize (optstr, &size64); +                ret = gf_string2uint64 (optstr, &size64);                  if (ret == -1) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to format"                                  " option: nfs3.read-size"); @@ -5209,7 +5209,7 @@ nfs3_init_options (struct nfs3_state *nfs3, dict_t *options)                          goto err;                  } -                ret = gf_string2bytesize (optstr, &size64); +                ret = gf_string2uint64 (optstr, &size64);                  if (ret == -1) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to format"                                  " option: nfs3.write-size"); @@ -5232,7 +5232,7 @@ nfs3_init_options (struct nfs3_state *nfs3, dict_t *options)                          goto err;                  } -                ret = gf_string2bytesize (optstr, &size64); +                ret = gf_string2uint64 (optstr, &size64);                  if (ret == -1) {                          gf_log (GF_NFS3, GF_LOG_ERROR, "Failed to format"                                  " option: nfs3.readdir-size"); diff --git a/xlators/nfs/server/src/nlm4.c b/xlators/nfs/server/src/nlm4.c index c186537ea0c..d0caa97c287 100644 --- a/xlators/nfs/server/src/nlm4.c +++ b/xlators/nfs/server/src/nlm4.c @@ -2423,9 +2423,21 @@ nlm4svc_init(xlator_t *nfsx)          /* unlink sm-notify.pid so that when we restart rpc.statd/sm-notify           * it thinks that the machine has restarted and sends NOTIFY to clients.           */ -        ret = unlink ("/var/run/sm-notify.pid"); + +        /* TODO: +           notify/rpc.statd is done differently on OSX + +           On OSX rpc.statd is controlled by rpc.lockd and are part for launchd +           (unified service management framework) + +           A runcmd() should be invoking "launchctl start com.apple.lockd" +           instead. This is still a theory but we need to thoroughly test it +           out. Until then NLM support is non-existent on OSX. +        */ +        ret = unlink (GF_SM_NOTIFY_PIDFILE);          if (ret == -1 && errno != ENOENT) { -                gf_log (GF_NLM, GF_LOG_ERROR, "unable to unlink sm-notify"); +                gf_log (GF_NLM, GF_LOG_ERROR, "unable to unlink %s: %d", +                        GF_SM_NOTIFY_PIDFILE, errno);                  goto err;          }          /* temporary work around to restart statd, not distro/OS independant. @@ -2433,37 +2445,43 @@ nlm4svc_init(xlator_t *nfsx)           * killall will cause problems on solaris.           */ -        pidfile = fopen ("/var/run/rpc.statd.pid", "r"); +        char *pid_file = GF_RPC_STATD_PIDFILE; +        if (nfs->rpc_statd_pid_file) +                pid_file = nfs->rpc_statd_pid_file; +        pidfile = fopen (pid_file, "r");          if (pidfile) {                  ret = fscanf (pidfile, "%d", &pid);                  if (ret <= 0) {                          gf_log (GF_NLM, GF_LOG_WARNING, "unable to get pid of " -                                "rpc.statd"); +                                "rpc.statd from %s ", GF_RPC_STATD_PIDFILE);                          ret = runcmd ("killall", "-9", "rpc.statd", NULL);                  } else                          kill (pid, SIGKILL);                  fclose (pidfile);          } else { -                gf_log (GF_NLM, GF_LOG_WARNING, "opening the pid file of " -                        "rpc.statd failed (%s)", strerror (errno)); +                gf_log (GF_NLM, GF_LOG_WARNING, "opening %s of " +                        "rpc.statd failed (%s)", pid_file, strerror (errno));                  /* if ret == -1, do nothing - case either statd was not                   * running or was running in valgrind mode                   */                  ret = runcmd ("killall", "-9", "rpc.statd", NULL);          } -        ret = unlink ("/var/run/rpc.statd.pid"); +        ret = unlink (GF_RPC_STATD_PIDFILE);          if (ret == -1 && errno != ENOENT) { -                gf_log (GF_NLM, GF_LOG_ERROR, "unable to unlink rpc.statd"); +                gf_log (GF_NLM, GF_LOG_ERROR, "unable to unlink %s", pid_file);                  goto err;          } -        ret = runcmd ("/sbin/rpc.statd", NULL); +        ret = runcmd (nfs->rpc_statd, NULL);          if (ret == -1) { -                gf_log (GF_NLM, GF_LOG_ERROR, "unable to start rpc.statd"); +                gf_log (GF_NLM, GF_LOG_ERROR, "unable to start %s", +                        nfs->rpc_statd);                  goto err;          } + +          pthread_create (&thr, NULL, nsm_thread, (void*)NULL);          timeout.tv_sec = nlm_grace_period; diff --git a/xlators/nfs/server/src/nlm4.h b/xlators/nfs/server/src/nlm4.h index 9b5d5408184..5b629611088 100644 --- a/xlators/nfs/server/src/nlm4.h +++ b/xlators/nfs/server/src/nlm4.h @@ -34,6 +34,15 @@  /* Registered with portmap */  #define GF_NLM4_PORT            38468  #define GF_NLM                  GF_NFS"-NLM" +#ifdef GF_DARWIN_HOST_OS +#define GF_RPC_STATD_PROG       "/usr/sbin/rpc.statd" +#define GF_RPC_STATD_PIDFILE    "/var/run/statd.pid" +#define GF_SM_NOTIFY_PIDFILE    "/var/run/statd.notify.pid" +#else +#define GF_RPC_STATD_PROG       "/sbin/rpc.stat" +#define GF_RPC_STATD_PIDFILE    "/var/run/rpc.statd.pid" +#define GF_SM_NOTIFY_PIDFILE    "/var/run/sm-notify.pid" +#endif  extern rpcsvc_program_t *  nlm4svc_init (xlator_t *nfsx); diff --git a/xlators/performance/io-cache/src/io-cache.c b/xlators/performance/io-cache/src/io-cache.c index 8febfc8fbd5..facff5038a7 100644 --- a/xlators/performance/io-cache/src/io-cache.c +++ b/xlators/performance/io-cache/src/io-cache.c @@ -41,6 +41,9 @@ ioc_hashfn (void *data, int len)          return (offset >> ioc_log2_page_size);  } +/* TODO: This function is not used, uncomment when we find a +         usage for this function. +  static inline ioc_inode_t *  ioc_inode_reupdate (ioc_inode_t *ioc_inode)  { @@ -54,6 +57,7 @@ ioc_inode_reupdate (ioc_inode_t *ioc_inode)          return ioc_inode;  } +  static inline ioc_inode_t *  ioc_get_inode (dict_t *dict, char *name)  { @@ -77,6 +81,7 @@ ioc_get_inode (dict_t *dict, char *name)          return ioc_inode;  } +*/  int32_t  ioc_inode_need_revalidate (ioc_inode_t *ioc_inode) @@ -1663,12 +1668,12 @@ reconfigure (xlator_t *this, dict_t *options)                  }                  GF_OPTION_RECONF ("max-file-size", table->max_file_size, -                                  options, size, unlock); +                                  options, size_uint64, unlock);                  GF_OPTION_RECONF ("min-file-size", table->min_file_size, -                                  options, size, unlock); +                                  options, size_uint64, unlock); -                if ((table->max_file_size >= 0) && +                if ((table->max_file_size <= UINT64_MAX) &&                      (table->min_file_size > table->max_file_size)) {                          gf_log (this->name, GF_LOG_ERROR, "minimum size (%"                                  PRIu64") of a file that can be cached is " @@ -1679,7 +1684,7 @@ reconfigure (xlator_t *this, dict_t *options)                  }                  GF_OPTION_RECONF ("cache-size", cache_size_new, -                                  options, size, unlock); +                                  options, size_uint64, unlock);                  if (!check_cache_size_ok (this, cache_size_new)) {                          ret = -1;                          gf_log (this->name, GF_LOG_ERROR, @@ -1736,13 +1741,13 @@ init (xlator_t *this)          table->xl = this;          table->page_size = this->ctx->page_size; -        GF_OPTION_INIT ("cache-size", table->cache_size, size, out); +        GF_OPTION_INIT ("cache-size", table->cache_size, size_uint64, out);          GF_OPTION_INIT ("cache-timeout", table->cache_timeout, int32, out); -        GF_OPTION_INIT ("min-file-size", table->min_file_size, size, out); +        GF_OPTION_INIT ("min-file-size", table->min_file_size, size_uint64, out); -        GF_OPTION_INIT ("max-file-size", table->max_file_size, size, out); +        GF_OPTION_INIT ("max-file-size", table->max_file_size, size_uint64, out);          if  (!check_cache_size_ok (this, table->cache_size)) {                  ret = -1; @@ -1768,7 +1773,7 @@ init (xlator_t *this)          INIT_LIST_HEAD (&table->inodes); -        if ((table->max_file_size >= 0) +        if ((table->max_file_size <= UINT64_MAX)              && (table->min_file_size > table->max_file_size)) {                  gf_log ("io-cache", GF_LOG_ERROR, "minimum size (%"                          PRIu64") of a file that can be cached is " diff --git a/xlators/performance/quick-read/src/quick-read.c b/xlators/performance/quick-read/src/quick-read.c index 402da886fb6..b8b4c532674 100644 --- a/xlators/performance/quick-read/src/quick-read.c +++ b/xlators/performance/quick-read/src/quick-read.c @@ -854,7 +854,7 @@ reconfigure (xlator_t *this, dict_t *options)          GF_OPTION_RECONF ("cache-timeout", conf->cache_timeout, options, int32,                            out); -        GF_OPTION_RECONF ("cache-size", cache_size_new, options, size, out); +        GF_OPTION_RECONF ("cache-size", cache_size_new, options, size_uint64, out);          if (!check_cache_size_ok (this, cache_size_new)) {                  ret = -1;                  gf_log (this->name, GF_LOG_ERROR, @@ -995,11 +995,11 @@ init (xlator_t *this)          LOCK_INIT (&priv->table.lock);          conf = &priv->conf; -        GF_OPTION_INIT ("max-file-size", conf->max_file_size, size, out); +        GF_OPTION_INIT ("max-file-size", conf->max_file_size, size_uint64, out);          GF_OPTION_INIT ("cache-timeout", conf->cache_timeout, int32, out); -        GF_OPTION_INIT ("cache-size", conf->cache_size, size, out); +        GF_OPTION_INIT ("cache-size", conf->cache_size, size_uint64, out);          if (!check_cache_size_ok (this, conf->cache_size)) {                  ret = -1;                  goto out; diff --git a/xlators/performance/read-ahead/src/read-ahead.c b/xlators/performance/read-ahead/src/read-ahead.c index 6e2d84591d8..01c861d52f2 100644 --- a/xlators/performance/read-ahead/src/read-ahead.c +++ b/xlators/performance/read-ahead/src/read-ahead.c @@ -1124,7 +1124,8 @@ reconfigure (xlator_t *this, dict_t *options)          GF_OPTION_RECONF ("page-count", conf->page_count, options, uint32, out); -	GF_OPTION_RECONF ("page-size", conf->page_size, options, size, out); +        GF_OPTION_RECONF ("page-size", conf->page_size, options, size_uint64, +                          out);          ret = 0;   out: @@ -1158,7 +1159,7 @@ init (xlator_t *this)          conf->page_size = this->ctx->page_size; -	GF_OPTION_INIT ("page-size", conf->page_size, size, out); +        GF_OPTION_INIT ("page-size", conf->page_size, size_uint64, out);          GF_OPTION_INIT ("page-count", conf->page_count, uint32, out); diff --git a/xlators/performance/readdir-ahead/src/readdir-ahead.c b/xlators/performance/readdir-ahead/src/readdir-ahead.c index 53e6756f072..ba96bfcd3af 100644 --- a/xlators/performance/readdir-ahead/src/readdir-ahead.c +++ b/xlators/performance/readdir-ahead/src/readdir-ahead.c @@ -459,9 +459,9 @@ reconfigure(xlator_t *this, dict_t *options)  	GF_OPTION_RECONF("rda-request-size", priv->rda_req_size, options,  			 uint32, err); -	GF_OPTION_RECONF("rda-low-wmark", priv->rda_low_wmark, options, size, +	GF_OPTION_RECONF("rda-low-wmark", priv->rda_low_wmark, options, size_uint64,  			 err); -	GF_OPTION_RECONF("rda-high-wmark", priv->rda_high_wmark, options, size, +	GF_OPTION_RECONF("rda-high-wmark", priv->rda_high_wmark, options, size_uint64,  			 err);  	return 0; @@ -498,8 +498,8 @@ init(xlator_t *this)  		goto err;  	GF_OPTION_INIT("rda-request-size", priv->rda_req_size, uint32, err); -	GF_OPTION_INIT("rda-low-wmark", priv->rda_low_wmark, size, err); -	GF_OPTION_INIT("rda-high-wmark", priv->rda_high_wmark, size, err); +	GF_OPTION_INIT("rda-low-wmark", priv->rda_low_wmark, size_uint64, err); +	GF_OPTION_INIT("rda-high-wmark", priv->rda_high_wmark, size_uint64, err);  	return 0; diff --git a/xlators/performance/write-behind/src/write-behind.c b/xlators/performance/write-behind/src/write-behind.c index 00457338dd7..3cb0d449bbc 100644 --- a/xlators/performance/write-behind/src/write-behind.c +++ b/xlators/performance/write-behind/src/write-behind.c @@ -2116,7 +2116,7 @@ reconfigure (xlator_t *this, dict_t *options)          conf = this->private; -        GF_OPTION_RECONF ("cache-size", conf->window_size, options, size, out); +        GF_OPTION_RECONF ("cache-size", conf->window_size, options, size_uint64, out);          GF_OPTION_RECONF ("flush-behind", conf->flush_behind, options, bool,                            out); @@ -2163,7 +2163,7 @@ init (xlator_t *this)          conf->aggregate_size = WB_AGGREGATE_SIZE;          /* configure 'option window-size <size>' */ -        GF_OPTION_INIT ("cache-size", conf->window_size, size, out); +        GF_OPTION_INIT ("cache-size", conf->window_size, size_uint64, out);          if (!conf->window_size && conf->aggregate_size) {                  gf_log (this->name, GF_LOG_WARNING, diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index 306e555ef40..98fb10c34eb 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -21,6 +21,7 @@  #include "statedump.h"  #include "compat-errno.h" +#include "xdr-rpc.h"   #include "glusterfs3.h"  extern rpc_clnt_prog_t clnt_handshake_prog; @@ -2458,7 +2459,7 @@ client_init_grace_timer (xlator_t *this, dict_t *options,          conf->grace_ts.tv_nsec  = 0;          gf_log (this->name, GF_LOG_DEBUG, "Client grace timeout " -                "value = %"PRIu64, conf->grace_ts.tv_sec); +                "value = %"GF_PRI_SECOND, conf->grace_ts.tv_sec);          ret = 0;  out: diff --git a/xlators/protocol/server/src/server-handshake.c b/xlators/protocol/server/src/server-handshake.c index 708acd936d9..a459f89e182 100644 --- a/xlators/protocol/server/src/server-handshake.c +++ b/xlators/protocol/server/src/server-handshake.c @@ -645,7 +645,7 @@ server_setvolume (rpcsvc_request_t *req)  fail:          rsp.dict.dict_len = dict_serialized_length (reply); -        if (rsp.dict.dict_len < 0) { +        if (rsp.dict.dict_len > UINT_MAX) {                  gf_log ("server-handshake", GF_LOG_DEBUG,                          "failed to get serialized length of reply dict");                  op_ret   = -1; diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 76c0036e08b..600a311c3ee 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -33,6 +33,7 @@ server_decode_groups (call_frame_t *frame, rpcsvc_request_t *req)          if (frame->root->ngrps == 0)                  return 0; +	/* ngrps cannot be bigger than USHRT_MAX(65535) */          if (frame->root->ngrps > GF_MAX_AUX_GROUPS)                  return -1; @@ -744,7 +745,7 @@ serialize_rsp_direntp (gf_dirent_t *entries, gfs3_readdirp_rsp *rsp)                  /* if 'dict' is present, pack it */                  if (entry->dict) {                          trav->dict.dict_len = dict_serialized_length (entry->dict); -                        if (trav->dict.dict_len < 0) { +                        if (trav->dict.dict_len > UINT_MAX) {                                  gf_log (THIS->name, GF_LOG_ERROR,                                          "failed to get serialized length "                                          "of reply dict"); diff --git a/xlators/protocol/server/src/server-rpc-fops.c b/xlators/protocol/server/src/server-rpc-fops.c index 8bdadec6b63..ebe62ae7c42 100644 --- a/xlators/protocol/server/src/server-rpc-fops.c +++ b/xlators/protocol/server/src/server-rpc-fops.c @@ -1611,8 +1611,8 @@ server_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this,          fd_no = gf_fd_unused_get (serv_ctx->fdtable, fd);          fd_ref (fd); -        if ((fd_no < 0) || (fd == 0)) { -                op_ret = fd_no; +        if ((fd_no > UINT64_MAX) || (fd == 0)) { +                op_ret = -1;                  op_errno = errno;          } diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 7855170586a..6bd00cac047 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -688,7 +688,7 @@ server_init_grace_timer (xlator_t *this, dict_t *options,                  conf->grace_ts.tv_sec = 10;          gf_log (this->name, GF_LOG_DEBUG, "Server grace timeout " -                "value = %"PRIu64, conf->grace_ts.tv_sec); +                "value = %"GF_PRI_SECOND, conf->grace_ts.tv_sec);          conf->grace_ts.tv_nsec  = 0; diff --git a/xlators/storage/bd/src/bd-helper.c b/xlators/storage/bd/src/bd-helper.c index 4bd1d6111d5..d598e5755c6 100644 --- a/xlators/storage/bd/src/bd-helper.c +++ b/xlators/storage/bd/src/bd-helper.c @@ -11,6 +11,7 @@  #include "bd.h"  #include "bd-mem-types.h"  #include "run.h" +#include "lvm-defaults.h"  int  bd_inode_ctx_set (inode_t *inode, xlator_t *this, bd_attr_t *ctx) @@ -1018,4 +1019,3 @@ out:          return ret;  } - diff --git a/xlators/storage/bd/src/bd.c b/xlators/storage/bd/src/bd.c index 0954b553da5..750b009430a 100644 --- a/xlators/storage/bd/src/bd.c +++ b/xlators/storage/bd/src/bd.c @@ -38,6 +38,8 @@  #include "run.h"  #include "protocol-common.h"  #include "checksum.h" +#include "syscall.h" +#include "lvm-defaults.h"  /*   * Call back function for setxattr and removexattr. @@ -719,9 +721,8 @@ bd_do_fsync (int fd, int datasync)  {          int   op_errno = 0; -#ifdef HAVE_FDATASYNC          if (datasync) { -                if (fdatasync (fd)) { +                if (sys_fdatasync (fd)) {                          op_errno = errno;                          gf_log (THIS->name, GF_LOG_ERROR,                                  "fdatasync on fd=%d failed: %s", @@ -729,9 +730,9 @@ bd_do_fsync (int fd, int datasync)                  }          } else -#endif +          { -                if (fsync (fd)) { +                if (sys_fsync (fd)) {                          op_errno = errno;                          gf_log (THIS->name, GF_LOG_ERROR,                                  "fsync on fd=%d failed: %s", diff --git a/xlators/storage/bd/src/bd.h b/xlators/storage/bd/src/bd.h index 5307ca40736..62add16cdf4 100644 --- a/xlators/storage/bd/src/bd.h +++ b/xlators/storage/bd/src/bd.h @@ -38,10 +38,6 @@  #define BD_LV "lv"  #define BD_THIN "thin" -#define LVM_RESIZE "/sbin/lvresize" -#define LVM_CREATE "/sbin/lvcreate" -#define LVM_CONVERT "/sbin/lvconvert" -  #define VOL_TYPE "volume.type"  #define VOL_CAPS "volume.caps" @@ -165,7 +161,7 @@ int bd_clone (bd_local_t *local, bd_priv_t *priv);  int bd_merge (bd_priv_t *priv, uuid_t gfid);  int bd_get_origin (bd_priv_t *priv, loc_t *loc, fd_t *fd, dict_t *dict); -inline void bd_update_amtime(struct iatt *iatt, int flag); +void bd_update_amtime(struct iatt *iatt, int flag);  int bd_snapshot_create (bd_local_t *local, bd_priv_t *priv);  int bd_clone (bd_local_t *local, bd_priv_t *priv);  int bd_merge (bd_priv_t *priv, uuid_t gfid); diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c index 5725cad7d92..ab46f7f7e95 100644 --- a/xlators/storage/posix/src/posix-helpers.c +++ b/xlators/storage/posix/src/posix-helpers.c @@ -784,6 +784,27 @@ out:          return op_ret;  } +#ifdef GF_DARWIN_HOST_OS +static +void posix_dump_buffer (xlator_t *this, const char *real_path, const char *key, +                        data_t *value, int flags) +{ +        char buffer[3*value->len+1]; +        int index = 0; +        buffer[0] = 0; +        gf_loglevel_t log_level = gf_log_get_loglevel (); +        if (log_level == GF_LOG_TRACE) { +                char *data = (char *) value->data; +                for (index = 0; index < value->len; index++) +                        sprintf(buffer+3*index, " %02x", data[index]); +        } +        gf_log (this->name, GF_LOG_DEBUG, +                "Dump %s: key:%s flags: %u length:%u data:%s ", +                real_path, key, flags, value->len, +                (log_level == GF_LOG_TRACE ? buffer : "<skipped in DEBUG>")); +} +#endif +  static int gf_xattr_enotsup_log;  int @@ -802,7 +823,9 @@ posix_handle_pair (xlator_t *this, const char *real_path,          } else {                  sys_ret = sys_lsetxattr (real_path, key, value->data,                                           value->len, flags); - +#ifdef GF_DARWIN_HOST_OS +                posix_dump_buffer(this, real_path, key, value, flags); +#endif                  if (sys_ret < 0) {                          ret = -errno;                          if (errno == ENOTSUP) { @@ -825,13 +848,13 @@ posix_handle_pair (xlator_t *this, const char *real_path,                                  gf_log (this->name,                                          ((errno == EINVAL) ?                                           GF_LOG_DEBUG : GF_LOG_ERROR), -                                        "%s: key:%s error:%s", -                                        real_path, key, +                                        "%s: key:%s flags: %u length:%d error:%s", +                                        real_path, key, flags, value->len,                                          strerror (errno));  #else /* ! DARWIN */                                  gf_log (this->name, GF_LOG_ERROR, -                                        "%s: key:%s error:%s", -                                        real_path, key, +                                        "%s: key:%s flags: %u length:%d error:%s", +                                        real_path, key, flags, value->len,                                          strerror (errno));  #endif /* DARWIN */                          } @@ -1430,12 +1453,10 @@ posix_fsyncer_process (xlator_t *this, call_stub_t *stub, gf_boolean_t do_fsync)          }          if (do_fsync) { -#ifdef HAVE_FDATASYNC                  if (stub->args.datasync) -                        ret = fdatasync (pfd->fd); +                        ret = sys_fdatasync (pfd->fd);                  else -#endif -                        ret = fsync (pfd->fd); +                        ret = sys_fsync (pfd->fd);          } else {                  ret = 0;          } diff --git a/xlators/storage/posix/src/posix.c b/xlators/storage/posix/src/posix.c index 588079d9225..d33b5027ef5 100644 --- a/xlators/storage/posix/src/posix.c +++ b/xlators/storage/posix/src/posix.c @@ -761,7 +761,7 @@ posix_do_zerofill(call_frame_t *frame, xlator_t *this, fd_t *fd,          if (ret < 0) {                  ret = -errno;                  gf_log(this->name, GF_LOG_ERROR, -                       "zerofill failed on fd %d length %ld %s", +                       "zerofill failed on fd %d length %" PRId64 " %s",                          pfd->fd, len, strerror(errno));                  goto out;          } @@ -2859,16 +2859,14 @@ posix_fsync (call_frame_t *frame, xlator_t *this,          if (datasync) {                  ; -#ifdef HAVE_FDATASYNC -                op_ret = fdatasync (_fd); +                op_ret = sys_fdatasync (_fd);                  if (op_ret == -1) {                          gf_log (this->name, GF_LOG_ERROR,                                  "fdatasync on fd=%p failed: %s",                                  fd, strerror (errno));                  } -#endif          } else { -                op_ret = fsync (_fd); +                op_ret = sys_fsync (_fd);                  if (op_ret == -1) {                          op_errno = errno;                          gf_log (this->name, GF_LOG_ERROR, @@ -2911,6 +2909,23 @@ _handle_setxattr_keyvalue_pair (dict_t *d, char *k, data_t *v,                                    filler->flags);  } +#ifdef GF_DARWIN_HOST_OS +static inline int +map_xattr_flags(int flags) +{ +        /* DARWIN has different defines on XATTR_ flags. +           There do not seem to be a POSIX standard +           Parse any other flags over. +        */ +        int darwinflags = flags & ~(GF_XATTR_CREATE | GF_XATTR_REPLACE | XATTR_REPLACE); +        if (GF_XATTR_CREATE & flags) +                darwinflags |= XATTR_CREATE; +        if (GF_XATTR_REPLACE & flags) +                darwinflags |= XATTR_REPLACE; +        return darwinflags; +} +#endif +  int32_t  posix_setxattr (call_frame_t *frame, xlator_t *this,                  loc_t *loc, dict_t *dict, int flags, dict_t *xdata) @@ -2937,7 +2952,11 @@ posix_setxattr (call_frame_t *frame, xlator_t *this,          filler.real_path = real_path;          filler.this = this; +#ifdef GF_DARWIN_HOST_OS +        filler.flags = map_xattr_flags(flags); +#else          filler.flags = flags; +#endif          op_ret = dict_foreach (dict, _handle_setxattr_keyvalue_pair,                                 &filler);          if (op_ret < 0) { @@ -3354,7 +3373,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,          char                 *list                  = NULL;          int32_t               list_offset           = 0;          size_t                remaining_size        = 0; -        char     key[4096]                          = {0,}; +        char                  keybuffer[4096]       = {0,};          DECLARE_OLD_FS_ID_VAR; @@ -3522,8 +3541,20 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,          }          if (name) { -                strcpy (key, name); - +                strcpy (keybuffer, name); +                char *key = keybuffer; +#if defined(GF_DARWIN_HOST_OS_DISABLED) +                if (priv->xattr_user_namespace == XATTR_STRIP) { +                        if (strncmp(key, "user.",5) == 0) { +                                key += 5; +                                gf_log (this->name, +                                        GF_LOG_DEBUG, +                                        "getxattr for file %s" +                                        " stripping user key: %s -> %s", +                                        real_path, keybuffer, key); +                        } +                } +#endif                  size = sys_lgetxattr (real_path, key, NULL, 0);                  if (size <= 0) {                          op_errno = errno; @@ -3611,14 +3642,13 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,          while (remaining_size > 0) {                  if (*(list + list_offset) == '\0')                          break; - -                strcpy (key, list + list_offset); -                size = sys_lgetxattr (real_path, key, NULL, 0); +                strcpy (keybuffer, list + list_offset); +                size = sys_lgetxattr (real_path, keybuffer, NULL, 0);                  if (size == -1) {                          op_ret = -1;                          op_errno = errno;                          gf_log (this->name, GF_LOG_ERROR, "getxattr failed on " -                                "%s: key = %s (%s)", real_path, key, +                                "%s: key = %s (%s)", real_path, keybuffer,                                  strerror (op_errno));                          break;                  } @@ -3630,29 +3660,37 @@ posix_getxattr (call_frame_t *frame, xlator_t *this,                          goto out;                  } -                size = sys_lgetxattr (real_path, key, value, size); +                size = sys_lgetxattr (real_path, keybuffer, value, size);                  if (size == -1) {                          op_ret = -1;                          op_errno = errno;                          gf_log (this->name, GF_LOG_ERROR, "getxattr failed on " -                                "%s: key = %s (%s)", real_path, key, +                                "%s: key = %s (%s)", real_path, keybuffer,                                  strerror (op_errno));                          GF_FREE (value);                          break;                  }                  value [size] = '\0'; -                op_ret = dict_set_dynptr (dict, key, value, size); +#ifdef GF_DARWIN_HOST_OS +                /* The protocol expect namespace for now */ +                char *newkey = NULL; +                gf_add_prefix (XATTR_USER_PREFIX, keybuffer, &newkey); +                strcpy (keybuffer, newkey); +                GF_FREE (newkey); +#endif +                op_ret = dict_set_dynptr (dict, keybuffer, value, size);                  if (op_ret < 0) {                          op_errno = -op_ret;                          gf_log (this->name, GF_LOG_ERROR, "dict set operation " -                                "on %s for the key %s failed.", real_path, key); +                                "on %s for the key %s failed.", real_path, +                                keybuffer);                          GF_FREE (value);                          goto out;                  } -                remaining_size -= strlen (key) + 1; -                list_offset += strlen (key) + 1; +                remaining_size -= strlen (keybuffer) + 1; +                list_offset += strlen (keybuffer) + 1;          } /* while (remaining_size > 0) */ @@ -3729,7 +3767,16 @@ posix_fgetxattr (call_frame_t *frame, xlator_t *this,          if (name) {                  strcpy (key, name); - +#ifdef GF_DARWIN_HOST_OS +                struct posix_private *priv       = NULL; +                priv = this->private; +                if (priv->xattr_user_namespace == XATTR_STRIP) { +                        char *newkey = NULL; +                        gf_add_prefix (XATTR_USER_PREFIX, key, &newkey); +                        strcpy (key, newkey); +                        GF_FREE (newkey); +                } +#endif                  size = sys_fgetxattr (_fd, key, NULL, 0);                  if (size <= 0) {                          op_errno = errno; @@ -3832,6 +3879,7 @@ posix_fgetxattr (call_frame_t *frame, xlator_t *this,                  }                  value [size] = '\0'; +                  op_ret = dict_set_dynptr (dict, key, value, size);                  if (op_ret) {                          gf_log (this->name, GF_LOG_ERROR, "dict set operation " @@ -3910,7 +3958,11 @@ posix_fsetxattr (call_frame_t *frame, xlator_t *this,          filler.fd = _fd;          filler.this = this; +#ifdef GF_DARWIN_HOST_OS +        filler.flags = map_xattr_flags(flags); +#else          filler.flags = flags; +#endif          op_ret = dict_foreach (dict, _handle_fsetxattr_keyvalue_pair,                                 &filler);          if (op_ret < 0) { @@ -3935,7 +3987,17 @@ _posix_remove_xattr (dict_t *dict, char *key, data_t *value, void *data)          filler = (posix_xattr_filler_t *) data;          this = filler->this; - +#ifdef GF_DARWIN_HOST_OS +        struct posix_private  *priv = NULL; +        priv = (struct posix_private *) this->private; +        char *newkey = NULL; +        if (priv->xattr_user_namespace == XATTR_STRIP) { +                gf_remove_prefix (XATTR_USER_PREFIX, key, &newkey); +                gf_log("remove_xattr", GF_LOG_DEBUG, "key %s => %s" , key, +                       newkey); +                key = newkey; +        } +#endif          op_ret = sys_lremovexattr (filler->real_path, key);          if (op_ret == -1) {                  filler->op_errno = errno; @@ -3944,7 +4006,9 @@ _posix_remove_xattr (dict_t *dict, char *key, data_t *value, void *data)                                  "removexattr failed on %s (for %s): %s",                                  filler->real_path, key, strerror (errno));          } - +#ifdef GF_DARWIN_HOST_OS +        GF_FREE(newkey); +#endif          return op_ret;  } @@ -4176,10 +4240,19 @@ _posix_handle_xattr_keyvalue_pair (dict_t *d, char *k, data_t *v,          optype = (gf_xattrop_flags_t)(filler->flags);          this = filler->this;          inode = filler->inode; -          count = v->len;          array = GF_CALLOC (count, sizeof (char), gf_posix_mt_char); +#ifdef GF_DARWIN_HOST_OS +        struct posix_private *priv     = NULL; +        priv = this->private; +        if (priv->xattr_user_namespace == XATTR_STRIP) { +                if (strncmp(k, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN) == 0) { +                        k += XATTR_USER_PREFIX_LEN; +                } +        } +#endif +          LOCK (&inode->lock);          {                  if (filler->real_path) { @@ -5135,6 +5208,23 @@ set_batch_fsync_mode (struct posix_private *priv, const char *str)  	return 0;  } +#ifdef GF_DARWIN_HOST_OS +static int +set_xattr_user_namespace_mode (struct posix_private *priv, const char *str) +{ +        if (strcmp (str, "none") == 0) +                priv->xattr_user_namespace = XATTR_NONE; +        else if (strcmp (str, "strip") == 0) +                priv->xattr_user_namespace = XATTR_STRIP; +        else if (strcmp (str, "append") == 0) +                priv->xattr_user_namespace = XATTR_APPEND; +        else if (strcmp (str, "both") == 0) +                priv->xattr_user_namespace = XATTR_BOTH; +        else +                return -1; +        return 0; +} +#endif  int  reconfigure (xlator_t *this, dict_t *options) @@ -5164,6 +5254,21 @@ reconfigure (xlator_t *this, dict_t *options)  		goto out;  	} +#ifdef GF_DARWIN_HOST_OS + +        char   *xattr_user_namespace_mode_str = NULL; + +        GF_OPTION_RECONF ("xattr-user-namespace-mode", xattr_user_namespace_mode_str, +                          options, str, out); + +        if (set_xattr_user_namespace_mode (priv, xattr_user_namespace_mode_str) != 0) { +                gf_log (this->name, GF_LOG_ERROR, "Unknown xattr user namespace mode string: %s", +                        xattr_user_namespace_mode_str); +                goto out; +        } + +#endif +  	GF_OPTION_RECONF ("linux-aio", priv->aio_configured,  			  options, bool, out); @@ -5351,7 +5456,8 @@ init (xlator_t *this)                          dir_data->data);                  ret = -1;                  goto out; -        } else if ((size == -1) && (errno != ENODATA)) { +        } else if ((size == -1) && (errno != ENODATA) && +                   (errno != ENOATTR)) {                  /* Wrong 'gfid' is set, it should be error */                  gf_log (this->name, GF_LOG_WARNING,                          "%s: failed to fetch gfid (%s)", @@ -5610,8 +5716,24 @@ init (xlator_t *this)  		goto out;  	} -	GF_OPTION_INIT ("batch-fsync-delay-usec", _private->batch_fsync_delay_usec, -			uint32, out); +#ifdef GF_DARWIN_HOST_OS + +        char  *xattr_user_namespace_mode_str = NULL; + +        GF_OPTION_INIT ("xattr-user-namespace-mode", +                        xattr_user_namespace_mode_str, str, out); + +        if (set_xattr_user_namespace_mode (_private, +                                           xattr_user_namespace_mode_str) != 0) { +                gf_log (this->name, GF_LOG_ERROR, +                        "Unknown xattr user namespace mode string: %s", +                        xattr_user_namespace_mode_str); +                goto out; +        } +#endif + +        GF_OPTION_INIT ("batch-fsync-delay-usec", _private->batch_fsync_delay_usec, +                        uint32, out);  out:          return ret;  } @@ -5769,5 +5891,15 @@ struct volume_options options[] = {            .default_value = "off",            .description = "Enable placeholders for gfid to path conversion"          }, +#if GF_DARWIN_HOST_OS +        { .key = {"xattr-user-namespace-mode"}, +          .type = GF_OPTION_TYPE_STR, +          .default_value = "none", +          .description = "Option to control XATTR user namespace on the raw filesystem: " +	  "\t- None: Will use the user namespace, so files will be exchangable with Linux.\n" +	  " The raw filesystem will not be compatible with OS X Finder.\n" +	  "\t- Strip: Will strip the user namespace before setting. The raw filesystem will work in OS X.\n" +        }, +#endif          { .key  = {NULL} }  }; diff --git a/xlators/storage/posix/src/posix.h b/xlators/storage/posix/src/posix.h index 91e0664ed2d..c9bfc984da5 100644 --- a/xlators/storage/posix/src/posix.h +++ b/xlators/storage/posix/src/posix.h @@ -158,6 +158,16 @@ struct posix_private {          uint32_t        health_check_interval;          pthread_t       health_check;          gf_boolean_t    health_check_active; + +#ifdef GF_DARWIN_HOST_OS +        enum { +                XATTR_NONE = 0, +                XATTR_STRIP, +                XATTR_APPEND, +                XATTR_BOTH, +        } xattr_user_namespace; +#endif +  };  typedef struct {  | 
