[dm-devel] [PATCH v3 20/29] multipath: use atexit() for cleanup handlers
Benjamin Marzinski
bmarzins at redhat.com
Thu Dec 17 02:40:07 UTC 2020
On Wed, Dec 16, 2020 at 07:16:59PM +0100, mwilck at suse.com wrote:
> From: Martin Wilck <mwilck at suse.com>
>
> Signed-off-by: Martin Wilck <mwilck at suse.com>
Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>
> ---
> multipath/main.c | 37 ++++++++++++++++---------------------
> 1 file changed, 16 insertions(+), 21 deletions(-)
>
> diff --git a/multipath/main.c b/multipath/main.c
> index 9ae46ed..1949a1c 100644
> --- a/multipath/main.c
> +++ b/multipath/main.c
> @@ -452,13 +452,19 @@ static bool released_to_systemd(void)
> return ret;
> }
>
> +static struct vectors vecs;
> +static void cleanup_vecs(void)
> +{
> + free_multipathvec(vecs.mpvec, KEEP_PATHS);
> + free_pathvec(vecs.pathvec, FREE_PATHS);
> +}
> +
> static int
> configure (struct config *conf, enum mpath_cmds cmd,
> enum devtypes dev_type, char *devpath)
> {
> vector curmp = NULL;
> vector pathvec = NULL;
> - struct vectors vecs;
> int r = RTVL_FAIL, rc;
> int di_flag = 0;
> char * refwwid = NULL;
> @@ -469,6 +475,7 @@ configure (struct config *conf, enum mpath_cmds cmd,
> */
> curmp = vector_alloc();
> pathvec = vector_alloc();
> + atexit(cleanup_vecs);
>
> if (!curmp || !pathvec) {
> condlog(0, "can not allocate memory");
> @@ -580,9 +587,6 @@ out:
> if (refwwid)
> FREE(refwwid);
>
> - free_multipathvec(curmp, KEEP_PATHS);
> - free_pathvec(pathvec, FREE_PATHS);
> -
> return r;
> }
>
> @@ -808,9 +812,13 @@ main (int argc, char *argv[])
> bool enable_foreign = false;
>
> libmultipath_init();
> + if (atexit(dm_lib_exit) || atexit(libmultipath_exit))
> + condlog(1, "failed to register cleanup handler for libmultipath: %m");
> logsink = 0;
> if (init_config(DEFAULT_CONFIGFILE))
> exit(RTVL_FAIL);
> + if (atexit(uninit_config))
> + condlog(1, "failed to register cleanup handler for config: %m");
> conf = get_multipath_config();
> conf->retrigger_tries = 0;
> conf->force_sync = 1;
> @@ -887,7 +895,7 @@ main (int argc, char *argv[])
> break;
> case 't':
> r = dump_config(conf, NULL, NULL) ? RTVL_FAIL : RTVL_OK;
> - goto out_free_config;
> + goto out;
> case 'T':
> cmd = CMD_DUMP_CONFIG;
> break;
> @@ -1048,26 +1056,13 @@ main (int argc, char *argv[])
> condlog(3, "restart multipath configuration process");
>
> out:
> - dm_lib_exit();
> -
> - cleanup_foreign();
> - cleanup_prio();
> - cleanup_checkers();
> + put_multipath_config(conf);
> + if (dev)
> + FREE(dev);
>
> if (dev_type == DEV_UEVENT)
> closelog();
>
> -out_free_config:
> - /*
> - * Freeing config must be done after dm_lib_exit(), because
> - * the logging function (dm_write_log()), which is called there,
> - * references the config.
> - */
> - put_multipath_config(conf);
> - uninit_config();
> - libmultipath_exit();
> - if (dev)
> - FREE(dev);
> #ifdef _DEBUG_
> dbg_free_final(NULL);
> #endif
> --
> 2.29.0
More information about the dm-devel
mailing list