diff options
Diffstat (limited to 'booster/src')
-rw-r--r-- | booster/src/Makefile.am | 21 | ||||
-rw-r--r-- | booster/src/booster-fd.c | 342 | ||||
-rw-r--r-- | booster/src/booster-fd.h | 83 | ||||
-rw-r--r-- | booster/src/booster.c | 3172 | ||||
-rw-r--r-- | booster/src/booster_fstab.c | 452 | ||||
-rw-r--r-- | booster/src/booster_fstab.h | 83 | ||||
-rw-r--r-- | booster/src/booster_stat.c | 188 |
7 files changed, 0 insertions, 4341 deletions
diff --git a/booster/src/Makefile.am b/booster/src/Makefile.am deleted file mode 100644 index d7d83abf5ee..00000000000 --- a/booster/src/Makefile.am +++ /dev/null @@ -1,21 +0,0 @@ -ldpreload_LTLIBRARIES = libglusterfs-booster.la -ldpreloaddir = $(libdir)/glusterfs -noinst_HEADERS = booster_fstab.h booster-fd.h -libglusterfs_booster_la_SOURCES = booster.c booster_stat.c booster_fstab.c booster-fd.c -libglusterfs_booster_la_CFLAGS = -I$(top_srcdir)/libglusterfsclient/src/ -D_GNU_SOURCE -D$(GF_HOST_OS) -fPIC -Wall \ - -pthread $(GF_BOOSTER_CFLAGS) -shared -nostartfiles -libglusterfs_booster_la_CPPFLAGS = -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE \ - -I$(top_srcdir)/libglusterfsclient/src \ - -I$(top_srcdir)/libglusterfs/src -DDATADIR=\"$(localstatedir)\" \ - -DCONFDIR=\"$(sysconfdir)/glusterfs\" $(ARGP_STANDALONE_CPPFLAGS) - -libglusterfs_booster_la_LDFLAGS = -module -avoidversion -libglusterfs_booster_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la $(top_builddir)/libglusterfsclient/src/libglusterfsclient.la - -CLEANFILES = - -uninstall-local: - rm -f $(DESTDIR)$(ldpreloaddir)/glusterfs-booster.so - -install-data-hook: - ln -sf libglusterfs-booster.so $(DESTDIR)$(ldpreloaddir)/glusterfs-booster.so diff --git a/booster/src/booster-fd.c b/booster/src/booster-fd.c deleted file mode 100644 index fa5b0cde2d3..00000000000 --- a/booster/src/booster-fd.c +++ /dev/null @@ -1,342 +0,0 @@ -/* - Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> - This file is part of GlusterFS. - - GlusterFS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - <http://www.gnu.org/licenses/>. -*/ - - - -#include "booster-fd.h" -#include <logging.h> -#include <mem-pool.h> -#include <stdlib.h> -#include <errno.h> -#include <common-utils.h> -#include <string.h> - -#include <assert.h> - -extern fd_t * -fd_ref (fd_t *fd); - -extern void -fd_unref (fd_t *fd); -/* - Allocate in memory chunks of power of 2 starting from 1024B - Assumes fdtable->lock is held - */ -static inline uint -gf_roundup_power_of_two (uint nr) -{ - uint result = 1; - - if (nr < 0) { - gf_log ("booster-fd", GF_LOG_ERROR, "Negative number passed"); - return -1; - } - - while (result <= nr) - result *= 2; - - return result; -} - -#define BOOSTER_NFDBITS (sizeof (unsigned long)) - -#define BOOSTER_FDMASK(d) (1UL << ((d) % BOOSTER_NFDBITS)) -#define BOOSTER_FDELT(d) (d / BOOSTER_NFDBITS) -#define BOOSTER_FD_SET(set, d) (set->fd_bits[BOOSTER_FDELT(d)] |= BOOSTER_FDMASK(d)) -#define BOOSTER_FD_CLR(set, d) (set->fd_bits[BOOSTER_FDELT(d)] &= ~BOOSTER_FDMASK(d)) -#define BOOSTER_FD_ISSET(set, d) (set->fd_bits[BOOSTER_FDELT(d)] & BOOSTER_FDMASK(d)) - -inline int -booster_get_close_on_exec (booster_fdtable_t *fdtable, int fd) -{ - return BOOSTER_FD_ISSET(fdtable->close_on_exec, fd); -} - -inline void -booster_set_close_on_exec (booster_fdtable_t *fdtable, int fd) -{ - BOOSTER_FD_SET(fdtable->close_on_exec, fd); -} - -int -booster_fdtable_expand (booster_fdtable_t *fdtable, uint nr) -{ - fd_t **oldfds = NULL, **tmp = NULL; - uint oldmax_fds = -1; - uint cpy = 0; - int32_t ret = -1, bytes = 0; - booster_fd_set_t *oldclose_on_exec = NULL; - - if (fdtable == NULL || nr < 0) { - gf_log ("booster-fd", GF_LOG_ERROR, "Invalid argument"); - errno = EINVAL; - ret = -1; - goto out; - } - - nr /= (1024 / sizeof (fd_t *)); - nr = gf_roundup_power_of_two (nr + 1); - nr *= (1024 / sizeof (fd_t *)); - - oldfds = fdtable->fds; - oldmax_fds = fdtable->max_fds; - oldclose_on_exec = fdtable->close_on_exec; - - fdtable->fds = CALLOC (nr, sizeof (fd_t *)); - if (fdtable->fds == NULL) { - gf_log ("booster-fd", GF_LOG_ERROR, "Memory allocation failed"); - fdtable->fds = oldfds; - oldfds = NULL; - ret = -1; - goto out; - } - - fdtable->max_fds = nr; - - if (oldfds) { - cpy = oldmax_fds * sizeof (fd_t *); - memcpy (fdtable->fds, oldfds, cpy); - } - - /* nr will be either less than 8 or a multiple of 8 */ - bytes = nr/8; - bytes = bytes ? bytes : 1; - fdtable->close_on_exec = CALLOC (bytes, 1); - if (fdtable->close_on_exec == NULL) { - gf_log ("booster-fd", GF_LOG_ERROR, "Memory allocation " - "failed"); - tmp = fdtable->fds; - fdtable->fds = oldfds; - oldfds = tmp; - ret = -1; - goto out; - } - - if (oldclose_on_exec != NULL) { - bytes = oldmax_fds/8; - cpy = bytes ? bytes : 1; - memcpy (fdtable->close_on_exec, oldclose_on_exec, cpy); - } - gf_log ("booster-fd", GF_LOG_TRACE, "FD-table expanded: Old: %d,New: %d" - , oldmax_fds, nr); - ret = 0; - -out: - FREE (oldfds); - FREE (oldclose_on_exec); - - return ret; -} - -booster_fdtable_t * -booster_fdtable_alloc (void) -{ - booster_fdtable_t *fdtable = NULL; - int32_t ret = -1; - - fdtable = CALLOC (1, sizeof (*fdtable)); - GF_VALIDATE_OR_GOTO ("booster-fd", fdtable, out); - - LOCK_INIT (&fdtable->lock); - - LOCK (&fdtable->lock); - { - ret = booster_fdtable_expand (fdtable, 0); - } - UNLOCK (&fdtable->lock); - - if (ret == -1) { - gf_log ("booster-fd", GF_LOG_ERROR, "FD-table allocation " - "failed"); - FREE (fdtable); - fdtable = NULL; - } - -out: - return fdtable; -} - -fd_t ** -__booster_fdtable_get_all_fds (booster_fdtable_t *fdtable, uint *count) -{ - fd_t **fds = NULL; - - if (count == NULL) - goto out; - - fds = fdtable->fds; - fdtable->fds = calloc (fdtable->max_fds, sizeof (fd_t *)); - *count = fdtable->max_fds; - -out: - return fds; -} - -fd_t ** -booster_fdtable_get_all_fds (booster_fdtable_t *fdtable, uint *count) -{ - fd_t **fds = NULL; - if (!fdtable) - return NULL; - - LOCK (&fdtable->lock); - { - fds = __booster_fdtable_get_all_fds (fdtable, count); - } - UNLOCK (&fdtable->lock); - - return fds; -} - -void -booster_fdtable_destroy (booster_fdtable_t *fdtable) -{ - fd_t *fd = NULL; - fd_t **fds = NULL; - uint fd_count = 0; - int i = 0; - - if (!fdtable) - return; - - LOCK (&fdtable->lock); - { - fds = __booster_fdtable_get_all_fds (fdtable, &fd_count); - FREE (fdtable->fds); - } - UNLOCK (&fdtable->lock); - - if (!fds) - goto free_table; - - for (i = 0; i < fd_count; i++) { - fd = fds[i]; - if (fd != NULL) - fd_unref (fd); - } - FREE (fds); -free_table: - LOCK_DESTROY (&fdtable->lock); - FREE (fdtable); -} - -int -booster_fd_unused_get (booster_fdtable_t *fdtable, fd_t *fdptr, int fd) -{ - int ret = -1; - int error = 0; - - if (fdtable == NULL || fdptr == NULL || fd < 0) { - gf_log ("booster-fd", GF_LOG_ERROR, "invalid argument"); - errno = EINVAL; - return -1; - } - - gf_log ("booster-fd", GF_LOG_TRACE, "Requested fd: %d", fd); - LOCK (&fdtable->lock); - { - while (fdtable->max_fds < fd) { - error = 0; - error = booster_fdtable_expand (fdtable, - fdtable->max_fds + 1); - if (error) { - gf_log ("booster-fd", GF_LOG_ERROR, - "Cannot expand fdtable:%s", - strerror (error)); - goto err; - } - } - - if (!fdtable->fds[fd]) { - fdtable->fds[fd] = fdptr; - fd_ref (fdptr); - ret = fd; - } else - gf_log ("booster-fd", GF_LOG_ERROR, "Cannot allocate fd" - " %d (slot not empty in fdtable)", fd); - } -err: - UNLOCK (&fdtable->lock); - - return ret; -} - -void -booster_fd_put (booster_fdtable_t *fdtable, int fd) -{ - fd_t *fdptr = NULL; - if (fdtable == NULL || fd < 0) { - gf_log ("booster-fd", GF_LOG_ERROR, "invalid argument"); - return; - } - - gf_log ("booster-fd", GF_LOG_TRACE, "FD put: %d", fd); - if (!(fd < fdtable->max_fds)) { - gf_log ("booster-fd", GF_LOG_ERROR, "FD not in booster fd" - " table"); - return; - } - - LOCK (&fdtable->lock); - { - fdptr = fdtable->fds[fd]; - fdtable->fds[fd] = NULL; - } - UNLOCK (&fdtable->lock); - - if (fdptr) - fd_unref (fdptr); -} - -fd_t * -booster_fdptr_get (booster_fdtable_t *fdtable, int fd) -{ - fd_t *fdptr = NULL; - - if (fdtable == NULL || fd < 0) { - gf_log ("booster-fd", GF_LOG_ERROR, "invalid argument"); - errno = EINVAL; - return NULL; - } - - gf_log ("booster-fd", GF_LOG_TRACE, "FD ptr request: %d", fd); - if (!(fd < fdtable->max_fds)) { - gf_log ("booster-fd", GF_LOG_ERROR, "FD not in booster fd" - " table"); - errno = EINVAL; - return NULL; - } - - LOCK (&fdtable->lock); - { - fdptr = fdtable->fds[fd]; - if (fdptr) - fd_ref (fdptr); - } - UNLOCK (&fdtable->lock); - - return fdptr; -} - -void -booster_fdptr_put (fd_t *booster_fd) -{ - if (booster_fd) - fd_unref (booster_fd); -} diff --git a/booster/src/booster-fd.h b/booster/src/booster-fd.h deleted file mode 100644 index 595a112bd8d..00000000000 --- a/booster/src/booster-fd.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - Copyright (c) 2010 Gluster, Inc. <http://www.gluster.com> - This file is part of GlusterFS. - - GlusterFS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - <http://www.gnu.org/licenses/>. -*/ - -#ifndef _BOOSTER_FD_H -#define _BOOSTER_FD_H - -#include <libglusterfsclient.h> -#include <locking.h> -#include <list.h> - -/* This struct must be updated if the fd_t in fd.h changes. - * We cannot include those headers here because unistd.h, included - * by glusterfs headers, conflicts with the syscall prototypes we - * define for booster. - */ -struct _fd { - pid_t pid; - int32_t flags; - int32_t refcount; - struct list_head inode_list; - struct _inode *inode; - struct _dict *ctx; - gf_lock_t lock; /* used ONLY for manipulating - 'struct _fd_ctx' array (_ctx).*/ - struct _fd_ctx *_ctx; -}; -typedef struct _fd fd_t; - -struct _booster_fd_set { - unsigned long fd_bits[0]; -}; -typedef struct _booster_fd_set booster_fd_set_t; - -struct _booster_fdtable { - booster_fd_set_t *close_on_exec; - int refcount; - unsigned int max_fds; - gf_lock_t lock; - fd_t **fds; -}; -typedef struct _booster_fdtable booster_fdtable_t; - -void -booster_set_close_on_exec (booster_fdtable_t *fdtable, int fd); - -int -booster_get_close_on_exec (booster_fdtable_t *fdtable, int fd); - -extern int -booster_fd_unused_get (booster_fdtable_t *fdtable, fd_t *fdptr, int fd); - -extern void -booster_fd_put (booster_fdtable_t *fdtable, int fd); - -extern fd_t * -booster_fdptr_get (booster_fdtable_t *fdtable, int fd); - -extern void -booster_fdptr_put (fd_t *fdptr); - -extern void -booster_fdtable_destroy (booster_fdtable_t *fdtable); - -booster_fdtable_t * -booster_fdtable_alloc (void); - -#endif /* #ifndef _BOOSTER_FD_H */ diff --git a/booster/src/booster.c b/booster/src/booster.c deleted file mode 100644 index c34ec114645..00000000000 --- a/booster/src/booster.c +++ /dev/null @@ -1,3172 +0,0 @@ -/* - Copyright (c) 2007-2011 Gluster, Inc. <http://www.gluster.com> - This file is part of GlusterFS. - - GlusterFS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - <http://www.gnu.org/licenses/>. -*/ - -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include <dlfcn.h> -#include <sys/types.h> -#include <sys/uio.h> -#include <stdio.h> -#include <stdarg.h> -#include <stdlib.h> -#include <inttypes.h> -#include <libglusterfsclient.h> -#include <list.h> -#include <pthread.h> -#include <sys/xattr.h> -#include <string.h> -#include <assert.h> -#include <errno.h> -#include <ctype.h> -#include <logging.h> -#include <utime.h> -#include <dirent.h> -#include <sys/statfs.h> -#include <sys/statvfs.h> -#include <fcntl.h> -#include "booster-fd.h" - -#ifndef GF_UNIT_KB -#define GF_UNIT_KB 1024 -#endif - -static pthread_mutex_t cwdlock = PTHREAD_MUTEX_INITIALIZER; - -/* attr constructor registers this function with libc's - * _init function as a function that must be called before - * the main() of the program. - */ -static void booster_lib_init (void) __attribute__((constructor)); - -extern fd_t * -fd_ref (fd_t *fd); - -extern void -fd_unref (fd_t *fd); - -extern int pipe (int filedes[2]); -/* We define these flags so that we can remove fcntl.h from the include path. - * fcntl.h has certain defines and other lines of code that redirect the - * application's open and open64 calls to the syscalls defined by - * libc, for us, thats not a Good Thing (TM). - */ -#ifndef GF_O_CREAT -#define GF_O_CREAT 0x40 -#endif - -#ifndef GF_O_TRUNC -#define GF_O_TRUNC 0x200 -#endif - -#ifndef GF_O_RDWR -#define GF_O_RDWR 0x2 -#endif - -#ifndef GF_O_WRONLY -#define GF_O_WRONLY 0x1 -#endif - -#ifndef UNIX_PATH_MAX -#define UNIX_PATH_MAX 108 -#endif - -typedef enum { - BOOSTER_OPEN, - BOOSTER_CREAT -} booster_op_t; - -struct _inode; -struct _dict; - -ssize_t -write (int fd, const void *buf, size_t count); - -/* open, open64, creat */ -static int (*real_open) (const char *pathname, int flags, ...); -static int (*real_open64) (const char *pathname, int flags, ...); -static int (*real_creat) (const char *pathname, mode_t mode); -static int (*real_creat64) (const char *pathname, mode_t mode); - -/* read, readv, pread, pread64 */ -static ssize_t (*real_read) (int fd, void *buf, size_t count); -static ssize_t (*real_readv) (int fd, const struct iovec *vector, int count); -static ssize_t (*real_pread) (int fd, void *buf, size_t count, - unsigned long offset); -static ssize_t (*real_pread64) (int fd, void *buf, size_t count, - uint64_t offset); - -/* write, writev, pwrite, pwrite64 */ -static ssize_t (*real_write) (int fd, const void *buf, size_t count); -static ssize_t (*real_writev) (int fd, const struct iovec *vector, int count); -static ssize_t (*real_pwrite) (int fd, const void *buf, size_t count, - unsigned long offset); -static ssize_t (*real_pwrite64) (int fd, const void *buf, size_t count, - uint64_t offset); - -/* lseek, llseek, lseek64 */ -static off_t (*real_lseek) (int fildes, unsigned long offset, int whence); -static off_t (*real_lseek64) (int fildes, uint64_t offset, int whence); - -/* close */ -static int (*real_close) (int fd); - -/* dup dup2 */ -static int (*real_dup) (int fd); -static int (*real_dup2) (int oldfd, int newfd); - -static pid_t (*real_fork) (void); -static int (*real_mkdir) (const char *pathname, mode_t mode); -static int (*real_rmdir) (const char *pathname); -static int (*real_chmod) (const char *pathname, mode_t mode); -static int (*real_chown) (const char *pathname, uid_t owner, gid_t group); -static int (*real_fchmod) (int fd, mode_t mode); -static int (*real_fchown) (int fd, uid_t, gid_t gid); -static int (*real_fsync) (int fd); -static int (*real_ftruncate) (int fd, off_t length); -static int (*real_ftruncate64) (int fd, loff_t length); -static int (*real_link) (const char *oldpath, const char *newname); -static int (*real_rename) (const char *oldpath, const char *newpath); -static int (*real_utimes) (const char *path, const struct timeval times[2]); -static int (*real_utime) (const char *path, const struct utimbuf *buf); -static int (*real_mknod) (const char *path, mode_t mode, dev_t dev); -static int (*real_mkfifo) (const char *path, mode_t mode); -static int (*real_unlink) (const char *path); -static int (*real_symlink) (const char *oldpath, const char *newpath); -static int (*real_readlink) (const char *path, char *buf, size_t bufsize); -static char * (*real_realpath) (const char *path, char *resolved); -static DIR * (*real_opendir) (const char *path); -static struct dirent * (*real_readdir) (DIR *dir); -static struct dirent64 * (*real_readdir64) (DIR *dir); -static int (*real_readdir_r) (DIR *dir, struct dirent *entry, - struct dirent **result); -static int (*real_readdir64_r) (DIR *dir, struct dirent64 *entry, - struct dirent64 **result); -static int (*real_closedir) (DIR *dh); -static int (*real___xstat) (int ver, const char *path, struct stat *buf); -static int (*real___xstat64) (int ver, const char *path, struct stat64 *buf); -static int (*real_stat) (const char *path, struct stat *buf); -static int (*real_stat64) (const char *path, struct stat64 *buf); -static int (*real___fxstat) (int ver, int fd, struct stat *buf); -static int (*real___fxstat64) (int ver, int fd, struct stat64 *buf); -static int (*real_fstat) (int fd, struct stat *buf); -static int (*real_fstat64) (int fd , struct stat64 *buf); -static int (*real___lxstat) (int ver, const char *path, struct stat *buf); -static int (*real___lxstat64) (int ver, const char *path, struct stat64 *buf); -static int (*real_lstat) (const char *path, struct stat *buf); -static int (*real_lstat64) (const char *path, struct stat64 *buf); -static int (*real_statfs) (const char *path, struct statfs *buf); -static int (*real_statfs64) (const char *path, struct statfs64 *buf); -static int (*real_statvfs) (const char *path, struct statvfs *buf); -static int (*real_statvfs64) (const char *path, struct statvfs64 *buf); -static ssize_t (*real_getxattr) (const char *path, const char *name, - void *value, size_t size); -static ssize_t (*real_lgetxattr) (const char *path, const char *name, - void *value, size_t size); -static int (*real_remove) (const char* path); -static int (*real_lchown) (const char *path, uid_t owner, gid_t group); -static void (*real_rewinddir) (DIR *dirp); -static void (*real_seekdir) (DIR *dirp, off_t offset); -static off_t (*real_telldir) (DIR *dirp); - -static ssize_t (*real_sendfile) (int out_fd, int in_fd, off_t *offset, - size_t count); -static ssize_t (*real_sendfile64) (int out_fd, int in_fd, off_t *offset, - size_t count); -static int (*real_fcntl) (int fd, int cmd, ...); -static int (*real_chdir) (const char *path); -static int (*real_fchdir) (int fd); -static char * (*real_getcwd) (char *buf, size_t size); -static int (*real_truncate) (const char *path, off_t length); -static int (*real_truncate64) (const char *path, loff_t length); -static int (*real_setxattr) (const char *path, const char *name, - const void *value, size_t size, int flags); -static int (*real_lsetxattr) (const char *path, const char *name, - const void *value, size_t size, int flags); -static int (*real_fsetxattr) (int filedes, const char *name, - const void *value, size_t size, int flags); - - -#define RESOLVE(sym) do { \ - if (!real_##sym) \ - real_##sym = dlsym (RTLD_NEXT, #sym); \ - } while (0) - -/*TODO: set proper value */ -#define MOUNT_HASH_SIZE 256 - -struct booster_mount { - dev_t st_dev; - glusterfs_handle_t handle; - struct list_head device_list; -}; -typedef struct booster_mount booster_mount_t; - -static booster_fdtable_t *booster_fdtable = NULL; - -extern int booster_configure (char *confpath); -/* This is dup'ed every time VMP open/creat wants a new fd. - * This is needed so we occupy an entry in the process' file - * table. - */ -int process_piped_fd = -1; - -static int -booster_get_process_fd () -{ - return real_dup (process_piped_fd); -} - -/* The following two define which file contains - * the FSTAB configuration for VMP-based usage. - */ -#define DEFAULT_BOOSTER_CONF CONFDIR"/booster.conf" -#define BOOSTER_CONF_ENV_VAR "GLUSTERFS_BOOSTER_FSTAB" - - -/* The following define which log file is used when - * using the old mount point bypass approach. - */ -#define BOOSTER_DEFAULT_LOG CONFDIR"/booster.log" -#define BOOSTER_LOG_ENV_VAR "GLUSTERFS_BOOSTER_LOG" - -void -do_open (int fd, const char *pathname, int flags, mode_t mode, booster_op_t op) -{ - char *specfile = NULL; - char *mount_point = NULL; - int32_t size = 0; - int32_t ret = -1; - FILE *specfp = NULL; - glusterfs_file_t fh = NULL; - char *logfile = NULL; - glusterfs_init_params_t iparams = { - .loglevel = "error", - .lookup_timeout = 600, - .stat_timeout = 600, - }; - - gf_log ("booster", GF_LOG_DEBUG, "Opening using MPB: %s", pathname); - size = fgetxattr (fd, "user.glusterfs-booster-volfile", NULL, 0); - if (size == -1) { - gf_log ("booster", GF_LOG_ERROR, "Xattr " - "user.glusterfs-booster-volfile not found: %s", - strerror (errno)); - goto out; - } - - specfile = calloc (1, size); - if (!specfile) { - gf_log ("booster", GF_LOG_ERROR, "Memory allocation failed"); - goto out; - } - - ret = fgetxattr (fd, "user.glusterfs-booster-volfile", specfile, - size); - if (ret == -1) { - gf_log ("booster", GF_LOG_ERROR, "Xattr " - "user.glusterfs-booster-volfile not found: %s", - strerror (errno)); - goto out; - } - - specfp = tmpfile (); - if (!specfp) { - gf_log ("booster", GF_LOG_ERROR, "Temp file creation failed" - ": %s", strerror (errno)); - goto out; - } - - ret = fwrite (specfile, size, 1, specfp); - if (ret != 1) { - gf_log ("booster", GF_LOG_ERROR, "Failed to write volfile: %s", - strerror (errno)); - goto out; - } - - fseek (specfp, 0L, SEEK_SET); - - size = fgetxattr (fd, "user.glusterfs-booster-mount", NULL, 0); - if (size == -1) { - gf_log ("booster", GF_LOG_ERROR, "Xattr " - "user.glusterfs-booster-mount not found: %s", - strerror (errno)); - goto out; - } - - mount_point = calloc (size, sizeof (char)); - if (!mount_point) { - gf_log ("booster", GF_LOG_ERROR, "Memory allocation failed"); - goto out; - } - - ret = fgetxattr (fd, "user.glusterfs-booster-mount", mount_point, size); - if (ret == -1) { - gf_log ("booster", GF_LOG_ERROR, "Xattr " - "user.glusterfs-booster-mount not found: %s", - strerror (errno)); - goto out; - } - - logfile = getenv (BOOSTER_LOG_ENV_VAR); - if (logfile) { - if (strlen (logfile) > 0) - iparams.logfile = strdup (logfile); - else - iparams.logfile = strdup (BOOSTER_DEFAULT_LOG); - } else { - iparams.logfile = strdup (BOOSTER_DEFAULT_LOG); - } - - gf_log ("booster", GF_LOG_TRACE, "Using log-file: %s", iparams.logfile); - iparams.specfp = specfp; - - ret = glusterfs_mount (mount_point, &iparams); - if (ret == -1) { - if (errno != EEXIST) { - gf_log ("booster", GF_LOG_ERROR, "Mount failed over" - " glusterfs"); - goto out; - } else - gf_log ("booster", GF_LOG_ERROR, "Already mounted"); - } - - switch (op) { - case BOOSTER_OPEN: - gf_log ("booster", GF_LOG_TRACE, "Booster open call"); - fh = glusterfs_open (pathname, flags, mode); - break; - - case BOOSTER_CREAT: - gf_log ("booster", GF_LOG_TRACE, "Booster create call"); - fh = glusterfs_creat (pathname, mode); - break; - } - - if (!fh) { - gf_log ("booster", GF_LOG_ERROR, "Error performing operation"); - goto out; - } - - if (booster_fd_unused_get (booster_fdtable, fh, fd) == -1) { - gf_log ("booster", GF_LOG_ERROR, "Failed to get unused FD"); - goto out; - } - fh = NULL; - -out: - if (specfile) { - free (specfile); - } - - if (specfp) { - fclose (specfp); - } - - if (mount_point) { - free (mount_point); - } - - if (fh) { - glusterfs_close (fh); - } - - return; -} - -int -vmp_open (const char *pathname, int flags, ...) -{ - mode_t mode = 0; - int fd = -1; - glusterfs_file_t fh = NULL; - va_list ap; - - if (flags & GF_O_CREAT) { - va_start (ap, flags); - mode = va_arg (ap, mode_t); - va_end (ap); - - fh = glusterfs_open (pathname, flags, mode); - } - else - fh = glusterfs_open (pathname, flags); - - if (!fh) { - gf_log ("booster", GF_LOG_ERROR, "VMP open failed"); - goto out; - } - - fd = booster_get_process_fd (); - if (fd == -1) { - gf_log ("booster", GF_LOG_ERROR, "Failed to create open fd"); - goto fh_close_out; - } - - if (booster_fd_unused_get (booster_fdtable, fh, fd) == -1) { - gf_log ("booster", GF_LOG_ERROR, "Failed to map fd into table"); - goto realfd_close_out; - } - - return fd; - -realfd_close_out: - real_close (fd); - fd = -1; - -fh_close_out: - glusterfs_close (fh); - -out: - return fd; -} - -#define BOOSTER_USE_OPEN64 1 -#define BOOSTER_DONT_USE_OPEN64 0 - -int -booster_open (const char *pathname, int use64, int flags, ...) -{ - int ret = -1; - mode_t mode = 0; - va_list ap; - int (*my_open) (const char *pathname, int flags, ...); - - if (!pathname) { - errno = EINVAL; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "Open: %s", pathname); - /* First try opening through the virtual mount point. - * The difference lies in the fact that: - * 1. We depend on libglusterfsclient library to perform - * the translation from the path to handle. - * 2. We do not go to the file system for the fd, instead - * we use booster_get_process_fd (), which returns a dup'ed - * fd of a pipe created in booster_init. - */ - if (flags & GF_O_CREAT) { - va_start (ap, flags); - mode = va_arg (ap, mode_t); - va_end (ap); - ret = vmp_open (pathname, flags, mode); - } - else - ret = vmp_open (pathname, flags); - - /* We receive an ENODEV if the VMP does not exist. If we - * receive an error other than ENODEV, it means, there - * actually was an error performing vmp_open. This must - * be returned to the user. - */ - if ((ret < 0) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "Error in opening file over " - " VMP: %s", strerror (errno)); - goto out; - } - - if (ret > 0) { - gf_log ("booster", GF_LOG_TRACE, "File opened"); - goto out; - } - - if (use64) { - gf_log ("booster", GF_LOG_TRACE, "Using 64-bit open"); - my_open = real_open64; - } else { - gf_log ("booster", GF_LOG_TRACE, "Using 32-bit open"); - my_open = real_open; - } - - /* It is possible the RESOLVE macro is not able - * to resolve the symbol of a function, in that case - * we dont want to seg-fault on calling a NULL functor. - */ - if (my_open == NULL) { - gf_log ("booster", GF_LOG_ERROR, "open not resolved"); - ret = -1; - errno = ENOSYS; - goto out; - } - - if (flags & GF_O_CREAT) { - va_start (ap, flags); - mode = va_arg (ap, mode_t); - va_end (ap); - - ret = my_open (pathname, flags, mode); - } else - ret = my_open (pathname, flags); - - if (ret != -1) { - do_open (ret, pathname, flags, mode, BOOSTER_OPEN); - } - -out: - return ret; -} - -/* This is done to over-write existing definitions of open and open64 inside - * libc with our own copies. __REDIRECT is provided by libc. - * - * XXX: This will not work anywhere other than libc based systems. - */ -int __REDIRECT (booster_false_open, (__const char *__file, int __oflag, ...), - open) __nonnull ((1)); -int __REDIRECT (booster_false_open64, (__const char *__file, int __oflag, ...), - open64) __nonnull ((1)); -int -booster_false_open (const char *pathname, int flags, ...) -{ - int ret; - mode_t mode = 0; - va_list ap; - - if (flags & GF_O_CREAT) { - va_start (ap, flags); - mode = va_arg (ap, mode_t); - va_end (ap); - - ret = booster_open (pathname, BOOSTER_DONT_USE_OPEN64, flags, - mode); - } - else - ret = booster_open (pathname, BOOSTER_DONT_USE_OPEN64, flags); - - return ret; -} - -int -booster_false_open64 (const char *pathname, int flags, ...) -{ - int ret; - mode_t mode = 0; - va_list ap; - - if (flags & GF_O_CREAT) { - va_start (ap, flags); - mode = va_arg (ap, mode_t); - va_end (ap); - - ret = booster_open (pathname, BOOSTER_USE_OPEN64, flags, mode); - } - else - ret = booster_open (pathname, BOOSTER_USE_OPEN64, flags); - - return ret; -} - -int -vmp_creat (const char *pathname, mode_t mode) -{ - int fd = -1; - glusterfs_file_t fh = NULL; - - fh = glusterfs_creat (pathname, mode); - if (!fh) { - gf_log ("booster", GF_LOG_ERROR, "Create failed: %s: %s", - pathname, strerror (errno)); - goto out; - } - - fd = booster_get_process_fd (); - if (fd == -1) { - gf_log ("booster", GF_LOG_ERROR, "Failed to create fd"); - goto close_out; - } - - if ((booster_fd_unused_get (booster_fdtable, fh, fd)) == -1) { - gf_log ("booster", GF_LOG_ERROR, "Failed to map unused fd"); - goto real_close_out; - } - - return fd; - -real_close_out: - real_close (fd); - fd = -1; - -close_out: - glusterfs_close (fh); - -out: - return -1; -} - -int __REDIRECT (booster_false_creat, (const char *pathname, mode_t mode), - creat) __nonnull ((1)); -int __REDIRECT (booster_false_creat64, (const char *pathname, mode_t mode), - creat64) __nonnull ((1)); - -int -booster_false_creat (const char *pathname, mode_t mode) -{ - int ret = -1; - if (!pathname) { - errno = EINVAL; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "Create: %s", pathname); - ret = vmp_creat (pathname, mode); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "VMP create failed: %s", - strerror (errno)); - goto out; - } - - if (ret > 0) { - gf_log ("booster", GF_LOG_TRACE, "File created"); - goto out; - } - - if (real_creat == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real_creat (pathname, mode); - - if (ret != -1) { - do_open (ret, pathname, GF_O_WRONLY | GF_O_TRUNC, mode, - BOOSTER_CREAT); - } else - gf_log ("booster", GF_LOG_ERROR, "real create failed: %s", - strerror (errno)); - -out: - return ret; -} - - -int -booster_false_creat64 (const char *pathname, mode_t mode) -{ - int ret = -1; - if (!pathname) { - errno = EINVAL; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "Create: %s", pathname); - ret = vmp_creat (pathname, mode); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "VMP create failed: %s", - strerror (errno)); - goto out; - } - - if (ret > 0) { - gf_log ("booster", GF_LOG_TRACE, "File created"); - goto out; - } - - if (real_creat64 == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real_creat64 (pathname, mode); - - if (ret != -1) { - do_open (ret, pathname, GF_O_WRONLY | GF_O_TRUNC, mode, - BOOSTER_CREAT); - } else - gf_log ("booster", GF_LOG_ERROR, "real create failed: %s", - strerror (errno)); - -out: - return ret; -} - - -/* pread */ - -ssize_t -pread (int fd, void *buf, size_t count, unsigned long offset) -{ - ssize_t ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "pread: fd %d, count %lu, offset %lu" - ,fd, (long unsigned)count, offset); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not booster fd"); - if (real_pread == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_pread (fd, buf, count, offset); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_pread (glfs_fd, buf, count, offset); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -ssize_t -pread64 (int fd, void *buf, size_t count, uint64_t offset) -{ - ssize_t ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "pread64: fd %d, count %lu, offset %" - PRIu64, fd, (long unsigned)count, offset); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not booster fd"); - if (real_pread64 == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_pread64 (fd, buf, count, offset); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_pread (glfs_fd, buf, count, offset); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -ssize_t -read (int fd, void *buf, size_t count) -{ - int ret; - glusterfs_file_t glfs_fd; - - gf_log ("booster", GF_LOG_TRACE, "read: fd %d, count %lu", fd, - (long unsigned)count); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not booster fd"); - if (real_read == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_read (fd, buf, count); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_read (glfs_fd, buf, count); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -ssize_t -readv (int fd, const struct iovec *vector, int count) -{ - int ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "readv: fd %d, iovecs %d", fd, count); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_readv == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_readv (fd, vector, count); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_readv (glfs_fd, vector, count); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -ssize_t -write (int fd, const void *buf, size_t count) -{ - int ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "write: fd %d, count %"GF_PRI_SIZET, - fd, count); - - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_write == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_write (fd, buf, count); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_write (glfs_fd, buf, count); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - -ssize_t -writev (int fd, const struct iovec *vector, int count) -{ - int ret = 0; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "writev: fd %d, iovecs %d", fd, count); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_writev == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_writev (fd, vector, count); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_writev (glfs_fd, vector, count); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -ssize_t -pwrite (int fd, const void *buf, size_t count, unsigned long offset) -{ - int ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "pwrite: fd %d, count %"GF_PRI_SIZET - ", offset %lu", fd, count, offset); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_pwrite == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_pwrite (fd, buf, count, offset); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_pwrite (glfs_fd, buf, count, offset); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -ssize_t -pwrite64 (int fd, const void *buf, size_t count, uint64_t offset) -{ - int ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "pwrite64: fd %d, count %"GF_PRI_SIZET - ", offset %"PRIu64, fd, count, offset); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_pwrite64 == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_pwrite64 (fd, buf, count, offset); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_pwrite (glfs_fd, buf, count, offset); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -int -close (int fd) -{ - int ret = -1; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "close: fd %d", fd); - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - if (glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - booster_fd_put (booster_fdtable, fd); - ret = glusterfs_close (glfs_fd); - booster_fdptr_put (glfs_fd); - } - - ret = real_close (fd); - - return ret; -} - -#ifndef _LSEEK_DECLARED -#define _LSEEK_DECLARED -off_t -lseek (int filedes, unsigned long offset, int whence) -{ - int ret; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "lseek: fd %d, offset %ld", - filedes, offset); - - glfs_fd = booster_fdptr_get (booster_fdtable, filedes); - if (glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_lseek (glfs_fd, offset, whence); - booster_fdptr_put (glfs_fd); - } else { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_lseek == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_lseek (filedes, offset, whence); - } - - return ret; -} -#endif - -off_t -lseek64 (int filedes, uint64_t offset, int whence) -{ - int ret; - glusterfs_file_t glfs_fd = 0; - - - gf_log ("booster", GF_LOG_TRACE, "lseek: fd %d, offset %"PRIu64, - filedes, offset); - glfs_fd = booster_fdptr_get (booster_fdtable, filedes); - if (glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_lseek (glfs_fd, offset, whence); - booster_fdptr_put (glfs_fd); - } else { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_lseek64 == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_lseek64 (filedes, offset, whence); - } - - return ret; -} - -int -dup (int oldfd) -{ - int ret = -1, new_fd = -1; - glusterfs_file_t glfs_fd = 0; - - gf_log ("booster", GF_LOG_TRACE, "dup: fd %d", oldfd); - glfs_fd = booster_fdptr_get (booster_fdtable, oldfd); - new_fd = real_dup (oldfd); - - if (new_fd >=0 && glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = booster_fd_unused_get (booster_fdtable, glfs_fd, - new_fd); - fd_ref ((fd_t *)glfs_fd); - if (ret == -1) { - gf_log ("booster", GF_LOG_ERROR,"Failed to map new fd"); - real_close (new_fd); - } - } - - if (glfs_fd) { - booster_fdptr_put (glfs_fd); - } - - return new_fd; -} - - -int -dup2 (int oldfd, int newfd) -{ - int ret = -1; - glusterfs_file_t old_glfs_fd = NULL, new_glfs_fd = NULL; - - if (oldfd == newfd) { - return newfd; - } - - old_glfs_fd = booster_fdptr_get (booster_fdtable, oldfd); - new_glfs_fd = booster_fdptr_get (booster_fdtable, newfd); - - ret = real_dup2 (oldfd, newfd); - if (ret >= 0) { - if (new_glfs_fd) { - glusterfs_close (new_glfs_fd); - booster_fdptr_put (new_glfs_fd); - booster_fd_put (booster_fdtable, newfd); - new_glfs_fd = 0; - } - - if (old_glfs_fd) { - ret = booster_fd_unused_get (booster_fdtable, - old_glfs_fd, newfd); - fd_ref ((fd_t *)old_glfs_fd); - if (ret == -1) { - real_close (newfd); - } - } - } - - if (old_glfs_fd) { - booster_fdptr_put (old_glfs_fd); - } - - if (new_glfs_fd) { - booster_fdptr_put (new_glfs_fd); - } - - return ret; -} - -int -mkdir (const char *pathname, mode_t mode) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "mkdir: path %s", pathname); - ret = glusterfs_mkdir (pathname, mode); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "mkdir failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "directory created"); - return ret; - } - - if (real_mkdir == NULL) { - ret = -1; - errno = ENOSYS; - } else - ret = real_mkdir (pathname, mode); - - return ret; -} - -int -rmdir (const char *pathname) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "rmdir: path %s", pathname); - ret = glusterfs_rmdir (pathname); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "rmdir failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "directory removed"); - return ret; - } - - if (real_rmdir == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_rmdir (pathname); - - return ret; -} - -int -chmod (const char *pathname, mode_t mode) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "chmod: path %s", pathname); - ret = glusterfs_chmod (pathname, mode); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "chmod failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "chmod succeeded"); - return ret; - } - - if (real_chmod == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_chmod (pathname, mode); - - return ret; -} - -int -chown (const char *pathname, uid_t owner, gid_t group) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "chown: path: %s", pathname); - ret = glusterfs_chown (pathname, owner, group); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "chown failed: %s\n", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "chown succeeded"); - return ret; - } - - if (real_chown == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_chown (pathname, owner, group); - - return ret; -} - -int -fchown (int fd, uid_t owner, gid_t group) -{ - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fchown: fd %d, uid %d, gid %d", fd, - owner, group); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_fchown == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_fchown (fd, owner, group); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fchown (fh, owner, group); - booster_fdptr_put (fh); - } - - return ret; -} - - -#define MOUNT_TABLE_HASH_SIZE 256 - - -static void booster_cleanup (void); -static int -booster_init (void) -{ - char *booster_conf_path = NULL; - int ret = -1; - int pipefd[2]; - - booster_fdtable = booster_fdtable_alloc (); - if (!booster_fdtable) { - fprintf (stderr, "cannot allocate fdtable: %s\n", - strerror (errno)); - goto err; - } - - if (pipe (pipefd) == -1) { - gf_log ("booster-fstab", GF_LOG_ERROR, "Pipe creation failed:%s" - , strerror (errno)); - goto err; - } - - process_piped_fd = pipefd[0]; - real_close (pipefd[1]); - /* libglusterfsclient based VMPs should be inited only - * after the file tables are inited so that if the socket - * calls use the fd based syscalls, the fd tables are - * correctly initialized to return a NULL handle, on which the - * socket calls will fall-back to the real API. - */ - booster_conf_path = getenv (BOOSTER_CONF_ENV_VAR); - if (booster_conf_path != NULL) { - if (strlen (booster_conf_path) > 0) - ret = booster_configure (booster_conf_path); - else { - gf_log ("booster", GF_LOG_ERROR, "%s not defined, " - "using default path: %s", BOOSTER_CONF_ENV_VAR, - DEFAULT_BOOSTER_CONF); - ret = booster_configure (DEFAULT_BOOSTER_CONF); - } - } else { - gf_log ("booster", GF_LOG_ERROR, "%s not defined, using default" - " path: %s", BOOSTER_CONF_ENV_VAR,DEFAULT_BOOSTER_CONF); - ret = booster_configure (DEFAULT_BOOSTER_CONF); - } - - atexit (booster_cleanup); - if (ret == 0) - gf_log ("booster", GF_LOG_DEBUG, "booster is inited"); - return 0; - -err: - /* Sure we return an error value here - * but who cares about booster. - */ - return -1; -} - - -static void -booster_cleanup (void) -{ - /* Ideally, we should be de-initing the fd-table - * here but the problem is that I've seen file accesses through booster - * continuing while the atexit registered function is called. That means - * , we cannot dealloc the fd-table since then there could be a crash - * while trying to determine whether a given fd is for libc or for - * libglusterfsclient. - * We should be satisfied with having cleaned up glusterfs contexts. - */ - glusterfs_umount_all (); - glusterfs_reset (); -} - -int -fchmod (int fd, mode_t mode) -{ - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fchmod: fd %d, mode: 0x%x", fd, mode); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_fchmod == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_fchmod (fd, mode); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fchmod (fh, mode); - booster_fdptr_put (fh); - } - - return ret; -} - -int -fsync (int fd) -{ - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fsync: fd %d", fd); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_fsync == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_fsync (fd); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fsync (fh); - booster_fdptr_put (fh); - } - - return ret; -} - -int __REDIRECT (booster_false_ftruncate, (int fd, off_t length), - ftruncate); -int __REDIRECT (booster_false_ftruncate64, (int fd, loff_t length), - ftruncate64); - -int -booster_false_ftruncate (int fd, off_t length) -{ - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "ftruncate: fd %d, length: %"PRIu64,fd - , length); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_ftruncate == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_ftruncate (fd, length); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_ftruncate (fh, length); - booster_fdptr_put (fh); - } - - return ret; -} - -int -booster_false_ftruncate64 (int fd, loff_t length) -{ - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "ftruncate: fd %d, length: %"PRIu64,fd - , length); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_ftruncate == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_ftruncate64 (fd, length); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_ftruncate (fh, length); - booster_fdptr_put (fh); - } - - return ret; -} - -int -link (const char *old, const char *new) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "link: old: %s, new: %s", old, new); - ret = glusterfs_link (old, new); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "Link failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "link call succeeded"); - return ret; - } - - if (real_link == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_link (old, new); - - return ret; -} - -int -rename (const char *old, const char *new) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "link: old: %s, new: %s", old, new); - ret = glusterfs_rename (old, new); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "Rename failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "Rename succeeded"); - return ret; - } - - if (real_rename == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_rename (old, new); - - return ret; -} - -int -utimes (const char *path, const struct timeval times[2]) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "utimes: path %s", path); - ret = glusterfs_utimes (path, times); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "utimes failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "utimes succeeded"); - return ret; - } - - if (real_utimes == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_utimes (path, times); - - return ret; -} - -int -utime (const char *path, const struct utimbuf *buf) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "utime: path %s", path); - ret = glusterfs_utime (path, buf); - - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "utime failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "utime succeeded"); - return ret; - } - - if (real_utime == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_utime (path, buf); - - return ret; -} - -int -mknod (const char *path, mode_t mode, dev_t dev) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "mknod: path %s", path); - ret = glusterfs_mknod (path, mode, dev); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "mknod failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "mknod succeeded"); - return ret; - } - - if (real_mknod) { - errno = ENOSYS; - ret = -1; - } else - ret = real_mknod (path, mode, dev); - - return ret; -} - -int -mkfifo (const char *path, mode_t mode) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "mkfifo: path %s", path); - ret = glusterfs_mkfifo (path, mode); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "mkfifo failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "mkfifo succeeded"); - return ret; - } - - if (real_mkfifo == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_mkfifo (path, mode); - - return ret; -} - -int -unlink (const char *path) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "unlink: path %s", path); - ret = glusterfs_unlink (path); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "unlink failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "unlink succeeded"); - return ret; - } - - if (real_unlink == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_unlink (path); - - return ret; -} - -int -symlink (const char *oldpath, const char *newpath) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "symlink: old: %s, new: %s", - oldpath, newpath); - ret = glusterfs_symlink (oldpath, newpath); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "symlink failed: %s", - strerror (errno)); - return ret; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "symlink succeeded"); - return ret; - } - - if (real_symlink == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_symlink (oldpath, newpath); - - return ret; -} - -int -readlink (const char *path, char *buf, size_t bufsize) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "readlink: path %s", path); - ret = glusterfs_readlink (path, buf, bufsize); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "readlink failed: %s", - strerror (errno)); - return ret; - } - - if (ret > 0) { - gf_log ("booster", GF_LOG_TRACE, "readlink succeeded"); - return ret; - } - - if (real_readlink == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_readlink (path, buf, bufsize); - - return ret; -} - -char * -realpath (const char *path, char *resolved_path) -{ - char *res = NULL; - - gf_log ("booster", GF_LOG_TRACE, "realpath: path %s", path); - res = glusterfs_realpath (path, resolved_path); - if ((res == NULL) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "realpath failed: %s", - strerror (errno)); - return res; - } - - if (res != NULL) { - gf_log ("booster", GF_LOG_TRACE, "realpath succeeded"); - return res; - } - - if (real_realpath == NULL) { - errno = ENOSYS; - res = NULL; - } else - res = real_realpath (path, resolved_path); - - return res; -} - -#define BOOSTER_GL_DIR 1 -#define BOOSTER_POSIX_DIR 2 - -struct booster_dir_handle { - int type; - void *dirh; -}; - -DIR * -opendir (const char *path) -{ - glusterfs_dir_t gdir = NULL; - struct booster_dir_handle *bh = NULL; - DIR *pdir = NULL; - - gf_log ("booster", GF_LOG_TRACE, "opendir: path: %s", path); - bh = calloc (1, sizeof (struct booster_dir_handle)); - if (!bh) { - gf_log ("booster", GF_LOG_ERROR, "memory allocation failed"); - errno = ENOMEM; - goto out; - } - - gdir = glusterfs_opendir (path); - if (gdir) { - gf_log ("booster", GF_LOG_TRACE, "Gluster dir opened"); - bh->type = BOOSTER_GL_DIR; - bh->dirh = (void *)gdir; - goto out; - } else if ((!gdir) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "Opendir failed"); - goto free_out; - } - - if (real_opendir == NULL) { - errno = ENOSYS; - goto free_out; - } - - pdir = real_opendir (path); - - if (pdir) { - bh->type = BOOSTER_POSIX_DIR; - bh->dirh = (void *)pdir; - goto out; - } - -free_out: - if (bh) { - free (bh); - bh = NULL; - } -out: - return (DIR *)bh; -} - -int __REDIRECT (booster_false_readdir_r, (DIR *dir, struct dirent *entry, - struct dirent **result), readdir_r) __nonnull ((1)); -int __REDIRECT (booster_false_readdir64_r, (DIR *dir, struct dirent64 *entry, - struct dirent64 **result), readdir64_r) __nonnull ((1)); - -int -booster_false_readdir_r (DIR *dir, struct dirent *entry, struct dirent **result) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - int ret = 0; - - if (!bh) { - ret = errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir_r on gluster"); - ret = glusterfs_readdir_r ((glusterfs_dir_t)bh->dirh, entry, - result); - - } else if (bh->type == BOOSTER_POSIX_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir_r on posix"); - if (real_readdir_r == NULL) { - ret = errno = ENOSYS; - goto out; - } - - ret = real_readdir_r ((DIR *)bh->dirh, entry, result); - } else { - ret = errno = EINVAL; - } - -out: - return ret; -} - -int -booster_false_readdir64_r (DIR *dir, struct dirent64 *entry, - struct dirent64 **result) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - int ret = 0; - - if (!bh) { - ret = errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir_r on gluster"); - ret = glusterfs_readdir_r ((glusterfs_dir_t)bh->dirh, - (struct dirent *)entry, - (struct dirent **)result); - } else if (bh->type == BOOSTER_POSIX_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir_r on posix"); - if (real_readdir64_r == NULL) { - ret = errno = ENOSYS; - goto out; - } - - ret = real_readdir64_r ((DIR *)bh->dirh, entry, result); - } else { - ret = errno = EINVAL; - } - -out: - return ret; -} - -struct dirent * -__REDIRECT (booster_false_readdir, (DIR *dir), readdir) __nonnull ((1)); - -struct dirent64 * -__REDIRECT (booster_false_readdir64, (DIR *dir), readdir64) __nonnull ((1)); - -struct dirent * -booster_false_readdir (DIR *dir) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - struct dirent *dirp = NULL; - - if (!bh) { - errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir on gluster"); - dirp = glusterfs_readdir ((glusterfs_dir_t)bh->dirh); - } else if (bh->type == BOOSTER_POSIX_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir on posix"); - if (real_readdir == NULL) { - errno = ENOSYS; - dirp = NULL; - goto out; - } - - dirp = real_readdir ((DIR *)bh->dirh); - } else { - dirp = NULL; - errno = EINVAL; - } - -out: - return dirp; -} - -struct dirent64 * -booster_false_readdir64 (DIR *dir) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - struct dirent64 *dirp = NULL; - - if (!bh) { - errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir on gluster"); - dirp = glusterfs_readdir ((glusterfs_dir_t)bh->dirh); - } else if (bh->type == BOOSTER_POSIX_DIR) { - gf_log ("booster", GF_LOG_TRACE, "readdir on posix"); - if (real_readdir == NULL) { - errno = ENOSYS; - dirp = NULL; - goto out; - } - - dirp = real_readdir64 ((DIR *)bh->dirh); - } else { - dirp = NULL; - errno = EINVAL; - } - -out: - return dirp; -} - -int -closedir (DIR *dh) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dh; - int ret = -1; - - if (!bh) { - errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "closedir on gluster"); - ret = glusterfs_closedir ((glusterfs_dir_t)bh->dirh); - } else if (bh->type == BOOSTER_POSIX_DIR) { - gf_log ("booster", GF_LOG_TRACE, "closedir on posix"); - if (real_closedir == NULL) { - errno = ENOSYS; - ret = -1; - } else - ret = real_closedir ((DIR *)bh->dirh); - } else { - errno = EBADF; - } - - if (ret == 0) { - free (bh); - bh = NULL; - } -out: - return ret; -} - -/* The real stat functions reside in booster_stat.c to - * prevent clash with the statX prototype and functions - * declared from sys/stat.h - */ -int -booster_xstat (int ver, const char *path, void *buf) -{ - struct stat *sbuf = (struct stat *)buf; - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "xstat: path: %s", path); - ret = glusterfs_stat (path, sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "xstat failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "xstat succeeded"); - goto out; - } - - if (real___xstat == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real___xstat (ver, path, sbuf); -out: - return ret; -} - -int -booster_xstat64 (int ver, const char *path, void *buf) -{ - int ret = -1; - struct stat64 *sbuf = (struct stat64 *)buf; - - gf_log ("booster", GF_LOG_TRACE, "xstat64: path: %s", path); - ret = glusterfs_stat (path, (struct stat *)sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "xstat64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "xstat64 succeeded"); - goto out; - } - - if (real___xstat64 == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real___xstat64 (ver, path, sbuf); -out: - return ret; -} - -int -booster_stat (const char *path, void *buf) -{ - struct stat *sbuf = (struct stat *)buf; - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "stat: path: %s", path); - ret = glusterfs_stat (path, sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "stat failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "stat succeeded"); - goto out; - } - - if (real_stat != NULL) - ret = real_stat (path, sbuf); - else if (real___xstat != NULL) - ret = real___xstat (0, path, sbuf); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - - -out: - return ret; -} - -int -booster_stat64 (const char *path, void *buf) -{ - int ret = -1; - struct stat64 *sbuf = (struct stat64 *)buf; - - gf_log ("booster", GF_LOG_TRACE, "stat64: %s", path); - ret = glusterfs_stat (path, (struct stat *)sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "stat64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "stat64 succeeded"); - goto out; - } - - if (real_stat64 != NULL) - ret = real_stat64 (path, sbuf); - else if (real___xstat64 != NULL) - ret = real___xstat64 (0, path, sbuf); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - -out: - return ret; -} - -int -booster_fxstat (int ver, int fd, void *buf) -{ - struct stat *sbuf = (struct stat *)buf; - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fxstat: fd %d", fd); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real___fxstat == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real___fxstat (ver, fd, sbuf); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fstat (fh, sbuf); - booster_fdptr_put (fh); - } - -out: - return ret; -} - -int -booster_fxstat64 (int ver, int fd, void *buf) -{ - int ret = -1; - struct stat64 *sbuf = (struct stat64 *)buf; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fxstat64: fd %d", fd); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real___fxstat64 == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - ret = real___fxstat64 (ver, fd, sbuf); - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fstat (fh, (struct stat *)sbuf); - booster_fdptr_put (fh); - } - -out: - return ret; -} - -int -booster_fstat (int fd, void *buf) -{ - struct stat *sbuf = (struct stat *)buf; - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fstat: fd %d", fd); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_fstat != NULL) - ret = real_fstat (fd, sbuf); - else if (real___fxstat != NULL) - ret = real___fxstat (0, fd, sbuf); - else { - ret = -1; - errno = ENOSYS; - goto out; - } - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fstat (fh, sbuf); - booster_fdptr_put (fh); - } - -out: - return ret; -} - -int -booster_fstat64 (int fd, void *buf) -{ - int ret = -1; - struct stat64 *sbuf = (struct stat64 *)buf; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fstat64: fd %d", fd); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_fstat64 != NULL) - ret = real_fstat64 (fd, sbuf); - else if (real___fxstat64 != NULL) - /* Not sure how portable the use of 0 for - * version number is but it works over glibc. - * We need this because, I've - * observed that all the above real* functors can be - * NULL. In that case, this is our last and only option. - */ - ret = real___fxstat64 (0, fd, sbuf); - else { - ret = -1; - errno = ENOSYS; - goto out; - } - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fstat (fh, (struct stat *)sbuf); - booster_fdptr_put (fh); - } - -out: - return ret; -} - -int -booster_lxstat (int ver, const char *path, void *buf) -{ - struct stat *sbuf = (struct stat *)buf; - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "lxstat: path %s", path); - ret = glusterfs_lstat (path, sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lxstat failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "lxstat succeeded"); - goto out; - } - - if (real___lxstat == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real___lxstat (ver, path, sbuf); -out: - return ret; -} - -int -booster_lxstat64 (int ver, const char *path, void *buf) -{ - int ret = -1; - struct stat64 *sbuf = (struct stat64 *)buf; - - gf_log ("booster", GF_LOG_TRACE, "lxstat64: path %s", path); - ret = glusterfs_lstat (path, (struct stat *)sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lxstat64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "lxstat64 succeeded"); - goto out; - } - - if (real___lxstat64 == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real___lxstat64 (ver, path, sbuf); -out: - return ret; -} - -int -booster_lstat (const char *path, void *buf) -{ - struct stat *sbuf = (struct stat *)buf; - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "lstat: path %s", path); - ret = glusterfs_lstat (path, sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lstat failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "lstat succeeded"); - goto out; - } - - if (real_lstat != NULL) - ret = real_lstat (path, sbuf); - else if (real___lxstat != NULL) - ret = real___lxstat (0, path, sbuf); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - - -out: - return ret; -} - -int -booster_lstat64 (const char *path, void *buf) -{ - int ret = -1; - struct stat64 *sbuf = (struct stat64 *)buf; - - gf_log ("booster", GF_LOG_TRACE, "lstat64: path %s", path); - ret = glusterfs_lstat (path, (struct stat *)sbuf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lstat64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "lstat64 succeeded"); - goto out; - } - - if (real_lstat64 != NULL) - ret = real_lstat64 (path, sbuf); - else if (real___lxstat64 != NULL) - ret = real___lxstat64 (0, path, sbuf); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - -out: - return ret; -} - -int -booster_statfs (const char *pathname, struct statfs *buf) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "statfs: path %s", pathname); - ret = glusterfs_statfs (pathname, buf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "statfs failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "statfs succeeded"); - goto out; - } - - if (real_statfs == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real_statfs (pathname, buf); - -out: - return ret; -} - -int -booster_statfs64 (const char *pathname, struct statfs64 *buf) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "stat64: path %s", pathname); - ret = glusterfs_statfs (pathname, (struct statfs *)buf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "statfs64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "statfs64 succeeded"); - goto out; - } - - if (real_statfs64 == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real_statfs64 (pathname, buf); - -out: - return ret; -} - -int -booster_statvfs (const char *pathname, struct statvfs *buf) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "statvfs: path %s", pathname); - ret = glusterfs_statvfs (pathname, buf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "statvfs failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "statvfs succeeded"); - goto out; - } - - if (real_statvfs == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real_statvfs (pathname, buf); - -out: - return ret; -} - -int -booster_statvfs64 (const char *pathname, struct statvfs64 *buf) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "statvfs64: path %s", pathname); - ret = glusterfs_statvfs (pathname, (struct statvfs *)buf); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "statvfs64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "statvfs64 succeeded"); - goto out; - } - - if (real_statvfs64 == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real_statvfs64 (pathname, buf); - -out: - return ret; -} - -ssize_t -getxattr (const char *path, const char *name, void *value, size_t size) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "getxattr: path %s, name %s", path, - name); - ret = glusterfs_getxattr (path, name, value, size); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "getxattr failed: %s", - strerror (errno)); - goto out; - } - - if (ret > 0) { - gf_log ("booster", GF_LOG_TRACE, "getxattr succeeded"); - return ret; - } - - if (real_getxattr == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real_getxattr (path, name, value, size); -out: - return ret; -} - - -ssize_t -lgetxattr (const char *path, const char *name, void *value, size_t size) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "lgetxattr: path %s, name %s", path, - name); - ret = glusterfs_lgetxattr (path, name, value, size); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lgetxattr failed: %s", - strerror (errno)); - - goto out; - } - - if (ret > 0) { - gf_log ("booster", GF_LOG_TRACE, "lgetxattr succeeded"); - return ret; - } - - if (real_lgetxattr == NULL) { - ret = -1; - errno = ENOSYS; - goto out; - } - - ret = real_lgetxattr (path, name, value, size); -out: - return ret; -} - -int -remove (const char *path) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "remove: %s", path); - ret = glusterfs_remove (path); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "remove failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "remove succeeded"); - goto out; - } - - if (real_remove == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real_remove (path); - -out: - return ret; -} - -int -lchown (const char *path, uid_t owner, gid_t group) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "lchown: path %s", path); - ret = glusterfs_lchown (path, owner, group); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lchown failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_ERROR, "lchown succeeded"); - goto out; - } - - if (real_lchown == NULL) { - errno = ENOSYS; - ret = -1; - goto out; - } - - ret = real_lchown (path, owner, group); - -out: - return ret; -} - -void -booster_rewinddir (DIR *dir) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - - if (!bh) { - errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "rewinddir on glusterfs"); - glusterfs_rewinddir ((glusterfs_dir_t)bh->dirh); - } else if (bh->type == BOOSTER_POSIX_DIR) { - if (real_rewinddir == NULL) { - errno = ENOSYS; - goto out; - } - gf_log ("booster", GF_LOG_TRACE, "rewinddir on posix"); - real_rewinddir ((DIR *)bh->dirh); - } else - errno = EINVAL; -out: - return; -} - -void -booster_seekdir (DIR *dir, off_t offset) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - - if (!bh) { - errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "seekdir on glusterfs"); - glusterfs_seekdir ((glusterfs_dir_t)bh->dirh, offset); - } else if (bh->type == BOOSTER_POSIX_DIR) { - if (real_seekdir == NULL) { - errno = ENOSYS; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "seekdir on posix"); - real_seekdir ((DIR *)bh->dirh, offset); - } else - errno = EINVAL; -out: - return; -} - -off_t -booster_telldir (DIR *dir) -{ - struct booster_dir_handle *bh = (struct booster_dir_handle *)dir; - off_t offset = -1; - - if (!bh) { - errno = EFAULT; - goto out; - } - - if (bh->type == BOOSTER_GL_DIR) { - gf_log ("booster", GF_LOG_TRACE, "telldir on glusterfs"); - offset = glusterfs_telldir ((glusterfs_dir_t)bh->dirh); - } else if (bh->type == BOOSTER_POSIX_DIR) { - if (real_telldir == NULL) { - errno = ENOSYS; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "telldir on posix"); - offset = real_telldir ((DIR *)bh->dirh); - } else - errno = EINVAL; -out: - return offset; -} - - -pid_t -fork (void) -{ - pid_t pid = 0; - char child = 0; - - glusterfs_log_lock (); - { - pid = real_fork (); - } - glusterfs_log_unlock (); - - child = (pid == 0); - if (child) { - booster_cleanup (); - booster_init (); - } - - return pid; -} - -ssize_t -sendfile (int out_fd, int in_fd, off_t *offset, size_t count) -{ - glusterfs_file_t in_fh = NULL; - ssize_t ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "sendfile: in fd %d, out fd %d, offset" - " %"PRIu64", count %"GF_PRI_SIZET, in_fd, out_fd, *offset, - count); - /* - * handle sendfile in booster only if in_fd corresponds to a glusterfs - * file handle - */ - in_fh = booster_fdptr_get (booster_fdtable, in_fd); - if (!in_fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_sendfile == NULL) { - errno = ENOSYS; - ret = -1; - } else { - ret = real_sendfile (out_fd, in_fd, offset, count); - } - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_sendfile (out_fd, in_fh, offset, count); - booster_fdptr_put (in_fh); - } - - return ret; -} - -ssize_t -sendfile64 (int out_fd, int in_fd, off_t *offset, size_t count) -{ - glusterfs_file_t in_fh = NULL; - ssize_t ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "sendfile64: in fd %d, out fd %d," - " offset %"PRIu64", count %"GF_PRI_SIZET, in_fd, out_fd, - *offset, count); - /* - * handle sendfile in booster only if in_fd corresponds to a glusterfs - * file handle - */ - in_fh = booster_fdptr_get (booster_fdtable, in_fd); - if (!in_fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_sendfile64 == NULL) { - errno = ENOSYS; - ret = -1; - } else { - ret = real_sendfile64 (out_fd, in_fd, offset, count); - } - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_sendfile (out_fd, in_fh, offset, count); - booster_fdptr_put (in_fh); - } - - return ret; -} - - -int -fcntl (int fd, int cmd, ...) -{ - va_list ap; - int ret = -1; - long arg = 0; - struct flock *lock = NULL; - glusterfs_file_t glfs_fd = 0; - - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - gf_log ("booster", GF_LOG_TRACE, "fcntl: fd %d, cmd %d", fd, cmd); - switch (cmd) { - case F_DUPFD: - ret = dup (fd); - break; - /* - * FIXME: Consider this case when implementing F_DUPFD, F_GETFD - * etc flags in libglusterfsclient. Commenting it out for - * timebeing since it is defined only in linux kernel - * versions >= 2.6.24. - */ - /* case F_DUPFD_CLOEXEC: */ - case F_GETFD: - if (glfs_fd != NULL) { - ret = booster_get_close_on_exec (booster_fdtable, fd) - ? FD_CLOEXEC : 0; - } else { - if (real_fcntl == NULL) { - ret = -1; - errno = ENOSYS; - } else { - ret = real_fcntl (fd, cmd); - } - } - break; - - case F_GETFL: - case F_GETOWN: - case F_GETSIG: - case F_GETLEASE: - if (glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fcntl (glfs_fd, cmd); - } else { - if (!real_fcntl) { - errno = ENOSYS; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - ret = real_fcntl (fd, cmd); - } - break; - - case F_SETFD: - if (glfs_fd != NULL) { - booster_set_close_on_exec (booster_fdtable, fd); - ret = 0; - } else { - if (real_fcntl == NULL) { - ret = -1; - errno = ENOSYS; - } else { - ret = real_fcntl (fd, cmd); - } - } - break; - - case F_SETFL: - case F_SETOWN: - case F_SETSIG: - case F_SETLEASE: - case F_NOTIFY: - va_start (ap, cmd); - arg = va_arg (ap, long); - va_end (ap); - - if (glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fcntl (glfs_fd, cmd, arg); - } else { - if (!real_fcntl) { - errno = ENOSYS; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - ret = real_fcntl (fd, cmd, arg); - } - break; - - case F_GETLK: - case F_SETLK: - case F_SETLKW: -#if F_GETLK != F_GETLK64 - case F_GETLK64: -#endif -#if F_SETLK != F_SETLK64 - case F_SETLK64: -#endif -#if F_SETLKW != F_SETLKW64 - case F_SETLKW64: -#endif - va_start (ap, cmd); - lock = va_arg (ap, struct flock *); - va_end (ap); - - if (lock == NULL) { - errno = EINVAL; - goto out; - } - - if (glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fcntl (glfs_fd, cmd, lock); - } else { - if (!real_fcntl) { - errno = ENOSYS; - goto out; - } - - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - ret = real_fcntl (fd, cmd, lock); - } - break; - - default: - errno = EINVAL; - break; - } - -out: - if (glfs_fd) { - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -int -chdir (const char *path) -{ - int ret = -1; - char cwd[PATH_MAX]; - char *res = NULL; - - gf_log ("booster", GF_LOG_TRACE, "chdir: path %s", path); - - pthread_mutex_lock (&cwdlock); - { - res = glusterfs_getcwd (cwd, PATH_MAX); - if (res == NULL) { - gf_log ("booster", GF_LOG_ERROR, "getcwd failed: %s", - strerror (errno)); - goto unlock; - } - - ret = glusterfs_chdir (path); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "chdir failed: %s", - strerror (errno)); - goto unlock; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "chdir succeeded"); - goto unlock; - } - - if (real_chdir == NULL) { - errno = ENOSYS; - ret = -1; - goto unlock; - } - - ret = real_chdir (path); - if (ret == -1) { - glusterfs_chdir (cwd); - } - } -unlock: - pthread_mutex_unlock (&cwdlock); - - return ret; -} - - -int -fchdir (int fd) -{ - int ret = -1; - glusterfs_file_t glfs_fd = 0; - char cwd[PATH_MAX]; - char *res = NULL; - - glfs_fd = booster_fdptr_get (booster_fdtable, fd); - - if (!glfs_fd) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_write == NULL) { - errno = ENOSYS; - ret = -1; - } else { - ret = real_fchdir (fd); - if (ret == 0) { - res = real_getcwd (cwd, PATH_MAX); - if (res == NULL) { - gf_log ("booster", GF_LOG_ERROR, - "getcwd failed (%s)", - strerror (errno)); - ret = -1; - } else { - glusterfs_chdir (cwd); - } - } - } - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fchdir (glfs_fd); - booster_fdptr_put (glfs_fd); - } - - return ret; -} - - -char * -getcwd (char *buf, size_t size) -{ - char *res = NULL; - - res = glusterfs_getcwd (buf, size); - if ((res == NULL) && (errno == ENODEV)) { - res = real_getcwd (buf, size); - } - - return res; -} - - -int __REDIRECT (booster_false_truncate, (const char *path, off_t length), - truncate) __nonnull ((1)); -int __REDIRECT (booster_false_truncate64, (const char *path, loff_t length), - truncate64) __nonnull ((1));; - -int -booster_false_truncate (const char *path, off_t length) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "truncate: path (%s) length (%"PRIu64 - ")", path, length); - - ret = glusterfs_truncate (path, length); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "truncate failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "truncate succeeded"); - goto out; - } - - if (real_truncate != NULL) - ret = real_truncate (path, length); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - -out: - return ret; -} - - -int -booster_false_truncate64 (const char *path, loff_t length) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "truncate64: path (%s) length " - "(%"PRIu64")", path, length); - - ret = glusterfs_truncate (path, length); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "truncate64 failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "truncate64 succeeded"); - goto out; - } - - if (real_truncate64 != NULL) - ret = real_truncate64 (path, length); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - -out: - return ret; -} - - -int -setxattr (const char *path, const char *name, const void *value, size_t size, - int flags) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "setxattr: path: %s", path); - ret = glusterfs_setxattr (path, name, value, size, flags); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "setxattr failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "setxattr succeeded"); - goto out; - } - - if (real_setxattr != NULL) - ret = real_setxattr (path, name, value, size, flags); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - -out: - return ret; -} - - -int -lsetxattr (const char *path, const char *name, const void *value, size_t size, - int flags) -{ - int ret = -1; - - gf_log ("booster", GF_LOG_TRACE, "lsetxattr: path: %s", path); - ret = glusterfs_lsetxattr (path, name, value, size, flags); - if ((ret == -1) && (errno != ENODEV)) { - gf_log ("booster", GF_LOG_ERROR, "lsetxattr failed: %s", - strerror (errno)); - goto out; - } - - if (ret == 0) { - gf_log ("booster", GF_LOG_TRACE, "lsetxattr succeeded"); - goto out; - } - - if (real_lsetxattr != NULL) - ret = real_lsetxattr (path, name, value, size, flags); - else { - errno = ENOSYS; - ret = -1; - goto out; - } - -out: - return ret; -} - - -int -fsetxattr (int fd, const char *name, const void *value, size_t size, int flags) -{ - int ret = -1; - glusterfs_file_t fh = NULL; - - gf_log ("booster", GF_LOG_TRACE, "fsetxattr: fd %d", fd); - fh = booster_fdptr_get (booster_fdtable, fd); - if (!fh) { - gf_log ("booster", GF_LOG_TRACE, "Not a booster fd"); - if (real_fsetxattr != NULL) - ret = real_fsetxattr (fd, name, value, size, flags); - else { - ret = -1; - errno = ENOSYS; - goto out; - } - } else { - gf_log ("booster", GF_LOG_TRACE, "Is a booster fd"); - ret = glusterfs_fsetxattr (fh, name, value, size, flags); - booster_fdptr_put (fh); - } - -out: - return ret; -} - - -void -booster_lib_init (void) -{ - - RESOLVE (open); - RESOLVE (open64); - RESOLVE (creat); - RESOLVE (creat64); - - RESOLVE (read); - RESOLVE (readv); - RESOLVE (pread); - RESOLVE (pread64); - - RESOLVE (write); - RESOLVE (writev); - RESOLVE (pwrite); - RESOLVE (pwrite64); - - RESOLVE (lseek); - RESOLVE (lseek64); - - RESOLVE (close); - - RESOLVE (dup); - RESOLVE (dup2); - - RESOLVE (fork); - RESOLVE (mkdir); - RESOLVE (rmdir); - RESOLVE (chmod); - RESOLVE (chown); - RESOLVE (fchmod); - RESOLVE (fchown); - RESOLVE (fsync); - RESOLVE (ftruncate); - RESOLVE (ftruncate64); - RESOLVE (link); - RESOLVE (rename); - RESOLVE (utimes); - RESOLVE (utime); - RESOLVE (mknod); - RESOLVE (mkfifo); - RESOLVE (unlink); - RESOLVE (symlink); - RESOLVE (readlink); - RESOLVE (realpath); - RESOLVE (opendir); - RESOLVE (readdir); - RESOLVE (readdir64); - RESOLVE (closedir); - RESOLVE (__xstat); - RESOLVE (__xstat64); - RESOLVE (stat); - RESOLVE (stat64); - RESOLVE (__fxstat); - RESOLVE (__fxstat64); - RESOLVE (fstat); - RESOLVE (fstat64); - RESOLVE (__lxstat); - RESOLVE (__lxstat64); - RESOLVE (lstat); - RESOLVE (lstat64); - RESOLVE (statfs); - RESOLVE (statfs64); - RESOLVE (statvfs); - RESOLVE (statvfs64); - RESOLVE (getxattr); - RESOLVE (lgetxattr); - RESOLVE (remove); - RESOLVE (lchown); - RESOLVE (rewinddir); - RESOLVE (seekdir); - RESOLVE (telldir); - RESOLVE (sendfile); - RESOLVE (sendfile64); - RESOLVE (readdir_r); - RESOLVE (readdir64_r); - RESOLVE (fcntl); - RESOLVE (chdir); - RESOLVE (fchdir); - RESOLVE (getcwd); - RESOLVE (truncate); - RESOLVE (truncate64); - RESOLVE (setxattr); - RESOLVE (lsetxattr); - RESOLVE (fsetxattr); - - /* This must be called after resolving real functions - * above so that the socket based IO calls in libglusterfsclient - * can fall back to a non-NULL real_XXX function pointer. - * Calling booster_init before resolving the names above - * results in seg-faults because the function symbols above are NULL. - */ - booster_init (); -} - diff --git a/booster/src/booster_fstab.c b/booster/src/booster_fstab.c deleted file mode 100644 index 202249cadf3..00000000000 --- a/booster/src/booster_fstab.c +++ /dev/null @@ -1,452 +0,0 @@ -/* Utilities for reading/writing fstab, mtab, etc. - Copyright (C) 1995-2000, 2001, 2002, 2003, 2006 - Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <alloca.h> -#include <stdio.h> -#include <string.h> -#include <sys/types.h> -#include "booster_fstab.h" -#include <stdlib.h> -#include <libglusterfsclient.h> -#include <errno.h> - -/* The default timeout for inode and stat cache. */ -#define BOOSTER_DEFAULT_ATTR_TIMEO 5 /* In Secs */ - -/* Prepare to begin reading and/or writing mount table entries from the - beginning of FILE. MODE is as for `fopen'. */ -glusterfs_fstab_t * -glusterfs_fstab_init (const char *file, const char *mode) -{ - glusterfs_fstab_t *handle = NULL; - handle = calloc (1, sizeof (glusterfs_fstab_t)); - if (!handle) { - gf_log ("booster-fstab", GF_LOG_ERROR, "Memory allocation" - " failed"); - goto out; - } - - gf_log ("booster-fstab", GF_LOG_DEBUG, "FSTAB file: %s", file); - FILE *result = fopen (file,mode); - if (result != NULL) { - handle->fp = result; - } else { - gf_log ("booster-fstab", GF_LOG_ERROR, "FSTAB file open failed:" - " %s", strerror (errno)); - free (handle); - handle = NULL; - } - -out: - - return handle; -} - -int -glusterfs_fstab_close (glusterfs_fstab_t *h) -{ - if (!h) - return -1; - - if (h->fp) - fclose (h->fp); - - return 0; -} - -/* Since the values in a line are separated by spaces, a name cannot - contain a space. Therefore some programs encode spaces in names - by the strings "\040". We undo the encoding when reading an entry. - The decoding happens in place. */ -static char * -decode_name (char *buf) -{ - char *rp = buf; - char *wp = buf; - - do - if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '4' - && rp[3] == '0') - { - /* \040 is a SPACE. */ - *wp++ = ' '; - rp += 3; - } - else if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '1' - && rp[3] == '1') - { - /* \011 is a TAB. */ - *wp++ = '\t'; - rp += 3; - } - else if (rp[0] == '\\' && rp[1] == '0' && rp[2] == '1' - && rp[3] == '2') - { - /* \012 is a NEWLINE. */ - *wp++ = '\n'; - rp += 3; - } - else if (rp[0] == '\\' && rp[1] == '\\') - { - /* We have to escape \\ to be able to represent all - * characters. */ - *wp++ = '\\'; - rp += 1; - } - else if (rp[0] == '\\' && rp[1] == '1' && rp[2] == '3' - && rp[3] == '4') - { - /* \134 is also \\. */ - *wp++ = '\\'; - rp += 3; - } - else - *wp++ = *rp; - while (*rp++ != '\0'); - - return buf; -} - - -/* Read one mount table entry from STREAM. Returns a pointer to storage - reused on the next call, or null for EOF or error (use feof/ferror to - check). */ -struct glusterfs_mntent * -__glusterfs_fstab_getent (FILE *stream, struct glusterfs_mntent *mp, - char *buffer, int bufsiz) -{ - char *cp; - char *head; - - do - { - char *end_ptr; - - if (fgets (buffer, bufsiz, stream) == NULL) - { - return NULL; - } - - end_ptr = strchr (buffer, '\n'); - if (end_ptr != NULL) /* chop newline */ - *end_ptr = '\0'; - else - { - /* Not the whole line was read. Do it now but forget - * it. */ - char tmp[1024]; - while (fgets (tmp, sizeof tmp, stream) != NULL) - if (strchr (tmp, '\n') != NULL) - break; - } - - head = buffer + strspn (buffer, " \t"); - /* skip empty lines and comment lines: */ - } - while (head[0] == '\0' || head[0] == '#'); - - cp = strsep (&head, " \t"); - mp->mnt_fsname = cp != NULL ? decode_name (cp) : (char *) ""; - if (head) - head += strspn (head, " \t"); - cp = strsep (&head, " \t"); - mp->mnt_dir = cp != NULL ? decode_name (cp) : (char *) ""; - if (head) - head += strspn (head, " \t"); - cp = strsep (&head, " \t"); - mp->mnt_type = cp != NULL ? decode_name (cp) : (char *) ""; - if (head) - head += strspn (head, " \t"); - cp = strsep (&head, " \t"); - mp->mnt_opts = cp != NULL ? decode_name (cp) : (char *) ""; - switch (head ? sscanf (head, " %d %d ", &mp->mnt_freq, - &mp->mnt_passno) : 0) - { - case 0: - mp->mnt_freq = 0; - case 1: - mp->mnt_passno = 0; - case 2: - break; - } - - return mp; -} - -struct glusterfs_mntent * -glusterfs_fstab_getent (glusterfs_fstab_t *h) -{ - if (!h) - return NULL; - - if (!h->fp) - return NULL; - - return __glusterfs_fstab_getent (h->fp, &h->tmpent, h->buf, - GF_MNTENT_BUFSIZE); -} - -/* We have to use an encoding for names if they contain spaces or tabs. - To be able to represent all characters we also have to escape the - backslash itself. This "function" must be a macro since we use - `alloca'. */ -#define encode_name(name) \ - do { \ - const char *rp = name; \ - \ - while (*rp != '\0') \ - if (*rp == ' ' || *rp == '\t' || *rp == '\\') \ - break; \ - else \ - ++rp; \ - \ - if (*rp != '\0') \ - { \ - /* In the worst case the length of the string \ - * can increase to four times the current \ - * length. */ \ - char *wp; \ - \ - rp = name; \ - name = wp = (char *) alloca (strlen (name) * 4 + 1); \ - \ - do { \ - if (*rp == ' ') \ - { \ - *wp++ = '\\'; \ - *wp++ = '0'; \ - *wp++ = '4'; \ - *wp++ = '0'; \ - } \ - else if (*rp == '\t') \ - { \ - *wp++ = '\\'; \ - *wp++ = '0'; \ - *wp++ = '1'; \ - *wp++ = '1'; \ - } \ - else if (*rp == '\n') \ - { \ - *wp++ = '\\'; \ - *wp++ = '0'; \ - *wp++ = '1'; \ - *wp++ = '2'; \ - } \ - else if (*rp == '\\') \ - { \ - *wp++ = '\\'; \ - *wp++ = '\\'; \ - } \ - else \ - *wp++ = *rp; \ - } while (*rp++ != '\0'); \ - } \ - } while (0) \ - - -int -glusterfs_fstab_addent (glusterfs_fstab_t *h, - const struct glusterfs_mntent *mnt) -{ - struct glusterfs_mntent mntcopy = *mnt; - if (!h) - return -1; - - if (!h->fp) - return -1; - - if (fseek (h->fp, 0, SEEK_END)) - return -1; - - /* Encode spaces and tabs in the names. */ - encode_name (mntcopy.mnt_fsname); - encode_name (mntcopy.mnt_dir); - encode_name (mntcopy.mnt_type); - encode_name (mntcopy.mnt_opts); - - return (fprintf (h->fp, "%s %s %s %s %d %d\n", - mntcopy.mnt_fsname, - mntcopy.mnt_dir, - mntcopy.mnt_type, - mntcopy.mnt_opts, - mntcopy.mnt_freq, - mntcopy.mnt_passno) - < 0 ? 1 : 0); -} - - -/* Search MNT->mnt_opts for an option matching OPT. - Returns the address of the substring, or null if none found. */ -char * -glusterfs_fstab_hasoption (const struct glusterfs_mntent *mnt, const char *opt) -{ - const size_t optlen = strlen (opt); - char *rest = mnt->mnt_opts, *p; - - while ((p = strstr (rest, opt)) != NULL) - { - if ((p == rest || p[-1] == ',') - && (p[optlen] == '\0' || p[optlen] == '=' || p[optlen] == ',')) - return p; - - rest = strchr (p, ','); - if (rest == NULL) - break; - ++rest; - } - - return NULL; -} - -void -clean_init_params (glusterfs_init_params_t *ipars) -{ - if (!ipars) - return; - - if (ipars->volume_name) - free (ipars->volume_name); - - if (ipars->specfile) - free (ipars->specfile); - - if (ipars->logfile) - free (ipars->logfile); - - if (ipars->loglevel) - free (ipars->loglevel); - - return; -} - -char * -get_option_value (char *opt) -{ - char *val = NULL; - char *saveptr = NULL; - char *copy_opt = NULL; - char *retval = NULL; - - copy_opt = strdup (opt); - - /* Get the = before the value of the option. */ - val = index (copy_opt, '='); - if (val) { - /* Move to start of option */ - ++val; - - /* Now, to create a '\0' delimited string out of the - * options string, first get the position where the - * next option starts, that would be the next ','. - */ - saveptr = index (val, ','); - if (saveptr) - *saveptr = '\0'; - retval = strdup (val); - } - - free (copy_opt); - - return retval; -} - -void -booster_mount (struct glusterfs_mntent *ent) -{ - char *opt = NULL; - glusterfs_init_params_t ipars; - time_t timeout = BOOSTER_DEFAULT_ATTR_TIMEO; - char *timeostr = NULL; - char *endptr = NULL; - - if (!ent) - return; - - gf_log ("booster-fstab", GF_LOG_DEBUG, "Mount entry: volfile: %s," - " VMP: %s, Type: %s, Options: %s", ent->mnt_fsname, - ent->mnt_dir, ent->mnt_type, ent->mnt_opts); - if ((strcmp (ent->mnt_type, "glusterfs") != 0)) { - gf_log ("booster-fstab", GF_LOG_ERROR, "Type is not glusterfs"); - return; - } - - memset (&ipars, 0, sizeof (glusterfs_init_params_t)); - if (ent->mnt_fsname) - ipars.specfile = strdup (ent->mnt_fsname); - - opt = glusterfs_fstab_hasoption (ent, "subvolume"); - if (opt) - ipars.volume_name = get_option_value (opt); - - opt = glusterfs_fstab_hasoption (ent, "log-file"); - if (!opt) - opt = glusterfs_fstab_hasoption (ent, "logfile"); - - if (opt) - ipars.logfile = get_option_value (opt); - - opt = glusterfs_fstab_hasoption (ent, "log-level"); - if (!opt) - opt = glusterfs_fstab_hasoption (ent, "loglevel"); - - if (opt) - ipars.loglevel = get_option_value (opt); - - /* Attribute cache timeout */ - opt = glusterfs_fstab_hasoption (ent, "attr_timeout"); - if (opt) { - timeostr = get_option_value (opt); - if (timeostr) - timeout = strtol (timeostr, &endptr, 10); - } - - ipars.lookup_timeout = timeout; - ipars.stat_timeout = timeout; - - if ((glusterfs_mount (ent->mnt_dir, &ipars)) == -1) - gf_log ("booster-fstab", GF_LOG_ERROR, "VMP mounting failed"); - - clean_init_params (&ipars); -} - -int -booster_configure (char *confpath) -{ - int ret = -1; - glusterfs_fstab_t *handle = NULL; - struct glusterfs_mntent *ent = NULL; - - if (!confpath) - goto out; - - handle = glusterfs_fstab_init (confpath, "r"); - if (!handle) - goto out; - - while ((ent = glusterfs_fstab_getent (handle)) != NULL) - booster_mount (ent); - - glusterfs_fstab_close (handle); - ret = 0; -out: - return ret; -} - - diff --git a/booster/src/booster_fstab.h b/booster/src/booster_fstab.h deleted file mode 100644 index 9bab04c5aa0..00000000000 --- a/booster/src/booster_fstab.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Utilities for reading/writing fstab, mtab, etc. - Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#ifndef GLUSTERFS_FSTAB_MNTENT_H -#define GLUSTERFS_FSTAB_MNTENT_H 1 -#ifndef _CONFIG_H -#define _CONFIG_H -#include "config.h" -#endif - -#include "compat.h" - -/* General filesystem types. */ -#define GF_MNTTYPE_IGNORE "ignore" /* Ignore this entry. */ -#define GF_MNTTYPE_NFS "nfs" /* Network file system. */ -#define GF_MNTTYPE_SWAP "swap" /* Swap device. */ - - -/* Generic mount options. */ -#define GF_MNTOPT_DEFAULTS "defaults" /* Use all default options. */ -#define GF_MNTOPT_RO "ro" /* Read only. */ -#define GF_MNTOPT_RW "rw" /* Read/write. */ -#define GF_MNTOPT_SUID "suid" /* Set uid allowed. */ -#define GF_MNTOPT_NOSUID "nosuid" /* No set uid allowed. */ -#define GF_MNTOPT_NOAUTO "noauto" /* Do not auto mount. */ - - -/* Structure describing a mount table entry. */ -struct glusterfs_mntent -{ - char *mnt_fsname; /* Device or server for filesystem. */ - char *mnt_dir; /* Directory mounted on. */ - char *mnt_type; /* Type of filesystem: ufs, nfs, etc. */ - char *mnt_opts; /* Comma-separated options for fs. */ - int mnt_freq; /* Dump frequency (in days). */ - int mnt_passno; /* Pass number for `fsck'. */ -}; - -#define GF_MNTENT_BUFSIZE 1024 -typedef struct glusterfs_fstab_handle { - FILE *fp; - char buf[GF_MNTENT_BUFSIZE]; - struct glusterfs_mntent tmpent; -}glusterfs_fstab_t; - - -/* Prepare to begin reading and/or writing mount table entries from the - beginning of FILE. MODE is as for `fopen'. */ -extern glusterfs_fstab_t *glusterfs_fstab_init (const char *file, - const char *mode); - -extern struct glusterfs_mntent *glusterfs_fstab_getent (glusterfs_fstab_t *h); - -/* Write the mount table entry described by MNT to STREAM. - Return zero on success, nonzero on failure. */ -extern int glusterfs_fstab_addent (glusterfs_fstab_t *h, - const struct glusterfs_mntent *mnt); - -/* Close a stream opened with `glusterfs_fstab_init'. */ -extern int glusterfs_fstab_close (glusterfs_fstab_t *h); - -/* Search MNT->mnt_opts for an option matching OPT. - Returns the address of the substring, or null if none found. */ -extern char *glusterfs_fstab_hasoption (const struct glusterfs_mntent *mnt, - const char *opt); - -#endif diff --git a/booster/src/booster_stat.c b/booster/src/booster_stat.c deleted file mode 100644 index 8f76cfe37dd..00000000000 --- a/booster/src/booster_stat.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - Copyright (c) 2007-2011 Gluster, Inc. <http://www.gluster.com> - This file is part of GlusterFS. - - GlusterFS is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3 of the License, - or (at your option) any later version. - - GlusterFS is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see - <http://www.gnu.org/licenses/>. -*/ - -#include <sys/types.h> - -extern int -booster_stat (const char *path, void *buf); - -extern int -booster_stat64 (const char *path, void *buf); - -extern int -booster_xstat (int ver, const char *path, void *buf); - -extern int -booster_xstat64 (int ver, const char *path, void *buf); - -extern int -booster_fxstat (int ver, int fd, void *buf); -extern int -booster_fxstat64 (int ver, int fd, void *buf); -extern int -booster_fstat (int fd, void *buf); -extern int -booster_fstat64 (int fd, void *buf); - -extern int -booster_lstat (const char *path, void *buf); -extern int -booster_lstat64 (const char *path, void *buf); -extern int -booster_lxstat (int ver, const char *path, void *buf); -extern int -booster_lxstat64 (int ver, const char *path, void *buf); - - -extern int -booster_statfs (const char *path, void *buf); -extern int -booster_statfs64 (const char *path, void *buf); - -extern int -booster_statvfs (const char *path, void *buf); - -extern int -booster_statvfs64 (const char *path, void *buf); - -extern void * -booster_readdir (void *dir); - -extern void -booster_rewinddir (void *dir); - -extern void -booster_seekdir (void *dir, off_t offset); - -extern off_t -booster_telldir (void *dir); - -int -stat (const char *path, void *buf) -{ - return booster_stat (path, buf); -} - -int -stat64 (const char *path, void *buf) -{ - return booster_stat64 (path, buf); -} - -int -__xstat (int ver, const char *path, void *buf) -{ - return booster_xstat (ver, path, buf); -} - -int -__xstat64 (int ver, const char *path, void *buf) -{ - return booster_xstat64 (ver, path, buf); -} - -int -__fxstat (int ver, int fd, void *buf) -{ - return booster_fxstat (ver, fd, buf); -} - -int -__fxstat64 (int ver, int fd, void *buf) -{ - return booster_fxstat64 (ver, fd, buf); -} - -int -fstat (int fd, void *buf) -{ - return booster_fstat (fd, buf); -} - -int -fstat64 (int fd, void *buf) -{ - return booster_fstat64 (fd, buf); -} - -int -lstat (const char *path, void *buf) -{ - return booster_lstat (path, buf); -} - -int -lstat64 (const char *path, void *buf) -{ - return booster_lstat64 (path, buf); -} - -int -__lxstat (int ver, const char *path, void *buf) -{ - return booster_lxstat (ver, path, buf); -} - -int -__lxstat64 (int ver, const char *path, void *buf) -{ - return booster_lxstat64 (ver, path, buf); -} - -int -statfs (const char *pathname, void *buf) -{ - return booster_statfs (pathname, buf); -} - -int -statfs64 (const char *pathname, void *buf) -{ - return booster_statfs64 (pathname, buf); -} - -int -statvfs (const char *pathname, void *buf) -{ - return booster_statvfs (pathname, buf); -} - -int -statvfs64 (const char *pathname, void *buf) -{ - return booster_statvfs64 (pathname, buf); -} - -void -rewinddir (void *dir) -{ - return booster_rewinddir (dir); -} - -void -seekdir (void *dir, off_t offset) -{ - return booster_seekdir (dir, offset); -} - -off_t -telldir (void *dir) -{ - return booster_telldir (dir); -} |