On Thu, Nov 18, 2021 at 11:57:55PM +0100, mwilck@xxxxxxxx wrote: > From: Martin Wilck <mwilck@xxxxxxxx> > > Have struct mutex_lock take an optional wakeup function. > unlock() is renamed to __unlock() in order to prevent it from > being called by mistake. > > This changes offsets in "struct vectors", requiring a major > libmultipath version bump. While the strucure is already changed, > in order to avoid this in the future, move the lock to the end > of "struct vectors". > > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> In libmultipath.version, I would have said that set_wakeup_fn was added in 10.0.0, instead of 9.2.0, which is a version that never actually existed, but I don't think that's going to cause any problems so, Reviewed-by: Benjamin Marzinski <bmarzins@xxxxxxxxxx> > --- > libmultipath/libmultipath.version | 13 +++++++------ > libmultipath/lock.c | 12 +++++++++++- > libmultipath/lock.h | 6 +++++- > libmultipath/structs_vec.h | 2 +- > 4 files changed, 24 insertions(+), 9 deletions(-) > > diff --git a/libmultipath/libmultipath.version b/libmultipath/libmultipath.version > index c98cf7f..98ec502 100644 > --- a/libmultipath/libmultipath.version > +++ b/libmultipath/libmultipath.version > @@ -31,7 +31,7 @@ > * The new version inherits the previous ones. > */ > > -LIBMULTIPATH_9.0.0 { > +LIBMULTIPATH_10.0.0 { > global: > /* symbols referenced by multipath and multipathd */ > add_foreign; > @@ -284,11 +284,12 @@ global: > /* added in 8.2.0 */ > check_daemon; > > + /* added in 9.1.0 */ > + timespeccmp; > + > + /* added in 9.2.0 */ > + set_wakeup_fn; > + > local: > *; > }; > - > -LIBMULTIPATH_9.1.0 { > -global: > - timespeccmp; > -} LIBMULTIPATH_9.0.0; > diff --git a/libmultipath/lock.c b/libmultipath/lock.c > index 72c70e3..93b48db 100644 > --- a/libmultipath/lock.c > +++ b/libmultipath/lock.c > @@ -3,6 +3,16 @@ > void cleanup_lock (void * data) > { > struct mutex_lock *lock = data; > + wakeup_fn *fn = lock->wakeup; > > - unlock(lock); > + __unlock(lock); > + if (fn) > + fn(); > +} > + > +void set_wakeup_fn(struct mutex_lock *lck, wakeup_fn *fn) > +{ > + lock(lck); > + lck->wakeup = fn; > + __unlock(lck); > } > diff --git a/libmultipath/lock.h b/libmultipath/lock.h > index d99eedb..d7b779e 100644 > --- a/libmultipath/lock.h > +++ b/libmultipath/lock.h > @@ -3,8 +3,11 @@ > > #include <pthread.h> > > +typedef void (wakeup_fn)(void); > + > struct mutex_lock { > pthread_mutex_t mutex; > + wakeup_fn *wakeup; > }; > > static inline void lock(struct mutex_lock *a) > @@ -22,7 +25,7 @@ static inline int timedlock(struct mutex_lock *a, struct timespec *tmo) > return pthread_mutex_timedlock(&a->mutex, tmo); > } > > -static inline void unlock(struct mutex_lock *a) > +static inline void __unlock(struct mutex_lock *a) > { > pthread_mutex_unlock(&a->mutex); > } > @@ -30,5 +33,6 @@ static inline void unlock(struct mutex_lock *a) > #define lock_cleanup_pop(a) pthread_cleanup_pop(1) > > void cleanup_lock (void * data); > +void set_wakeup_fn(struct mutex_lock *lock, wakeup_fn *fn); > > #endif /* _LOCK_H */ > diff --git a/libmultipath/structs_vec.h b/libmultipath/structs_vec.h > index 29ede45..2a0cbd1 100644 > --- a/libmultipath/structs_vec.h > +++ b/libmultipath/structs_vec.h > @@ -6,9 +6,9 @@ > #include "lock.h" > > struct vectors { > - struct mutex_lock lock; /* defined in lock.h */ > vector pathvec; > vector mpvec; > + struct mutex_lock lock; /* defined in lock.h */ > }; > > void __set_no_path_retry(struct multipath *mpp, bool check_features); > -- > 2.33.1 -- dm-devel mailing list dm-devel@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/dm-devel