diff options
author | Mohit Agrawal <moagrawa@redhat.com> | 2018-02-10 12:25:15 +0530 |
---|---|---|
committer | Amar Tumballi <amarts@redhat.com> | 2018-02-27 07:11:15 +0000 |
commit | 7c3cc485054e4ede1efb358552135b432fb7047a (patch) | |
tree | 5657500860f795b7c895bce14069545d8ba463e2 /xlators/storage/posix/src/posix-inode-fd-ops.c | |
parent | 430bff7dc330eec9447423e95f2cae49744a79c3 (diff) |
glusterfsd: Memleak in glusterfsd process while brick mux is on
Problem: At the time of stopping the volume while brick multiplex is
enabled memory is not cleanup from all server side xlators.
Solution: To cleanup memory for all server side xlators call fini
in glusterfs_handle_terminate after send GF_EVENT_CLEANUP
notification to top xlator.
BUG: 1544090
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
Note: Run all test-cases in separate build (https://review.gluster.org/19574)
with same patch after enable brick mux forcefully, all test cases are
passed.
Change-Id: Ia10dc7f2605aa50f2b90b3fe4eb380ba9299e2fc
Diffstat (limited to 'xlators/storage/posix/src/posix-inode-fd-ops.c')
-rw-r--r-- | xlators/storage/posix/src/posix-inode-fd-ops.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/xlators/storage/posix/src/posix-inode-fd-ops.c b/xlators/storage/posix/src/posix-inode-fd-ops.c index f3a2a7bfb83..bca7419eee0 100644 --- a/xlators/storage/posix/src/posix-inode-fd-ops.c +++ b/xlators/storage/posix/src/posix-inode-fd-ops.c @@ -1104,6 +1104,8 @@ posix_releasedir (xlator_t *this, } priv = this->private; + if (!priv) + goto out; pthread_mutex_lock (&priv->janitor_lock); { @@ -1838,6 +1840,8 @@ posix_release (xlator_t *this, fd_t *fd) "pfd->dir is %p (not NULL) for file fd=%p", pfd->dir, fd); } + if (!priv) + goto out; pthread_mutex_lock (&priv->janitor_lock); { @@ -2025,6 +2029,7 @@ posix_setxattr (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (frame, out); VALIDATE_OR_GOTO (this, out); + VALIDATE_OR_GOTO (this->private, out); VALIDATE_OR_GOTO (loc, out); VALIDATE_OR_GOTO (dict, out); @@ -2610,6 +2615,7 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, VALIDATE_OR_GOTO (frame, out); VALIDATE_OR_GOTO (this, out); VALIDATE_OR_GOTO (loc, out); + VALIDATE_OR_GOTO (this->private, out); SET_FS_ID (frame->root->uid, frame->root->gid); MAKE_INODE_HANDLE (real_path, this, loc, NULL); @@ -2723,11 +2729,12 @@ posix_getxattr (call_frame_t *frame, xlator_t *this, goto done; } if (loc->inode && name && (XATTR_IS_PATHINFO (name))) { - if (LOC_HAS_ABSPATH (loc)) + VALIDATE_OR_GOTO (this->private, out); + if (LOC_HAS_ABSPATH (loc)) { MAKE_REAL_PATH (rpath, this, loc->path); - else + } else { rpath = real_path; - + } size = gf_asprintf (&host_buf, "<POSIX(%s):%s:%s>", priv->base_path, ((priv->node_uuid_pathinfo && @@ -4986,6 +4993,8 @@ posix_forget (xlator_t *this, inode_t *inode) struct posix_private *priv_posix = NULL; priv_posix = (struct posix_private *) this->private; + if (!priv_posix) + return 0; ret = inode_ctx_del (inode, this, &ctx_uint); if (!ctx_uint) |