From 652af839a0e332d081ed5a1beb58e8dc6ea88bfd Mon Sep 17 00:00:00 2001 From: Emmanuel Dreyfus Date: Thu, 26 Dec 2013 09:54:01 +0100 Subject: Use linkat() instead of link() for portability sake This is a backport of Iccd27ac076b7a74e40dcbaa1c4762fd3ad59da5f POSIX does not says wether link(2) on symlink should link on symlink itself or on target. Linux use symlink, most other systems use target. Using linkat(2) allows the behavior to be specified, so that the behavior is portable. Also fix configure test for NetBSD linkata(2), which ceased to work. BUG: 764655 Change-Id: I7cf9e62ea19c7eb356935c11b480cf637c83126b Signed-off-by: Emmanuel Dreyfus Reviewed-on: http://review.gluster.org/6594 Tested-by: Gluster Build System Reviewed-by: Vijay Bellur --- configure.ac | 2 +- libglusterfs/src/syscall.c | 5 +++++ xlators/features/index/src/index.c | 20 ++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d76c018ef..d80bd303a 100644 --- a/configure.ac +++ b/configure.ac @@ -598,7 +598,7 @@ dnl FreeBSD, NetBSD AC_CHECK_MEMBERS([struct stat.st_atimespec.tv_nsec]) case $host_os in *netbsd*) - CFLAGS+=" -D_INCOMPLETE_XOPEN_C063" + CFLAGS="${CFLAGS} -D_INCOMPLETE_XOPEN_C063" ;; esac AC_CHECK_FUNC([linkat], [have_linkat=yes]) diff --git a/libglusterfs/src/syscall.c b/libglusterfs/src/syscall.c index e8954cc23..a619f9c41 100644 --- a/libglusterfs/src/syscall.c +++ b/libglusterfs/src/syscall.c @@ -120,7 +120,12 @@ sys_rename (const char *oldpath, const char *newpath) int sys_link (const char *oldpath, const char *newpath) { +#ifdef HAVE_LINKAT + /* see HAVE_LINKAT in xlators/storage/posix/src/posix.c */ + return linkat (AT_FDCWD, oldpath, AT_FDCWD, newpath, 0); +#else return link (oldpath, newpath); +#endif } diff --git a/xlators/features/index/src/index.c b/xlators/features/index/src/index.c index 9253120f3..295f68198 100644 --- a/xlators/features/index/src/index.c +++ b/xlators/features/index/src/index.c @@ -407,7 +407,12 @@ sync_base_indices (void *index_priv) snprintf (base_index_path, PATH_MAX, "%s/%s", base_indices_holder, entry->d_name); +#ifdef HAVE_LINKAT + /* see HAVE_LINKAT in xlators/storage/posix/src/posix.c */ + ret = linkat (AT_FDCWD, xattrop_index_path, AT_FDCWD, base_index_path, 0); +#else ret = link (xattrop_index_path, base_index_path); +#endif if (ret && errno != EEXIST) goto out; @@ -543,7 +548,12 @@ index_add (xlator_t *this, uuid_t gfid, const char *subdir) index_get_index (priv, index); make_index_path (priv->index_basepath, subdir, index, index_path, sizeof (index_path)); +#ifdef HAVE_LINKAT + /* see HAVE_LINKAT in xlators/storage/posix/src/posix.c */ + ret = linkat (AT_FDCWD, index_path, AT_FDCWD, gfid_path, 0); +#else ret = link (index_path, gfid_path); +#endif if (!ret || (errno == EEXIST)) { ret = 0; index_created = 1; @@ -576,7 +586,12 @@ index_add (xlator_t *this, uuid_t gfid, const char *subdir) if (fd >= 0) close (fd); +#ifdef HAVE_LINKAT + /* see HAVE_LINKAT in xlators/storage/posix/src/posix.c */ + ret = linkat (AT_FDCWD, index_path, AT_FDCWD, gfid_path, 0); +#else ret = link (index_path, gfid_path); +#endif if (ret && (errno != EEXIST)) { gf_log (this->name, GF_LOG_ERROR, "%s: Not able to " "add to index (%s)", uuid_utoa (gfid), @@ -590,7 +605,12 @@ index_add (xlator_t *this, uuid_t gfid, const char *subdir) make_index_path (priv->index_basepath, GF_BASE_INDICES_HOLDER_GFID, index, base_path, sizeof (base_path)); +#ifdef HAVE_LINKAT + /* see HAVE_LINKAT in xlators/storage/posix/src/posix.c */ + ret = linkat (AT_FDCWD, index_path, AT_FDCWD, base_path, 0); +#else ret = link (index_path, base_path); +#endif if (ret) goto out; } -- cgit