seqmutex.h 825 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef _BCACHEFS_SEQMUTEX_H
  3. #define _BCACHEFS_SEQMUTEX_H
  4. #include <linux/mutex.h>
  5. struct seqmutex {
  6. struct mutex lock;
  7. u32 seq;
  8. };
  9. #define seqmutex_init(_lock) mutex_init(&(_lock)->lock)
  10. static inline bool seqmutex_trylock(struct seqmutex *lock)
  11. {
  12. return mutex_trylock(&lock->lock);
  13. }
  14. static inline void seqmutex_lock(struct seqmutex *lock)
  15. {
  16. mutex_lock(&lock->lock);
  17. lock->seq++;
  18. }
  19. static inline u32 seqmutex_unlock(struct seqmutex *lock)
  20. {
  21. u32 seq = lock->seq;
  22. mutex_unlock(&lock->lock);
  23. return seq;
  24. }
  25. static inline bool seqmutex_relock(struct seqmutex *lock, u32 seq)
  26. {
  27. if (lock->seq != seq || !mutex_trylock(&lock->lock))
  28. return false;
  29. if (lock->seq != seq) {
  30. mutex_unlock(&lock->lock);
  31. return false;
  32. }
  33. return true;
  34. }
  35. #endif /* _BCACHEFS_SEQMUTEX_H */