On Fri, Oct 16, 2020 at 12:44:46PM +0200, mwilck@xxxxxxxx wrote: > From: Martin Wilck <mwilck@xxxxxxxx> > > This function prepares for calling dm_lib_exit() on program exit. > It undoes changes to libdm internals done by libmultipath. > It doesn't call dm_lib_exit(), as the caller may want to keep > libdm active. > Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> > --- > libmultipath/config.c | 1 + > libmultipath/config.h | 2 ++ > libmultipath/devmapper.c | 15 +++++++++++++++ > libmultipath/devmapper.h | 1 + > 4 files changed, 19 insertions(+) > > diff --git a/libmultipath/config.c b/libmultipath/config.c > index f74417c..b9cb413 100644 > --- a/libmultipath/config.c > +++ b/libmultipath/config.c > @@ -60,6 +60,7 @@ int libmultipath_init(void) > static void _libmultipath_exit(void) > { > libmultipath_exit_called = true; > + libmp_dm_exit(); > udev_unref(udev); > } > > diff --git a/libmultipath/config.h b/libmultipath/config.h > index f478df7..5d46035 100644 > --- a/libmultipath/config.h > +++ b/libmultipath/config.h > @@ -271,6 +271,8 @@ int libmultipath_init(void); > * > * This function un-initializes libmultipath data structures. > * It is recommended to call this function at program exit. > + * If the application also calls dm_lib_exit(), it should do so > + * after libmultipath_exit(). > * > * Calls to libmultipath_init() after libmultipath_exit() will fail > * (in other words, libmultipath can't be re-initialized). > diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c > index 2e3ae8a..a8e0611 100644 > --- a/libmultipath/devmapper.c > +++ b/libmultipath/devmapper.c > @@ -333,6 +333,20 @@ void libmp_udev_set_sync_support(int on) > libmp_dm_udev_sync = !!on; > } > > +static bool libmp_dm_init_called; > +void libmp_dm_exit(void) > +{ > + if (!libmp_dm_init_called) > + return; > + > + /* switch back to default libdm logging */ > + dm_log_init(NULL); > +#ifdef LIBDM_API_HOLD_CONTROL > + /* make sure control fd is closed in dm_lib_release() */ > + dm_hold_control_dev(0); > +#endif > +} > + > static void libmp_dm_init(void) > { > struct config *conf; > @@ -349,6 +363,7 @@ static void libmp_dm_init(void) > dm_hold_control_dev(1); > #endif > dm_udev_set_sync_support(libmp_dm_udev_sync); > + libmp_dm_init_called = true; > } > > static void _do_skip_libmp_dm_init(void) > diff --git a/libmultipath/devmapper.h b/libmultipath/devmapper.h > index 158057e..ecf2e66 100644 > --- a/libmultipath/devmapper.h > +++ b/libmultipath/devmapper.h > @@ -35,6 +35,7 @@ enum { > > int dm_prereq(unsigned int *v); > void skip_libmp_dm_init(void); > +void libmp_dm_exit(void); > void libmp_udev_set_sync_support(int on); > struct dm_task *libmp_dm_task_create(int task); > int dm_simplecmd_flush (int, const char *, uint16_t); > -- > 2.28.0 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel