mrlock.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2000-2006 Silicon Graphics, Inc.
  4. * All Rights Reserved.
  5. */
  6. #ifndef __XFS_SUPPORT_MRLOCK_H__
  7. #define __XFS_SUPPORT_MRLOCK_H__
  8. #include <linux/rwsem.h>
  9. typedef struct {
  10. struct rw_semaphore mr_lock;
  11. #if defined(DEBUG) || defined(XFS_WARN)
  12. int mr_writer;
  13. #endif
  14. } mrlock_t;
  15. #if defined(DEBUG) || defined(XFS_WARN)
  16. #define mrinit(mrp, name) \
  17. do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0)
  18. #else
  19. #define mrinit(mrp, name) \
  20. do { init_rwsem(&(mrp)->mr_lock); } while (0)
  21. #endif
  22. #define mrlock_init(mrp, t,n,s) mrinit(mrp, n)
  23. #define mrfree(mrp) do { } while (0)
  24. static inline void mraccess_nested(mrlock_t *mrp, int subclass)
  25. {
  26. down_read_nested(&mrp->mr_lock, subclass);
  27. }
  28. static inline void mrupdate_nested(mrlock_t *mrp, int subclass)
  29. {
  30. down_write_nested(&mrp->mr_lock, subclass);
  31. #if defined(DEBUG) || defined(XFS_WARN)
  32. mrp->mr_writer = 1;
  33. #endif
  34. }
  35. static inline int mrtryaccess(mrlock_t *mrp)
  36. {
  37. return down_read_trylock(&mrp->mr_lock);
  38. }
  39. static inline int mrtryupdate(mrlock_t *mrp)
  40. {
  41. if (!down_write_trylock(&mrp->mr_lock))
  42. return 0;
  43. #if defined(DEBUG) || defined(XFS_WARN)
  44. mrp->mr_writer = 1;
  45. #endif
  46. return 1;
  47. }
  48. static inline void mrunlock_excl(mrlock_t *mrp)
  49. {
  50. #if defined(DEBUG) || defined(XFS_WARN)
  51. mrp->mr_writer = 0;
  52. #endif
  53. up_write(&mrp->mr_lock);
  54. }
  55. static inline void mrunlock_shared(mrlock_t *mrp)
  56. {
  57. up_read(&mrp->mr_lock);
  58. }
  59. static inline void mrdemote(mrlock_t *mrp)
  60. {
  61. #if defined(DEBUG) || defined(XFS_WARN)
  62. mrp->mr_writer = 0;
  63. #endif
  64. downgrade_write(&mrp->mr_lock);
  65. }
  66. #endif /* __XFS_SUPPORT_MRLOCK_H__ */