summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghavendra G <raghavendra@gluster.com>2010-10-11 06:03:40 +0000
committerVijay Bellur <vijay@dev.gluster.com>2010-10-11 07:31:20 -0700
commit47a87215e30d3ea2dc6ec9ae178f5a9e3eae9e96 (patch)
tree5171f3eb350b2cceb1d6fce2c1177e9535d8caa8
parent2854c559340d33473750fac65aace58506951276 (diff)
features/locks: free fdctx in release.
Signed-off-by: Raghavendra G <raghavendra@gluster.com> Signed-off-by: Vijay Bellur <vijay@dev.gluster.com> BUG: 1438 (memory leaks) URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1438
-rw-r--r--xlators/features/locks/src/posix.c167
1 files changed, 103 insertions, 64 deletions
diff --git a/xlators/features/locks/src/posix.c b/xlators/features/locks/src/posix.c
index 29b3bb079b6..f03fb06e0c4 100644
--- a/xlators/features/locks/src/posix.c
+++ b/xlators/features/locks/src/posix.c
@@ -71,6 +71,45 @@ pl_new_fdctx ()
}
static pl_fdctx_t *
+pl_check_n_create_fdctx (xlator_t *this, fd_t *fd)
+{
+ int ret = 0;
+ uint64_t tmp = 0;
+ pl_fdctx_t *fdctx = NULL;
+
+ if ((this == NULL) || (fd == NULL)) {
+ goto out;
+ }
+
+ LOCK (&fd->lock);
+ {
+ ret = __fd_ctx_get (fd, this, &tmp);
+ if ((ret != 0) || (tmp == 0)) {
+ fdctx = pl_new_fdctx ();
+ if (fdctx == NULL) {
+ gf_log (this->name, GF_LOG_ERROR,
+ "out of memory");
+ goto unlock;
+ }
+ }
+
+ ret = __fd_ctx_set (fd, this, (uint64_t)(long)fdctx);
+ if (ret != 0) {
+ GF_FREE (fdctx);
+ fdctx = NULL;
+ gf_log (this->name, GF_LOG_DEBUG,
+ "failed to set fd ctx");
+ }
+ }
+unlock:
+ UNLOCK (&fd->lock);
+
+out:
+ return fdctx;
+}
+
+/*
+static pl_fdctx_t *
pl_get_fdctx (xlator_t *this, fd_t *fd)
{
int ret = 0;
@@ -109,6 +148,7 @@ out:
return ret;
}
+*/
int
pl_truncate_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
@@ -368,32 +408,17 @@ pl_opendir_cbk (call_frame_t *frame,
fd_t *fd)
{
pl_fdctx_t *fdctx = NULL;
- int ret = -1;
if (op_ret < 0)
goto unwind;
- fdctx = pl_get_fdctx (this, fd);
+ fdctx = pl_check_n_create_fdctx (this, fd);
if (!fdctx) {
- gf_log (this->name, GF_LOG_DEBUG,
- "fdctx not present");
- fdctx = pl_new_fdctx ();
- if (!fdctx) {
- gf_log (this->name, GF_LOG_ERROR,
- "Out of memory");
- op_errno = ENOMEM;
- op_ret = -1;
- goto unwind;
- }
-
- ret = pl_set_fdctx (this, fd, fdctx);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "could not set fdctx");
- op_ret = -1;
- op_errno = ENOMEM;
- goto unwind;
- }
+ gf_log (this->name, GF_LOG_ERROR,
+ "Out of memory");
+ op_errno = ENOMEM;
+ op_ret = -1;
+ goto unwind;
}
unwind:
@@ -481,32 +506,17 @@ pl_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this,
int32_t op_ret, int32_t op_errno, fd_t *fd)
{
pl_fdctx_t *fdctx = NULL;
- int ret = -1;
if (op_ret < 0)
goto unwind;
- fdctx = pl_get_fdctx (this, fd);
+ fdctx = pl_check_n_create_fdctx (this, fd);
if (!fdctx) {
- gf_log (this->name, GF_LOG_DEBUG,
- "fdctx not present");
- fdctx = pl_new_fdctx ();
- if (!fdctx) {
- gf_log (this->name, GF_LOG_ERROR,
- "Out of memory");
- op_errno = ENOMEM;
- op_ret = -1;
- goto unwind;
- }
-
- ret = pl_set_fdctx (this, fd, fdctx);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "could not set fdctx");
- op_ret = -1;
- op_errno = ENOMEM;
- goto unwind;
- }
+ gf_log (this->name, GF_LOG_ERROR,
+ "Out of memory");
+ op_errno = ENOMEM;
+ op_ret = -1;
+ goto unwind;
}
unwind:
@@ -536,32 +546,17 @@ pl_create_cbk (call_frame_t *frame, void *cookie,
struct iatt *preparent, struct iatt *postparent)
{
pl_fdctx_t *fdctx = NULL;
- int ret = -1;
if (op_ret < 0)
goto unwind;
- fdctx = pl_get_fdctx (this, fd);
+ fdctx = pl_check_n_create_fdctx (this, fd);
if (!fdctx) {
- gf_log (this->name, GF_LOG_DEBUG,
- "fdctx not present");
- fdctx = pl_new_fdctx ();
- if (!fdctx) {
- gf_log (this->name, GF_LOG_ERROR,
- "Out of memory");
- op_errno = ENOMEM;
- op_ret = -1;
- goto unwind;
- }
-
- ret = pl_set_fdctx (this, fd, fdctx);
- if (ret) {
- gf_log (this->name, GF_LOG_ERROR,
- "could not set fdctx");
- op_ret = -1;
- op_errno = ENOMEM;
- goto unwind;
- }
+ gf_log (this->name, GF_LOG_ERROR,
+ "Out of memory");
+ op_errno = ENOMEM;
+ op_ret = -1;
+ goto unwind;
}
unwind:
@@ -975,6 +970,7 @@ out:
return ret;
}
+
static int
pl_getlk_fd (xlator_t *this, pl_inode_t *pl_inode,
fd_t *fd, posix_lock_t *reqlock)
@@ -996,7 +992,7 @@ pl_getlk_fd (xlator_t *this, pl_inode_t *pl_inode,
"There are active locks on fd");
ret = fd_ctx_get (fd, this, &tmp);
- fdctx = (pl_fdctx_t *) tmp;
+ fdctx = (pl_fdctx_t *)(long) tmp;
if (list_empty (&fdctx->locks_list)) {
gf_log (this->name, GF_LOG_TRACE,
@@ -1330,6 +1326,12 @@ pl_release (xlator_t *this, fd_t *fd)
pl_inode_t *pl_inode = NULL;
uint64_t tmp_pl_inode = 0;
int ret = -1;
+ uint64_t tmp = 0;
+ pl_fdctx_t *fdctx = NULL;
+
+ if (fd == NULL) {
+ goto out;
+ }
ret = inode_ctx_get (fd->inode, this, &tmp_pl_inode);
if (ret != 0)
@@ -1344,9 +1346,45 @@ pl_release (xlator_t *this, fd_t *fd)
delete_locks_of_fd (this, pl_inode, fd);
+ ret = fd_ctx_del (fd, this, &tmp);
+ if (ret) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "Could not get fdctx");
+ goto out;
+ }
+
+ fdctx = (pl_fdctx_t *)(long)tmp;
+
+ GF_FREE (fdctx);
+out:
+ return ret;
+}
+
+int
+pl_releasedir (xlator_t *this, fd_t *fd)
+{
+ int ret = -1;
+ uint64_t tmp = 0;
+ pl_fdctx_t *fdctx = NULL;
+
+ if (fd == NULL) {
+ goto out;
+ }
+
+ ret = fd_ctx_del (fd, this, &tmp);
+ if (ret) {
+ gf_log (this->name, GF_LOG_DEBUG,
+ "Could not get fdctx");
+ goto out;
+ }
+
+ fdctx = (pl_fdctx_t *)(long)tmp;
+
+ GF_FREE (fdctx);
out:
return ret;
}
+
static int32_t
__get_posixlk_count (xlator_t *this, pl_inode_t *pl_inode)
{
@@ -1936,6 +1974,7 @@ struct xlator_dumpops dumpops = {
struct xlator_cbks cbks = {
.forget = pl_forget,
.release = pl_release,
+ .releasedir = pl_releasedir,
};