[dm-devel] [PATCH v3 03/35] libmultipath: add optional wakeup functionality to lock.c
mwilck at suse.com
mwilck at suse.com
Sat Nov 27 15:18:56 UTC 2021
From: Martin Wilck <mwilck at suse.com>
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".
Reviewed-by: Benjamin Marzinski <bmarzins at redhat.com>
Signed-off-by: Martin Wilck <mwilck at suse.com>
---
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..83aaa83 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 10.0.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
More information about the dm-devel
mailing list