46 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _BCACHEFS_SEQMUTEX_H3#define _BCACHEFS_SEQMUTEX_H4 5#include <linux/mutex.h>6 7struct seqmutex {8 struct mutex lock;9 u32 seq;10};11 12#define seqmutex_init(_lock) mutex_init(&(_lock)->lock)13 14static inline bool seqmutex_trylock(struct seqmutex *lock)15{16 return mutex_trylock(&lock->lock);17}18 19static inline void seqmutex_lock(struct seqmutex *lock)20{21 mutex_lock(&lock->lock);22 lock->seq++;23}24 25static inline u32 seqmutex_unlock(struct seqmutex *lock)26{27 u32 seq = lock->seq;28 mutex_unlock(&lock->lock);29 return seq;30}31 32static 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