summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRavishankar N <ravishankar@redhat.com>2016-08-23 12:51:57 +0530
committerPranith Kumar Karampuri <pkarampu@redhat.com>2016-08-24 14:51:47 -0700
commitbf86f46151ab93354469298560aa2bca467fdce3 (patch)
tree4463db9b58412515cbc74917da1985dcfaf2e9ec
parentc88065772c1b5c3e3a6f7b172c3471ad056d3b13 (diff)
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 <benedgar8@gmail.com> Signed-off-by: Ravishankar N <ravishankar@redhat.com> (cherry picked from commit 4aa52061a51b97c4f865b402f977b3b43f5471a7) Reviewed-on: http://review.gluster.org/15307 Smoke: Gluster Build System <jenkins@build.gluster.org> NetBSD-regression: NetBSD Build System <jenkins@build.gluster.org> CentOS-regression: Gluster Build System <jenkins@build.gluster.org> Reviewed-by: Pranith Kumar Karampuri <pkarampu@redhat.com>
-rw-r--r--xlators/features/arbiter/src/arbiter-mem-types.h1
-rw-r--r--xlators/features/arbiter/src/arbiter.c36
-rw-r--r--xlators/features/arbiter/src/arbiter.h3
3 files changed, 13 insertions, 27 deletions
diff --git a/xlators/features/arbiter/src/arbiter-mem-types.h b/xlators/features/arbiter/src/arbiter-mem-types.h
index 200b59d..ccf864c 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 92dcbea..9221c60 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 69ce9cb..58814d3 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 */