summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra Talur <rtalur@redhat.com>2015-04-13 17:05:44 +0530
committerRaghavendra G <rgowdapp@redhat.com>2015-07-20 03:48:19 -0700
commit175f1737fb6fe9450702556b24bf395bac97cef1 (patch)
tree1229e42fa0ebca0c82e10ff5130cf5f5afe7460a
parentbc6110fa37f1d6214d2e8cce367e0b7abd6976c3 (diff)
libglusterfs: Even anonymous fds must have fd->flags set
We do not set the same flags to anonymous fd that posix uses to open an anonymous fd in the backend. If there are any xlators which rely on these flags for their operation they may not work well. Add proper flags to anonymous fds at the time of their creation and refer to them for subsequent operations. Change-Id: Ia99b7ea7d38839f099c7b4aae3c7ead123bc8c67 BUG: 1211221 Signed-off-by: Raghavendra Talur <rtalur@redhat.com> Reviewed-on: http://review.gluster.org/10219 Tested-by: NetBSD Build System <jenkins@build.gluster.org> Reviewed-by: soumya k <skoduri@redhat.com> Reviewed-by: Poornima G <pgurusid@redhat.com> Tested-by: Gluster Build System <jenkins@build.gluster.com> Reviewed-by: Rajesh Joseph <rjoseph@redhat.com> Reviewed-by: Niels de Vos <ndevos@redhat.com> Reviewed-by: Raghavendra Bhat <raghavendra@redhat.com> Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
-rw-r--r--libglusterfs/src/fd.c4
-rw-r--r--libglusterfs/src/fd.h5
-rw-r--r--xlators/storage/posix/src/posix-helpers.c18
3 files changed, 19 insertions, 8 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c
index 7377b1e30bd..688357327c0 100644
--- a/libglusterfs/src/fd.c
+++ b/libglusterfs/src/fd.c
@@ -309,8 +309,7 @@ gf_fd_put (fdtable_t *fdtable, int32_t fd)
fd_t *fdptr = NULL;
fdentry_t *fde = NULL;
- if (fd == -2)
- /* anonymous fd */
+ if (fd == GF_ANON_FD_NO)
return;
if (fdtable == NULL || fd < 0) {
@@ -774,6 +773,7 @@ __fd_anonymous (inode_t *inode)
return NULL;
fd->anonymous = _gf_true;
+ fd->flags = GF_ANON_FD_FLAGS;
__fd_bind (fd);
diff --git a/libglusterfs/src/fd.h b/libglusterfs/src/fd.h
index 5a98ec38ca7..53ec93dec6c 100644
--- a/libglusterfs/src/fd.h
+++ b/libglusterfs/src/fd.h
@@ -20,6 +20,7 @@
#include "common-utils.h"
#define GF_ANON_FD_NO -2
+#define GF_ANON_FD_FLAGS (O_RDWR|O_LARGEFILE)
struct _inode;
struct _dict;
@@ -47,7 +48,9 @@ struct _fd {
struct _fd_ctx *_ctx;
int xl_count; /* Number of xl referred in this fd */
struct fd_lk_ctx *lk_ctx;
- gf_boolean_t anonymous; /* geo-rep anonymous fd */
+ gf_boolean_t anonymous; /* fd which does not have counterpart open
+ fd on backend (server for client, posix
+ for server). */
};
typedef struct _fd fd_t;
diff --git a/xlators/storage/posix/src/posix-helpers.c b/xlators/storage/posix/src/posix-helpers.c
index e0cb6b8a755..a89da58ef7c 100644
--- a/xlators/storage/posix/src/posix-helpers.c
+++ b/xlators/storage/posix/src/posix-helpers.c
@@ -1566,10 +1566,6 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p)
goto out;
}
- if (!fd_is_anonymous(fd))
- /* anonymous fd */
- goto out;
-
MAKE_HANDLE_PATH (real_path, this, fd->inode->gfid, NULL);
if (!real_path) {
gf_msg (this->name, GF_LOG_ERROR, 0,
@@ -1580,6 +1576,14 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p)
goto out;
}
+ if (!fd_is_anonymous(fd)) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "Failed to get fd context for a non-anonymous fd, "
+ "file: %s, gfid: %s", real_path,
+ uuid_utoa (fd->inode->gfid));
+ goto out;
+ }
+
pfd = GF_CALLOC (1, sizeof (*pfd), gf_posix_mt_posix_fd);
if (!pfd) {
goto out;
@@ -1596,8 +1600,12 @@ __posix_fd_ctx_get (fd_t *fd, xlator_t *this, struct posix_fd **pfd_p)
_fd = dirfd (dir);
}
+ /* Using fd->flags in case we choose to have anonymous
+ * fds with different flags some day. As of today it
+ * would be GF_ANON_FD_FLAGS and nothing else.
+ */
if (fd->inode->ia_type == IA_IFREG) {
- _fd = open (real_path, O_RDWR|O_LARGEFILE);
+ _fd = open (real_path, fd->flags);
if (_fd == -1) {
GF_FREE (pfd);
pfd = NULL;