From bf86f46151ab93354469298560aa2bca467fdce3 Mon Sep 17 00:00:00 2001 From: Ravishankar N Date: Tue, 23 Aug 2016 12:51:57 +0530 Subject: arbiter: Fix memleak in arbiter_inode ctx Backport of: http://review.gluster.org/#/c/15289/ Problem: The iattbuf ptr stored in arbiter's inode context was not freed during inode forget. Fix: Change it to a statically allocated value so that we don't have to deal with allocating/freeing it. Change-Id: Id1b73b8aee1fb5c4174d0734bd20e168432b1abd BUG: 1369752 Reported-by: Benjamin Edgar Signed-off-by: Ravishankar N (cherry picked from commit 4aa52061a51b97c4f865b402f977b3b43f5471a7) Reviewed-on: http://review.gluster.org/15307 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Pranith Kumar Karampuri --- xlators/features/arbiter/src/arbiter-mem-types.h | 1 - xlators/features/arbiter/src/arbiter.c | 36 ++++++++---------------- xlators/features/arbiter/src/arbiter.h | 3 +- 3 files changed, 13 insertions(+), 27 deletions(-) (limited to 'xlators') diff --git a/xlators/features/arbiter/src/arbiter-mem-types.h b/xlators/features/arbiter/src/arbiter-mem-types.h index 200b59de695..ccf864cdef0 100644 --- a/xlators/features/arbiter/src/arbiter-mem-types.h +++ b/xlators/features/arbiter/src/arbiter-mem-types.h @@ -13,7 +13,6 @@ typedef enum gf_arbiter_mem_types_ { gf_arbiter_mt_inode_ctx_t = gf_common_mt_end + 1, - gf_arbiter_mt_iatt, gf_arbiter_mt_end } gf_arbiter_mem_types_t; #endif diff --git a/xlators/features/arbiter/src/arbiter.c b/xlators/features/arbiter/src/arbiter.c index 92dcbeaf9eb..9221c60d537 100644 --- a/xlators/features/arbiter/src/arbiter.c +++ b/xlators/features/arbiter/src/arbiter.c @@ -19,15 +19,6 @@ #include "xlator.h" #include "logging.h" -void -arbiter_inode_ctx_destroy (arbiter_inode_ctx_t *ctx) -{ - if (!ctx) - return; - GF_FREE (ctx->iattbuf); - GF_FREE (ctx); -} - static arbiter_inode_ctx_t * __arbiter_inode_ctx_get (inode_t *inode, xlator_t *this) { @@ -44,23 +35,18 @@ __arbiter_inode_ctx_get (inode_t *inode, xlator_t *this) ctx = GF_CALLOC (1, sizeof (*ctx), gf_arbiter_mt_inode_ctx_t); if (!ctx) - goto fail; - ctx->iattbuf = GF_CALLOC (1, sizeof (*ctx->iattbuf), - gf_arbiter_mt_iatt); - if (!ctx->iattbuf) - goto fail; + goto out; + ret = __inode_ctx_put (inode, this, (uint64_t)ctx); if (ret) { + GF_FREE (ctx); + ctx = NULL; gf_log_callingfn (this->name, GF_LOG_ERROR, "failed to " "set the inode ctx (%s)", uuid_utoa (inode->gfid)); - goto fail; } out: return ctx; -fail: - arbiter_inode_ctx_destroy (ctx); - return NULL; } static arbiter_inode_ctx_t * @@ -91,7 +77,7 @@ arbiter_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, op_errno = ENOMEM; goto unwind; } - memcpy (ctx->iattbuf, buf, sizeof (*ctx->iattbuf)); + memcpy (&ctx->iattbuf, buf, sizeof (ctx->iattbuf)); unwind: STACK_UNWIND_STRICT (lookup, frame, op_ret, op_errno, inode, buf, @@ -131,7 +117,7 @@ arbiter_truncate (call_frame_t *frame, xlator_t *this, loc_t *loc, off_t offset, op_errno = ENOMEM; goto unwind; } - buf = ctx->iattbuf; + buf = &ctx->iattbuf; unwind: STACK_UNWIND_STRICT (truncate, frame, op_ret, op_errno, buf, buf, NULL); return 0; @@ -153,7 +139,7 @@ arbiter_ftruncate (call_frame_t *frame, xlator_t *this, fd_t *fd, off_t offset, op_errno = ENOMEM; goto unwind; } - buf = ctx->iattbuf; + buf = &ctx->iattbuf; unwind: STACK_UNWIND_STRICT (ftruncate, frame, op_ret, op_errno, buf, buf, NULL); @@ -215,7 +201,7 @@ arbiter_writev (call_frame_t *frame, xlator_t *this, fd_t *fd, op_errno = ENOMEM; goto unwind; } - buf = ctx->iattbuf; + buf = &ctx->iattbuf; op_ret = iov_length (vector, count); rsp_xdata = arbiter_fill_writev_xdata (fd, xdata, this); unwind: @@ -241,7 +227,7 @@ arbiter_fallocate (call_frame_t *frame, xlator_t *this, fd_t *fd, op_errno = ENOMEM; goto unwind; } - buf = ctx->iattbuf; + buf = &ctx->iattbuf; unwind: STACK_UNWIND_STRICT(fallocate, frame, op_ret, op_errno, buf, buf, NULL); return 0; @@ -262,7 +248,7 @@ arbiter_discard (call_frame_t *frame, xlator_t *this, fd_t *fd, op_errno = ENOMEM; goto unwind; } - buf = ctx->iattbuf; + buf = &ctx->iattbuf; unwind: STACK_UNWIND_STRICT(discard, frame, op_ret, op_errno, buf, buf, NULL); return 0; @@ -283,7 +269,7 @@ arbiter_zerofill (call_frame_t *frame, xlator_t *this, fd_t *fd, op_errno = ENOMEM; goto unwind; } - buf = ctx->iattbuf; + buf = &ctx->iattbuf; unwind: STACK_UNWIND_STRICT(zerofill, frame, op_ret, op_errno, buf, buf, NULL); return 0; diff --git a/xlators/features/arbiter/src/arbiter.h b/xlators/features/arbiter/src/arbiter.h index 69ce9cb4fa3..58814d36e62 100644 --- a/xlators/features/arbiter/src/arbiter.h +++ b/xlators/features/arbiter/src/arbiter.h @@ -16,11 +16,12 @@ #include "config.h" #endif +#include "xlator.h" #include "locking.h" #include "common-utils.h" typedef struct arbiter_inode_ctx_ { - struct iatt *iattbuf; + struct iatt iattbuf; } arbiter_inode_ctx_t; #endif /* _ARBITER_H */ -- cgit