diff options
Diffstat (limited to 'libglusterfs/src/xlator.c')
| -rw-r--r-- | libglusterfs/src/xlator.c | 136 | 
1 files changed, 74 insertions, 62 deletions
diff --git a/libglusterfs/src/xlator.c b/libglusterfs/src/xlator.c index 4a0de3001..e9ace1714 100644 --- a/libglusterfs/src/xlator.c +++ b/libglusterfs/src/xlator.c @@ -703,6 +703,7 @@ xlator_set_type (xlator_t *xl,  		gf_log ("xlator", GF_LOG_DEBUG, "%s", dlerror ());  		return -1;  	} +        xl->dlhandle = handle;  	if (!(xl->fops = dlsym (handle, "fops"))) {  		gf_log ("xlator", GF_LOG_DEBUG, "dlsym(fops) on %s", @@ -813,52 +814,26 @@ xlator_search_by_name (xlator_t *any, const char *name)  } -static int32_t -xlator_init_rec (xlator_t *xl) +static int +__xlator_init(xlator_t *xl)  { -	xlator_t *trav = NULL; -	int32_t ret = 0; +        xlator_t *old_THIS = NULL; +        int       ret = 0; -	if (xl == NULL)	{ -		gf_log ("xlator", GF_LOG_DEBUG, "invalid argument"); -		return 0; -	} +        old_THIS = THIS; +        THIS = xl; -	trav = xl; -        while (trav->prev) -                trav = trav->prev; +        ret = xl->init (xl); -        while (trav) { -		ret = -1; -                if (trav->mem_acct_init) -                        trav->mem_acct_init (trav); -		if (trav->init && !trav->ready) { -			ret = xlator_init (trav); -			if (ret) { -				gf_log (trav->name, GF_LOG_ERROR, -					"Initialization of volume '%s' failed," -					" review your volfile again", -					trav->name); -                                break; -			} else { -				trav->init_succeeded = 1; -			} -		} else { -			gf_log (trav->name, GF_LOG_DEBUG, "No init() found"); -		} -		/* This 'xl' is checked */ -		trav->ready = 1; -                trav = trav->next; -	} +        THIS = old_THIS; -	return ret; +        return ret;  } -int32_t -xlator_tree_init (xlator_t *xl) +int +xlator_init (xlator_t *xl)  { -	xlator_t *top = NULL;  	int32_t ret = 0;  	if (xl == NULL)	{ @@ -866,17 +841,30 @@ xlator_tree_init (xlator_t *xl)  		return 0;  	} -	top = xl; -/* -	while (top->parents) -		top = top->parents->xlator; -*/ -	ret = xlator_init_rec (top); +        ret = -1; -	if (ret == 0 && top->notify) { -		top->notify (top, GF_EVENT_PARENT_UP, NULL); -	} +        if (xl->mem_acct_init) +                xl->mem_acct_init (xl); + +        if (!xl->init) { +                gf_log (xl->name, GF_LOG_DEBUG, "No init() found"); +                goto out; +        } + +        ret = __xlator_init (xl); +        if (ret) { +                gf_log (xl->name, GF_LOG_ERROR, +                        "Initialization of volume '%s' failed," +                        " review your volfile again", +                        xl->name); +                goto out; +        } + +        xl->init_succeeded = 1; + +        ret = 0; +out:  	return ret;  } @@ -932,22 +920,6 @@ xlator_notify (xlator_t *xl, int event, void *data, ...)  int -xlator_init (xlator_t *xl) -{ -        xlator_t *old_THIS = NULL; -        int       ret = 0; - -        old_THIS = THIS; -        THIS = xl; - -        ret = xl->init (xl); - -        THIS = old_THIS; - -        return ret; -} - -int  xlator_mem_acct_init (xlator_t *xl, int num_types)  {          int             i = 0; @@ -1064,3 +1036,43 @@ loc_copy (loc_t *dst, loc_t *src)  out:  	return ret;  } + + +int +xlator_list_destroy (xlator_list_t *list) +{ +        xlator_list_t *next = NULL; + +        while (list) { +                next = list->next; +                GF_FREE (list); +                list = next; +        } + +        return 0; +} + + +int +xlator_destroy (xlator_t *xl) +{ +        if (!xl) +                return 0; + +        if (xl->name) +                GF_FREE (xl->name); +        if (xl->type) +                GF_FREE (xl->type); +        if (xl->dlhandle) +                dlclose (xl->dlhandle); +        if (xl->options) +                dict_destroy (xl->options); + +        xlator_list_destroy (xl->children); + +        xlator_list_destroy (xl->parents); + +        GF_FREE (xl); + +        return 0; +}  | 
