]> Git Repo - linux.git/blob - fs/bcachefs/seqmutex.h
Linux 6.14-rc3
[linux.git] / fs / bcachefs / seqmutex.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_SEQMUTEX_H
3 #define _BCACHEFS_SEQMUTEX_H
4
5 #include <linux/mutex.h>
6
7 struct seqmutex {
8         struct mutex    lock;
9         u32             seq;
10 };
11
12 #define seqmutex_init(_lock)    mutex_init(&(_lock)->lock)
13
14 static inline bool seqmutex_trylock(struct seqmutex *lock)
15 {
16         return mutex_trylock(&lock->lock);
17 }
18
19 static inline void seqmutex_lock(struct seqmutex *lock)
20 {
21         mutex_lock(&lock->lock);
22         lock->seq++;
23 }
24
25 static inline u32 seqmutex_unlock(struct seqmutex *lock)
26 {
27         u32 seq = lock->seq;
28         mutex_unlock(&lock->lock);
29         return seq;
30 }
31
32 static inline bool seqmutex_relock(struct seqmutex *lock, u32 seq)
33 {
34         if (lock->seq != seq || !mutex_trylock(&lock->lock))
35                 return false;
36
37         if (lock->seq != seq) {
38                 mutex_unlock(&lock->lock);
39                 return false;
40         }
41
42         return true;
43 }
44
45 #endif /* _BCACHEFS_SEQMUTEX_H */
This page took 0.032125 seconds and 4 git commands to generate.