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