diff options
author | Amar Tumballi <amar@gluster.com> | 2011-07-08 02:55:20 +0000 |
---|---|---|
committer | Anand Avati <avati@gluster.com> | 2011-07-12 05:37:28 -0700 |
commit | fcce7c289a0c27345404ab17e2cce6e8f5ad7fc9 (patch) | |
tree | 885f6c36fcb426d25a20f7be8b4d31eccd09b05c /xlators/cluster | |
parent | fa1feca4172776ba4ae011ffa679a02055951e37 (diff) |
cluster/stripe: cleanup and memory leak fixes
Signed-off-by: Amar Tumballi <amar@gluster.com>
Signed-off-by: Anand Avati <avati@gluster.com>
BUG: 3140 (contents of files are invalid after apply patch 7573)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=3140
Diffstat (limited to 'xlators/cluster')
-rw-r--r-- | xlators/cluster/stripe/src/stripe.c | 174 |
1 files changed, 56 insertions, 118 deletions
diff --git a/xlators/cluster/stripe/src/stripe.c b/xlators/cluster/stripe/src/stripe.c index b3f59c861..899f86337 100644 --- a/xlators/cluster/stripe/src/stripe.c +++ b/xlators/cluster/stripe/src/stripe.c @@ -46,9 +46,18 @@ stripe_local_wipe (stripe_local_t *local) loc_wipe (&local->loc); loc_wipe (&local->loc2); - if (local->xattr != NULL) { + + if (local->fd) + fd_unref (local->fd); + + if (local->inode) + inode_unref (local->inode); + + if (local->xattr) dict_unref (local->xattr); - } + + if (local->dict) + dict_unref (local->dict); out: return; @@ -240,21 +249,21 @@ stripe_aggregate (dict_t *this, char *key, data_t *value, void *data) if (size == NULL) { gf_log ("stripe", GF_LOG_WARNING, "memory allocation failed"); - return; + goto out; } ret = dict_set_bin (dst, key, size, sizeof (int64_t)); if (ret < 0) { gf_log ("stripe", GF_LOG_WARNING, "stripe aggregate dict set failed"); GF_FREE (size); - return; + goto out; } } ptr = data_to_bin (value); if (ptr == NULL) { gf_log ("stripe", GF_LOG_WARNING, "data to bin failed"); - return; + goto out; } *size = hton64 (ntoh64 (*size) + ntoh64 (*ptr)); @@ -264,6 +273,7 @@ stripe_aggregate (dict_t *this, char *key, data_t *value, void *data) gf_log ("stripe", GF_LOG_WARNING, "xattr dict set failed"); } +out: return; } @@ -287,8 +297,6 @@ stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, struct iatt *buf, dict_t *dict, struct iatt *postparent) { int32_t callcnt = 0; - dict_t *tmp_dict = NULL; - inode_t *tmp_inode = NULL; stripe_local_t *local = NULL; call_frame_t *prev = NULL; @@ -362,9 +370,6 @@ stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (local->failed) local->op_ret = -1; - tmp_dict = local->dict; - tmp_inode = local->inode; - if (local->op_ret != -1) { local->stbuf.ia_blocks = local->stbuf_blocks; local->stbuf.ia_size = local->stbuf_size; @@ -376,11 +381,6 @@ stripe_lookup_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local->op_errno, local->inode, &local->stbuf, local->dict, &local->postparent); - - if (tmp_inode) - inode_unref (tmp_inode); - if (tmp_dict) - dict_unref (tmp_dict); } out: return 0; @@ -1566,7 +1566,7 @@ stripe_mknod (call_frame_t *frame, xlator_t *this, loc_t *loc, mode_t mode, priv->pattern, priv->block_size); frame->local = local; - local->inode = loc->inode; + local->inode = inode_ref (loc->inode); loc_copy (&local->loc, loc); /* Everytime in stripe lookup, all child nodes should @@ -1603,7 +1603,6 @@ stripe_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, { int32_t callcnt = 0; stripe_local_t *local = NULL; - inode_t *local_inode = NULL; call_frame_t *prev = NULL; if (!this || !frame || !frame->local || !cookie) { @@ -1655,8 +1654,6 @@ stripe_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (local->failed) local->op_ret = -1; - local_inode = local->inode; - if (local->op_ret != -1) { local->preparent.ia_blocks = local->preparent_blocks; local->preparent.ia_size = local->preparent_size; @@ -1669,9 +1666,6 @@ stripe_mkdir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local->op_errno, local->inode, &local->stbuf, &local->preparent, &local->postparent); - - if (local_inode) - inode_unref (local_inode); } out: return 0; @@ -1735,7 +1729,6 @@ stripe_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, { int32_t callcnt = 0; stripe_local_t *local = NULL; - inode_t *local_inode = NULL; call_frame_t *prev = NULL; if (!this || !frame || !frame->local || !cookie) { @@ -1787,8 +1780,6 @@ stripe_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, if (local->failed) local->op_ret = -1; - local_inode = local->inode; - if (local->op_ret != -1) { local->preparent.ia_blocks = local->preparent_blocks; local->preparent.ia_size = local->preparent_size; @@ -1801,9 +1792,6 @@ stripe_link_cbk (call_frame_t *frame, void *cookie, xlator_t *this, local->op_errno, local->inode, &local->stbuf, &local->preparent, &local->postparent); - - if (local_inode) - inode_unref (local_inode); } out: return 0; @@ -1865,9 +1853,7 @@ stripe_create_fail_unlink_cbk (call_frame_t *frame, void *cookie, struct iatt *postparent) { int32_t callcnt = 0; - fd_t *lfd = NULL; stripe_local_t *local = NULL; - inode_t *local_inode = NULL; if (!this || !frame || !frame->local) { gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref"); @@ -1883,17 +1869,9 @@ stripe_create_fail_unlink_cbk (call_frame_t *frame, void *cookie, UNLOCK (&frame->lock); if (!callcnt) { - local_inode = local->inode; - lfd = local->fd; - STRIPE_STACK_UNWIND (create, frame, local->op_ret, local->op_errno, local->fd, local->inode, &local->stbuf, &local->preparent, &local->postparent); - - if (local_inode) - inode_unref (local_inode); - if (lfd) - fd_unref (lfd); } out: return 0; @@ -1904,8 +1882,6 @@ int32_t stripe_create_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno) { - inode_t *local_inode = NULL; - fd_t *lfd = NULL; stripe_local_t *local = NULL; stripe_private_t *priv = NULL; xlator_list_t *trav = NULL; @@ -1951,17 +1927,9 @@ stripe_create_setxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, return 0; } - lfd = local->fd; - local_inode = local->inode; - STRIPE_STACK_UNWIND (create, frame, local->op_ret, local->op_errno, local->fd, local->inode, &local->stbuf, &local->preparent, &local->postparent); - - if (local_inode) - inode_unref (local_inode); - if (lfd) - fd_unref (lfd); } out: return 0; @@ -1976,9 +1944,7 @@ stripe_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t callcnt = 0; stripe_local_t *local = NULL; stripe_private_t *priv = NULL; - fd_t *lfd = NULL; stripe_fd_ctx_t *fctx = NULL; - inode_t *local_inode = NULL; call_frame_t *prev = NULL; int ret = 0; @@ -2118,21 +2084,13 @@ stripe_create_cbk (call_frame_t *frame, void *cookie, xlator_t *this, return 0; } -unwind: + unwind: /* Create itself has failed.. so return without setxattring */ - lfd = local->fd; - local_inode = local->inode; - STRIPE_STACK_UNWIND (create, frame, local->op_ret, local->op_errno, local->fd, local->inode, &local->stbuf, &local->preparent, &local->postparent); - - if (local_inode) - inode_unref (local_inode); - if (lfd) - fd_unref (lfd); } out: @@ -2213,7 +2171,6 @@ stripe_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, { int32_t callcnt = 0; stripe_local_t *local = NULL; - fd_t *lfd = NULL; call_frame_t *prev = NULL; if (!this || !frame || !frame->local || !cookie) { @@ -2259,13 +2216,8 @@ stripe_open_cbk (call_frame_t *frame, void *cookie, xlator_t *this, (uint64_t)(long)local->fctx); } - lfd = local->fd; - STRIPE_STACK_UNWIND (open, frame, local->op_ret, local->op_errno, local->fd); - if (lfd) - fd_unref (lfd); - } out: return 0; @@ -2284,7 +2236,6 @@ stripe_open_getxattr_cbk (call_frame_t *frame, void *cookie, xlator_t *this, stripe_private_t *priv = NULL; data_t *data = NULL; call_frame_t *prev = NULL; - fd_t *lfd = NULL; if (!this || !frame || !frame->local || !cookie) { gf_log ("stripe", GF_LOG_DEBUG, "possible NULL deref"); @@ -2452,12 +2403,8 @@ unlock: return 0; err: - lfd = local->fd; - STRIPE_STACK_UNWIND (open, frame, local->op_ret, local->op_errno, local->fd); - if (lfd) - fd_unref (lfd); out: return 0; } @@ -2551,7 +2498,6 @@ stripe_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, { int32_t callcnt = 0; stripe_local_t *local = NULL; - fd_t *local_fd = NULL; call_frame_t *prev = NULL; if (!this || !frame || !frame->local || !cookie) { @@ -2580,11 +2526,8 @@ stripe_opendir_cbk (call_frame_t *frame, void *cookie, xlator_t *this, UNLOCK (&frame->lock); if (!callcnt) { - local_fd = local->fd; STRIPE_STACK_UNWIND (opendir, frame, local->op_ret, local->op_errno, local->fd); - if (local_fd) - fd_unref (local_fd); } out: return 0; @@ -3230,7 +3173,6 @@ stripe_readv_fstat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, done: GF_FREE (local->replies); tmp_iobref = local->iobref; - fd_unref (local->fd); STRIPE_STACK_UNWIND (readv, frame, op_ret, op_errno, vec, count, &tmp_stbuf, tmp_iobref); @@ -3351,7 +3293,6 @@ stripe_readv_cbk (call_frame_t *frame, void *cookie, xlator_t *this, /* */ GF_FREE (mlocal->replies); tmp_iobref = mlocal->iobref; - fd_unref (mlocal->fd); STRIPE_STACK_UNWIND (readv, mframe, op_ret, op_errno, final_vec, final_count, &tmp_stbuf, tmp_iobref); @@ -3475,8 +3416,6 @@ stripe_readv (call_frame_t *frame, xlator_t *this, fd_t *fd, return 0; err: - if (local && local->fd) - fd_unref (local->fd); if (rframe) STRIPE_STACK_DESTROY (rframe); @@ -3813,12 +3752,11 @@ stripe_iatt_merge (struct iatt *from, struct iatt *to) int32_t stripe_readdirp_entry_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *buf) + int32_t op_ret, int32_t op_errno, struct iatt *buf) { gf_dirent_t *entry = NULL; stripe_local_t *local = NULL; int32_t done = 0; - int32_t ret = -1; if (!this || !frame || !frame->local || !cookie) { gf_log (this->name, GF_LOG_DEBUG, "possible NULL deref"); @@ -3841,24 +3779,24 @@ stripe_readdirp_entry_stat_cbk (call_frame_t *frame, void *cookie, xlator_t *thi } unlock: UNLOCK(&frame->lock); + if (done) { - fd_unref (local->fd); frame->local = NULL; - ret = local->op_ret; STRIPE_STACK_UNWIND (readdir, frame, local->op_ret, - local->op_errno, &local->entries); - if (ret > 0) - gf_dirent_free (&local->entries); + local->op_errno, &local->entries); + + gf_dirent_free (&local->entries); stripe_local_wipe (local); + GF_FREE (local); } out: - return 0; + return 0; } int32_t stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, gf_dirent_t *orig_entries) + int32_t op_ret, int32_t op_errno, gf_dirent_t *orig_entries) { stripe_local_t *local = NULL; call_frame_t *prev = NULL; @@ -3881,7 +3819,6 @@ stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, LOCK (&frame->lock); { - if (op_ret == -1) { gf_log (this->name, GF_LOG_WARNING, "%s returned error %s", @@ -3896,26 +3833,26 @@ stripe_readdirp_cbk (call_frame_t *frame, void *cookie, xlator_t *this, } } unlock: - UNLOCK (&frame->lock); + UNLOCK (&frame->lock); + if (op_ret == -1) goto out; + ret = 0; - list_for_each_entry_safe (local_entry, tmp_entry - , (&local->entries.list), list) { + list_for_each_entry_safe (local_entry, tmp_entry, + (&local->entries.list), list) { if (!local_entry) break; - if (!IA_ISREG(local_entry->d_stat.ia_type)) + if (!IA_ISREG (local_entry->d_stat.ia_type)) continue; - inode = inode_new(local->fd->inode->table); - if (inode) { - loc.ino= inode->ino = local_entry->d_ino; - loc.inode = inode; - } else { + inode = inode_new (local->fd->inode->table); + if (!inode) goto out; - } + loc.ino = inode->ino = local_entry->d_ino; + loc.inode = inode; loc.parent = local->fd->inode; ret = inode_path (local->fd->inode, local_entry->d_name, &path); if (ret != -1) { @@ -3929,7 +3866,7 @@ unlock: } } - loc.name = strrchr (loc.path, '/'); + loc.name = strrchr (loc.path, '/'); loc.name++; trav = this->children; while (trav) { @@ -3945,16 +3882,16 @@ unlock: trav = trav->next; } inode_unref (loc.inode); - } + } out: - if (!count){ //all entries are directories - fd_unref (local->fd); + if (!count) { + /* all entries are directories */ frame->local = NULL; - STRIPE_STACK_UNWIND (readdir, frame, local->op_ret, + STRIPE_STACK_UNWIND (readdir, frame, local->op_ret, local->op_errno, &local->entries); - if (op_ret > 0) - gf_dirent_free (&local->entries); + gf_dirent_free (&local->entries); stripe_local_wipe (local); + GF_FREE (local); } return 0; @@ -3962,7 +3899,7 @@ out: } int32_t stripe_readdirp (call_frame_t *frame, xlator_t *this, - fd_t *fd, size_t size, off_t off) + fd_t *fd, size_t size, off_t off) { stripe_local_t *local = NULL; stripe_private_t *priv = NULL; @@ -3995,15 +3932,16 @@ stripe_readdirp (call_frame_t *frame, xlator_t *this, local->fd = fd_ref (fd); local->wind_count = 0; - + local->count = 0; local->op_ret = -1; INIT_LIST_HEAD(&local->entries); if (!trav) goto err; + STACK_WIND (frame, stripe_readdirp_cbk, trav->xlator, - trav->xlator->fops->readdirp, fd, size, off); + trav->xlator->fops->readdirp, fd, size, off); return 0; err: op_errno = (op_errno == -1) ? errno : op_errno; @@ -4048,8 +3986,8 @@ validate_options (xlator_t *this, char **op_errstr) goto out; vol_opt = list_entry (this->volume_options.next, - volume_opt_list_t, list); - list_for_each_entry_safe (vol_opt, tmp, &this->volume_options, list) { + volume_opt_list_t, list); + list_for_each_entry_safe (vol_opt, tmp, &this->volume_options, list) { ret = validate_xlator_volume_options_attacherr (this, vol_opt->given_opt, op_errstr); @@ -4066,7 +4004,7 @@ reconfigure (xlator_t *this, dict_t *options) stripe_private_t *priv = NULL; data_t *data = NULL; - int ret = 0; + int ret = 0; priv = this->private; @@ -4077,7 +4015,7 @@ reconfigure (xlator_t *this, dict_t *options) ret = set_stripe_block_size (this, priv, data->data); if (ret) { gf_log (this->name, GF_LOG_ERROR, - "Reconfigue: Block-Size reconfiguration failed"); + "Reconfigue: Block-Size reconfiguration failed"); ret = -1; goto out; } @@ -4248,7 +4186,7 @@ stripe_getxattr_unwind (call_frame_t *frame, int op_ret, int op_errno, dict_t *dict) { - STACK_UNWIND_STRICT (getxattr, frame, op_ret, op_errno, dict); + STRIPE_STACK_UNWIND (getxattr, frame, op_ret, op_errno, dict); return 0; } @@ -4325,13 +4263,13 @@ stripe_getxattr (call_frame_t *frame, xlator_t *this, if (name && (strcmp (GF_XATTR_MARKER_KEY, name) == 0) - && (-1 == frame->root->pid)) { + && (-1 == frame->root->pid)) { local->marker.call_count = priv->child_count; sub_volumes = alloca ( priv->child_count * sizeof (xlator_t *)); for (i = 0, trav = this->children; trav ; - trav = trav->next, i++) { + trav = trav->next, i++) { *(sub_volumes + i) = trav->xlator; @@ -4370,7 +4308,7 @@ stripe_getxattr (call_frame_t *frame, xlator_t *this, sub_volumes = alloca ( priv->child_count * sizeof (xlator_t *)); for (i = 0, trav = this->children; trav ; - trav = trav->next, i++) { + trav = trav->next, i++) { *(sub_volumes + i) = trav->xlator; @@ -4396,7 +4334,7 @@ stripe_getxattr (call_frame_t *frame, xlator_t *this, return 0; err: - STACK_UNWIND_STRICT (getxattr, frame, -1, op_errno, NULL); + STRIPE_STACK_UNWIND (getxattr, frame, -1, op_errno, NULL); return 0; } @@ -4429,7 +4367,7 @@ stripe_priv_dump (xlator_t *this) for (i = 0; i < priv->child_count; i++) { gf_proc_dump_build_key (key, key_prefix, "subvolumes[%d]", i); gf_proc_dump_write (key, "%s.%s", priv->xl_array[i]->type, - priv->xl_array[i]->name); + priv->xl_array[i]->name); } options = priv->pattern; |