diff options
author | Mohit Agrawal <moagrawa@redhat.com> | 2018-04-20 12:16:32 +0530 |
---|---|---|
committer | Mohit Agrawal <moagrawa@redhat.com> | 2018-04-20 13:25:29 +0530 |
commit | 408a6d07ababde234ddeafe16687aacd2b810b42 (patch) | |
tree | 22943957f62df2c2350c4d5d3aed43b1bfbac691 | |
parent | ab42a3551eba623e11a942bf44d41dd393bfee9b (diff) |
server: fix unresolved symbols by moving them to libglusterfs
Problem: glusterd2 build is failed due to undefined symbol
(xlator_mem_cleanup , glusterfsd_ctx) in server.so
Solution: To resolve the same done below two changes
1) Move xlator_mem_cleanup code from glusterfsd-mgmt.c
to xlator.c to be part of libglusterfs.so
2) replace glusterfsd_ctx to this->ctx because symbol
glusterfsd_ctx is not part of server.so
BUG: 1544090
Change-Id: Ie5e6fba9ed458931d08eb0948d450aa962424ae5
fixes: bz#1544090
Signed-off-by: Mohit Agrawal <moagrawa@redhat.com>
-rw-r--r-- | glusterfsd/src/glusterfsd-mgmt.c | 103 | ||||
-rw-r--r-- | libglusterfs/src/libglusterfs.sym | 1 | ||||
-rw-r--r-- | libglusterfs/src/xlator.c | 101 | ||||
-rw-r--r-- | libglusterfs/src/xlator.h | 3 | ||||
-rw-r--r-- | xlators/protocol/server/src/server.c | 2 |
5 files changed, 106 insertions, 104 deletions
diff --git a/glusterfsd/src/glusterfsd-mgmt.c b/glusterfsd/src/glusterfsd-mgmt.c index e6c8a27e9e8..0051393b4ca 100644 --- a/glusterfsd/src/glusterfsd-mgmt.c +++ b/glusterfsd/src/glusterfsd-mgmt.c @@ -185,109 +185,6 @@ glusterfs_terminate_response_send (rpcsvc_request_t *req, int op_ret) return ret; } -static int -xlator_mem_free (xlator_t *xl) -{ - volume_opt_list_t *vol_opt = NULL; - volume_opt_list_t *tmp = NULL; - - if (!xl) - return 0; - - if (xl->options) { - dict_ref (xl->options); - dict_unref (xl->options); - xl->options = NULL; - } - - list_for_each_entry_safe (vol_opt, tmp, &xl->volume_options, list) { - list_del_init (&vol_opt->list); - GF_FREE (vol_opt); - } - - xlator_memrec_free (xl); - - return 0; -} - -void -xlator_call_fini (xlator_t *this) { - if (!this || this->cleanup_starting) - return; - this->cleanup_starting = 1; - this->call_cleanup = 1; - xlator_call_fini (this->next); - this->fini (this); -} - -void -xlator_mem_cleanup (xlator_t *this) { - xlator_list_t *list = this->children; - xlator_t *trav = list->xlator; - inode_table_t *inode_table = NULL; - xlator_t *prev = trav; - glusterfs_ctx_t *ctx = NULL; - xlator_list_t **trav_p = NULL; - xlator_t *top = NULL; - xlator_t *victim = NULL; - - - if (this->call_cleanup) - return; - - this->call_cleanup = 1; - ctx = glusterfsd_ctx; - - xlator_call_fini (trav); - - while (prev) { - trav = prev->next; - xlator_mem_free (prev); - prev = trav; - } - - inode_table = this->itable; - if (inode_table) { - inode_table_destroy (inode_table); - this->itable = NULL; - } - - if (this->fini) { - this->fini (this); - } - - xlator_mem_free (this); - - if (glusterfsd_ctx->active) { - top = glusterfsd_ctx->active->first; - LOCK (&ctx->volfile_lock); - /* TODO here we have leak for xlator node in a graph */ - for (trav_p = &top->children; *trav_p; trav_p = &(*trav_p)->next) { - victim = (*trav_p)->xlator; - if (victim->call_cleanup && !strcmp (victim->name, this->name)) { - (*trav_p) = (*trav_p)->next; - break; - } - } - /* TODO Sometime brick xlator is not moved from graph so followed below - approach to move brick xlator from a graph, will move specific brick - xlator from graph only while inode table and mem_acct are cleaned up - */ - trav_p = &top->children; - while (*trav_p) { - victim = (*trav_p)->xlator; - if (victim->call_cleanup && !victim->itable && !victim->mem_acct) { - (*trav_p) = (*trav_p)->next; - } else { - trav_p = &(*trav_p)->next; - } - } - UNLOCK (&ctx->volfile_lock); - } - -} - - int glusterfs_handle_terminate (rpcsvc_request_t *req) { diff --git a/libglusterfs/src/libglusterfs.sym b/libglusterfs/src/libglusterfs.sym index 4b7dcb6f3e6..d2d25838647 100644 --- a/libglusterfs/src/libglusterfs.sym +++ b/libglusterfs/src/libglusterfs.sym @@ -1101,6 +1101,7 @@ xlator_volopt_dynload xlator_volume_option_get xlator_volume_option_get_list xlator_memrec_free +xlator_mem_cleanup default_fops gf_fop_list gf_upcall_list diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index ced89c71672..f1ed9236f09 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -980,6 +980,107 @@ xlator_tree_free_memacct (xlator_t *tree) return 0; } +static int +xlator_mem_free (xlator_t *xl) +{ + volume_opt_list_t *vol_opt = NULL; + volume_opt_list_t *tmp = NULL; + + if (!xl) + return 0; + + if (xl->options) { + dict_ref (xl->options); + dict_unref (xl->options); + xl->options = NULL; + } + + list_for_each_entry_safe (vol_opt, tmp, &xl->volume_options, list) { + list_del_init (&vol_opt->list); + GF_FREE (vol_opt); + } + + xlator_memrec_free (xl); + + return 0; +} + +static void +xlator_call_fini (xlator_t *this) { + if (!this || this->cleanup_starting) + return; + this->cleanup_starting = 1; + this->call_cleanup = 1; + xlator_call_fini (this->next); + this->fini (this); +} + +void +xlator_mem_cleanup (xlator_t *this) { + xlator_list_t *list = this->children; + xlator_t *trav = list->xlator; + inode_table_t *inode_table = NULL; + xlator_t *prev = trav; + glusterfs_ctx_t *ctx = NULL; + xlator_list_t **trav_p = NULL; + xlator_t *top = NULL; + xlator_t *victim = NULL; + + + if (this->call_cleanup || !this->ctx) + return; + + this->call_cleanup = 1; + ctx = this->ctx; + + xlator_call_fini (trav); + + while (prev) { + trav = prev->next; + xlator_mem_free (prev); + prev = trav; + } + + inode_table = this->itable; + if (inode_table) { + inode_table_destroy (inode_table); + this->itable = NULL; + } + + if (this->fini) { + this->fini (this); + } + + xlator_mem_free (this); + + if (ctx->active) { + top = ctx->active->first; + LOCK (&ctx->volfile_lock); + /* TODO here we have leak for xlator node in a graph */ + for (trav_p = &top->children; *trav_p; trav_p = &(*trav_p)->next) { + victim = (*trav_p)->xlator; + if (victim->call_cleanup && !strcmp (victim->name, this->name)) { + (*trav_p) = (*trav_p)->next; + break; + } + } + /* TODO Sometime brick xlator is not moved from graph so followed below + approach to move brick xlator from a graph, will move specific brick + xlator from graph only while inode table and mem_acct are cleaned up + */ + trav_p = &top->children; + while (*trav_p) { + victim = (*trav_p)->xlator; + if (victim->call_cleanup && !victim->itable && !victim->mem_acct) { + (*trav_p) = (*trav_p)->next; + } else { + trav_p = &(*trav_p)->next; + } + } + UNLOCK (&ctx->volfile_lock); + } +} + void loc_wipe (loc_t *loc) { diff --git a/libglusterfs/src/xlator.h b/libglusterfs/src/xlator.h index 3c16758e1a9..4f18d1cd2a9 100644 --- a/libglusterfs/src/xlator.h +++ b/libglusterfs/src/xlator.h @@ -1246,4 +1246,7 @@ glusterfs_delete_volfile_checksum (glusterfs_ctx_t *ctx, const char *volfile_id); int xlator_memrec_free (xlator_t *xl); + +void +xlator_mem_cleanup (xlator_t *this); #endif /* _XLATOR_H */ diff --git a/xlators/protocol/server/src/server.c b/xlators/protocol/server/src/server.c index 03138689b14..87a03d23c3f 100644 --- a/xlators/protocol/server/src/server.c +++ b/xlators/protocol/server/src/server.c @@ -444,7 +444,7 @@ server_rpc_notify (rpcsvc_t *rpc, void *xl, rpcsvc_event_t event, this = xl; trans = data; conf = this->private; - ctx = glusterfsd_ctx; + ctx = this->ctx; switch (event) { case RPCSVC_EVENT_ACCEPT: |