xref: /linux/fs/bcachefs/seqmutex.h (revision cd63a278acedc375603820abff11a5414af53769)
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  
seqmutex_trylock(struct seqmutex * lock)14  static inline bool seqmutex_trylock(struct seqmutex *lock)
15  {
16  	return mutex_trylock(&lock->lock);
17  }
18  
seqmutex_lock(struct seqmutex * lock)19  static inline void seqmutex_lock(struct seqmutex *lock)
20  {
21  	mutex_lock(&lock->lock);
22  	lock->seq++;
23  }
24  
seqmutex_unlock(struct seqmutex * lock)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  
seqmutex_relock(struct seqmutex * lock,u32 seq)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 */
46