diff options
Diffstat (limited to 'libglusterfs/src')
-rw-r--r-- | libglusterfs/src/Makefile.am | 7 | ||||
-rw-r--r-- | libglusterfs/src/client_t.c | 2 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.c | 42 | ||||
-rw-r--r-- | libglusterfs/src/common-utils.h | 9 | ||||
-rw-r--r-- | libglusterfs/src/compat.h | 53 | ||||
-rw-r--r-- | libglusterfs/src/dict.c | 6 | ||||
-rw-r--r-- | libglusterfs/src/fd.c | 2 | ||||
-rw-r--r-- | libglusterfs/src/glusterfs.h | 2 | ||||
-rw-r--r-- | libglusterfs/src/logging.c | 20 | ||||
-rw-r--r-- | libglusterfs/src/logging.h | 12 | ||||
-rw-r--r-- | libglusterfs/src/lvm-defaults.h | 25 | ||||
-rw-r--r-- | libglusterfs/src/options.c | 38 | ||||
-rw-r--r-- | libglusterfs/src/options.h | 12 | ||||
-rw-r--r-- | libglusterfs/src/syscall.c | 99 | ||||
-rw-r--r-- | libglusterfs/src/syscall.h | 53 | ||||
-rw-r--r-- | libglusterfs/src/timespec.c | 41 | ||||
-rw-r--r-- | libglusterfs/src/timespec.h | 2 |
17 files changed, 332 insertions, 93 deletions
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); |