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