diff options
author | Ravishankar N <ravishankar@redhat.com> | 2016-08-23 12:51:57 +0530 |
---|---|---|
committer | Pranith Kumar Karampuri <pkarampu@redhat.com> | 2016-08-23 19:10:21 -0700 |
commit | 4aa52061a51b97c4f865b402f977b3b43f5471a7 (patch) | |
tree | 6c186ff714e29bf7ad3605865c9a8a2d999d4b6c /xlators/features/arbiter | |
parent | 5ce748ca45c6f2f867819400f50c9cdc12604226 (diff) |
arbiter: Fix memleak in arbiter_inode ctx
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: 1369331
Reported-by: Benjamin Edgar <benedgar8@gmail.com>
Signed-off-by: Ravishankar N <ravishankar@redhat.com>
Reviewed-on: http://review.gluster.org/15289
Smoke: Gluster Build System <jenkins@build.gluster.org>
Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
Tested-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org>
CentOS-regression: Gluster Build System <jenkins@build.gluster.org>
Diffstat (limited to 'xlators/features/arbiter')
-rw-r--r-- | xlators/features/arbiter/src/arbiter-mem-types.h | 1 | ||||
-rw-r--r-- | xlators/features/arbiter/src/arbiter.c | 36 | ||||
-rw-r--r-- | xlators/features/arbiter/src/arbiter.h | 2 |
3 files changed, 12 insertions, 27 deletions
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 786f60b7bc9..0e555c84274 100644 --- a/xlators/features/arbiter/src/arbiter.c +++ b/xlators/features/arbiter/src/arbiter.c @@ -14,15 +14,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) { @@ -39,23 +30,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 * @@ -86,7 +72,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, @@ -126,7 +112,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; @@ -148,7 +134,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); @@ -210,7 +196,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: @@ -236,7 +222,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; @@ -257,7 +243,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; @@ -278,7 +264,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 6ccc3add3b3..f52b45fad20 100644 --- a/xlators/features/arbiter/src/arbiter.h +++ b/xlators/features/arbiter/src/arbiter.h @@ -15,7 +15,7 @@ #include "common-utils.h" typedef struct arbiter_inode_ctx_ { - struct iatt *iattbuf; + struct iatt iattbuf; } arbiter_inode_ctx_t; #endif /* _ARBITER_H */ |