Reviewed-by: Steven Dake <sdake@xxxxxxxxxx> On 01/17/2012 06:38 AM, Fabio M. Di Nitto wrote: > From: "Fabio M. Di Nitto" <fdinitto@xxxxxxxxxx> > > the problem is that votequorum was listed as part of default > services. > > At service_link_and_init, votequorum library and exec were being > made available, even when votequorum was not in used at all, creating > all kind of problems. > > By changing the service_link_and_init to be clever, we restore the > original and wanted behavior to link the service only when required. > > This also fixed N*votequorum API calls segfaults, init segfaults > and a few dozen other small issues... > > Signed-off-by: Fabio M. Di Nitto <fdinitto@xxxxxxxxxx> > --- > exec/service.c | 11 ----------- > exec/service.h | 6 +++++- > exec/votequorum.c | 25 +++++++++++++------------ > exec/vsf_ykd.c | 8 -------- > 4 files changed, 18 insertions(+), 32 deletions(-) > > diff --git a/exec/service.c b/exec/service.c > index 1432146..4cd9d8e 100644 > --- a/exec/service.c > +++ b/exec/service.c > @@ -58,12 +58,6 @@ > > LOGSYS_DECLARE_SUBSYS ("SERV"); > > -struct default_service { > - const char *name; > - int ver; > - struct corosync_service_engine *(*loader)(void); > -}; > - > static struct default_service default_services[] = { > { > .name = "corosync_evs", > @@ -100,11 +94,6 @@ static struct default_service default_services[] = { > }, > #endif > { > - .name = "corosync_votequorum", > - .ver = 0, > - .loader = votequorum_get_service_engine_ver0 > - }, > - { > .name = "corosync_quorum", > .ver = 0, > .loader = vsf_quorum_get_service_engine_ver0 > diff --git a/exec/service.h b/exec/service.h > index 5309174..67d4b94 100644 > --- a/exec/service.h > +++ b/exec/service.h > @@ -39,7 +39,11 @@ > > struct corosync_api_v1; > > -struct default_service; > +struct default_service { > + const char *name; > + int ver; > + struct corosync_service_engine *(*loader)(void); > +}; > > /** > * Link and initialize a service > diff --git a/exec/votequorum.c b/exec/votequorum.c > index 0f4f05a..ef0e3a7 100644 > --- a/exec/votequorum.c > +++ b/exec/votequorum.c > @@ -58,7 +58,6 @@ LOGSYS_DECLARE_SUBSYS ("VOTEQ"); > */ > > static struct corosync_api_v1 *corosync_api; > -static int votequorum_configured = 0; > > /* > * votequorum global config vars > @@ -222,6 +221,8 @@ static quorum_set_quorate_fn_t quorum_callback; > * votequorum_exec handler and definitions > */ > > +static int votequorum_exec_init_fn (struct corosync_api_v1 *api); > + > static void message_handler_req_exec_votequorum_nodeinfo ( > const void *message, > unsigned int nodeid); > @@ -328,6 +329,7 @@ static struct corosync_service_engine votequorum_service_engine = { > .lib_exit_fn = quorum_lib_exit_fn, > .lib_engine = quorum_lib_service, > .lib_engine_count = sizeof (quorum_lib_service) / sizeof (struct corosync_lib_handler), > + .exec_init_fn = votequorum_exec_init_fn, > .exec_engine = votequorum_exec_engine, > .exec_engine_count = sizeof (votequorum_exec_engine) / sizeof (struct corosync_exec_handler), > .confchg_fn = votequorum_confchg_fn, > @@ -339,6 +341,14 @@ struct corosync_service_engine *votequorum_get_service_engine_ver0 (void) > return (&votequorum_service_engine); > } > > +static struct default_service votequorum_service[] = { > + { > + .name = "corosync_votequorum", > + .ver = 0, > + .loader = votequorum_get_service_engine_ver0 > + }, > +}; > + > /* > * common/utility macros/functions > */ > @@ -1131,11 +1141,6 @@ static void votequorum_confchg_fn ( > > ENTER(); > > - if (votequorum_configured == 0) { > - LEAVE(); > - return; > - } > - > if (member_list_entries > 1) { > first_trans = 0; > } > @@ -1205,12 +1210,8 @@ cs_error_t votequorum_init(struct corosync_api_v1 *api, > > votequorum_readconfig_static(); > > - if (votequorum_exec_init_fn(api) != 0) { > - LEAVE(); > - return CS_ERR_NO_MEMORY; > - } > - > - votequorum_configured = 1; > + corosync_service_link_and_init(corosync_api, > + &votequorum_service[0]); > > LEAVE(); > > diff --git a/exec/vsf_ykd.c b/exec/vsf_ykd.c > index 282ba7f..e021ad1 100644 > --- a/exec/vsf_ykd.c > +++ b/exec/vsf_ykd.c > @@ -146,8 +146,6 @@ hdb_handle_t schedwrk_state_send_callback_handle; > > static struct corosync_api_v1 *api; > > -static int ykd_configured = 0; > - > static void (*ykd_primary_callback_fn) ( > const unsigned int *view_list, > size_t view_list_entries, > @@ -465,10 +463,6 @@ static void ykd_confchg_fn ( > { > int i; > > - if (ykd_configured == 0) { > - return; > - } > - > if (configuration_type != TOTEM_CONFIGURATION_REGULAR) { > return; > } > @@ -525,8 +519,6 @@ cs_error_t ykd_init ( > return CS_ERR_INVALID_PARAM; > } > > - ykd_configured = 1; > - > api->tpg_init ( > &ykd_group_handle, > ykd_deliver_fn, _______________________________________________ discuss mailing list discuss@xxxxxxxxxxxx http://lists.corosync.org/mailman/listinfo/discuss