diff options
author | Pranith Kumar K <pkarampu@redhat.com> | 2015-06-02 16:39:35 +0530 |
---|---|---|
committer | Raghavendra G <rgowdapp@redhat.com> | 2015-08-28 10:26:17 -0700 |
commit | e55579bdb1d04cca29f3e87427de5f2a5ab5e9b4 (patch) | |
tree | e94f93a66fccd2ac5ced8b3408c41d6a3d28b78f /libglusterfs | |
parent | dedf2bde88020adbabb80204830878f060fa614c (diff) |
fd: Do fd_bind on successful open
- fd_unref should decrement fd->inode->fd_count only if it is present in the
inode's fd list.
- successful open/opendir should perform fd_bind.
Change-Id: I81dd04f330e2fee86369a6dc7147af44f3d49169
BUG: 1207735
Signed-off-by: Pranith Kumar K <pkarampu@redhat.com>
Reviewed-on: http://review.gluster.org/11044
Reviewed-by: Anoop C S <anoopcs@redhat.com>
Tested-by: NetBSD Build System <jenkins@build.gluster.org>
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Raghavendra G <rgowdapp@redhat.com>
Diffstat (limited to 'libglusterfs')
-rw-r--r-- | libglusterfs/src/fd.c | 27 | ||||
-rw-r--r-- | libglusterfs/src/syncop-utils.c | 2 |
2 files changed, 19 insertions, 10 deletions
diff --git a/libglusterfs/src/fd.c b/libglusterfs/src/fd.c index 688357327c0..eb1e83b87a3 100644 --- a/libglusterfs/src/fd.c +++ b/libglusterfs/src/fd.c @@ -468,16 +468,12 @@ __fd_unref (fd_t *fd) --fd->refcount; - if (fd->refcount == 0) { - list_del_init (&fd->inode_list); - } - return fd; } static void -fd_destroy (fd_t *fd) +fd_destroy (fd_t *fd, gf_boolean_t bound) { xlator_t *xl = NULL; int i = 0; @@ -525,11 +521,14 @@ fd_destroy (fd_t *fd) LOCK_DESTROY (&fd->lock); GF_FREE (fd->_ctx); - LOCK (&fd->inode->lock); - { - fd->inode->fd_count--; + if (bound) { + /*Decrease the count only after close happens on file*/ + LOCK (&fd->inode->lock); + { + fd->inode->fd_count--; + } + UNLOCK (&fd->inode->lock); } - UNLOCK (&fd->inode->lock); inode_unref (fd->inode); fd->inode = NULL; fd_lk_ctx_unref (fd->lk_ctx); @@ -543,6 +542,7 @@ void fd_unref (fd_t *fd) { int32_t refcount = 0; + gf_boolean_t bound = _gf_false; if (!fd) { gf_msg_callingfn ("fd", GF_LOG_ERROR, EINVAL, @@ -554,11 +554,18 @@ fd_unref (fd_t *fd) { __fd_unref (fd); refcount = fd->refcount; + if (refcount == 0) { + if (!list_empty (&fd->inode_list)) { + list_del_init (&fd->inode_list); + bound = _gf_true; + } + } + } UNLOCK (&fd->inode->lock); if (refcount == 0) { - fd_destroy (fd); + fd_destroy (fd, bound); } return ; diff --git a/libglusterfs/src/syncop-utils.c b/libglusterfs/src/syncop-utils.c index ce60ef0c153..4e8849f06f8 100644 --- a/libglusterfs/src/syncop-utils.c +++ b/libglusterfs/src/syncop-utils.c @@ -59,6 +59,8 @@ syncop_dirfd (xlator_t *subvol, loc_t *loc, fd_t **fd, int pid) uuid_utoa (loc->gfid)); goto out; #endif /* GF_LINUX_HOST_OS */ + } else { + fd_bind (dirfd); } out: if (ret == 0) |