58
58
#ifdef CONFIG_AUFS_DEBUG
59
#define DbgRcntInit(rw) do { \
59
#define AuDbgRcntInit(rw) do { \
60
60
atomic_set(&(rw)->rcnt, 0); \
64
#define DbgRcntInc(rw) atomic_inc_return(&(rw)->rcnt)
65
#define DbgRcntDec(rw) WARN_ON(atomic_dec_return(&(rw)->rcnt) < 0)
64
#define AuDbgRcntInc(rw) atomic_inc_return(&(rw)->rcnt)
65
#define AuDbgRcntDec(rw) WARN_ON(atomic_dec_return(&(rw)->rcnt) < 0)
67
#define DbgRcntInit(rw) do {} while (0)
68
#define DbgRcntInc(rw) do {} while (0)
69
#define DbgRcntDec(rw) do {} while (0)
67
#define AuDbgRcntInit(rw) do {} while (0)
68
#define AuDbgRcntInc(rw) do {} while (0)
69
#define AuDbgRcntDec(rw) do {} while (0)
70
70
#endif /* CONFIG_AUFS_DEBUG */
72
static inline void rw_init_nolock(struct aufs_rwsem *rw)
72
static inline void au_rw_init_nolock(struct au_rwsem *rw)
75
75
init_rwsem(&rw->rwsem);
78
static inline void rw_init_wlock(struct aufs_rwsem *rw)
78
static inline void au_rw_init_wlock(struct au_rwsem *rw)
80
au_rw_init_nolock(rw);
81
81
down_write(&rw->rwsem);
84
static inline void rw_init_wlock_nested(struct aufs_rwsem *rw, unsigned int lsc)
84
static inline void au_rw_init_wlock_nested(struct au_rwsem *rw,
87
au_rw_init_nolock(rw);
87
88
down_write_nested(&rw->rwsem, lsc);
90
static inline void rw_read_lock(struct aufs_rwsem *rw)
91
static inline void au_rw_read_lock(struct au_rwsem *rw)
92
93
down_read(&rw->rwsem);
96
static inline void rw_read_lock_nested(struct aufs_rwsem *rw, unsigned int lsc)
97
static inline void au_rw_read_lock_nested(struct au_rwsem *rw, unsigned int lsc)
98
99
down_read_nested(&rw->rwsem, lsc);
102
static inline void rw_read_unlock(struct aufs_rwsem *rw)
103
static inline void au_rw_read_unlock(struct au_rwsem *rw)
105
106
up_read(&rw->rwsem);
108
static inline void rw_dgrade_lock(struct aufs_rwsem *rw)
109
static inline void au_rw_dgrade_lock(struct au_rwsem *rw)
111
112
downgrade_write(&rw->rwsem);
114
static inline void rw_write_lock(struct aufs_rwsem *rw)
115
static inline void au_rw_write_lock(struct au_rwsem *rw)
116
117
down_write(&rw->rwsem);
119
static inline void rw_write_lock_nested(struct aufs_rwsem *rw, unsigned int lsc)
120
static inline void au_rw_write_lock_nested(struct au_rwsem *rw,
121
123
down_write_nested(&rw->rwsem, lsc);
124
static inline void rw_write_unlock(struct aufs_rwsem *rw)
126
static inline void au_rw_write_unlock(struct au_rwsem *rw)
126
128
up_write(&rw->rwsem);
129
131
/* why is not _nested version defined */
130
static inline int rw_read_trylock(struct aufs_rwsem *rw)
132
static inline int au_rw_read_trylock(struct au_rwsem *rw)
132
134
int ret = down_read_trylock(&rw->rwsem);
138
static inline int rw_write_trylock(struct aufs_rwsem *rw)
140
static inline int au_rw_write_trylock(struct au_rwsem *rw)
140
142
return down_write_trylock(&rw->rwsem);
147
149
/* to debug easier, do not make them inlined functions */
148
#define RwMustNoWaiters(rw) AuDebugOn(!list_empty(&(rw)->rwsem.wait_list))
149
#define RwMustAnyLock(rw) AuDebugOn(down_write_trylock(&(rw)->rwsem))
150
#define AuRwMustNoWaiters(rw) AuDebugOn(!list_empty(&(rw)->rwsem.wait_list))
151
#define AuRwMustAnyLock(rw) AuDebugOn(down_write_trylock(&(rw)->rwsem))
150
152
#ifdef CONFIG_AUFS_DEBUG
151
#define RwMustReadLock(rw) do { \
153
#define AuRwMustReadLock(rw) do { \
154
AuRwMustAnyLock(rw); \
153
155
AuDebugOn(!atomic_read(&(rw)->rcnt)); \
156
#define RwMustWriteLock(rw) do { \
158
#define AuRwMustWriteLock(rw) do { \
159
AuRwMustAnyLock(rw); \
158
160
AuDebugOn(atomic_read(&(rw)->rcnt)); \
161
#define RwMustReadLock(rw) RwMustAnyLock(rw)
162
#define RwMustWriteLock(rw) RwMustAnyLock(rw)
163
#define AuRwMustReadLock(rw) AuRwMustAnyLock(rw)
164
#define AuRwMustWriteLock(rw) AuRwMustAnyLock(rw)
163
165
#endif /* CONFIG_AUFS_DEBUG */
165
#define SimpleLockRwsemFuncs(prefix, param, rwsem) \
167
#define AuSimpleLockRwsemFuncs(prefix, param, rwsem) \
166
168
static inline void prefix##_read_lock(param) \
167
{ rw_read_lock(&(rwsem)); } \
169
{ au_rw_read_lock(&(rwsem)); } \
168
170
static inline void prefix##_write_lock(param) \
169
{ rw_write_lock(&(rwsem)); } \
171
{ au_rw_write_lock(&(rwsem)); } \
170
172
static inline int prefix##_read_trylock(param) \
171
{ return rw_read_trylock(&(rwsem)); } \
173
{ return au_rw_read_trylock(&(rwsem)); } \
172
174
static inline int prefix##_write_trylock(param) \
173
{ return rw_write_trylock(&(rwsem)); }
175
{ return au_rw_write_trylock(&(rwsem)); }
174
176
//static inline void prefix##_read_trylock_nested(param, lsc)
175
//{rw_read_trylock_nested(&(rwsem, lsc));}
177
//{au_rw_read_trylock_nested(&(rwsem, lsc));}
176
178
//static inline void prefix##_write_trylock_nestd(param, lsc)
177
//{rw_write_trylock_nested(&(rwsem), nested);}
179
//{au_rw_write_trylock_nested(&(rwsem), nested);}
179
#define SimpleUnlockRwsemFuncs(prefix, param, rwsem) \
181
#define AuSimpleUnlockRwsemFuncs(prefix, param, rwsem) \
180
182
static inline void prefix##_read_unlock(param) \
181
{ rw_read_unlock(&(rwsem)); } \
183
{ au_rw_read_unlock(&(rwsem)); } \
182
184
static inline void prefix##_write_unlock(param) \
183
{ rw_write_unlock(&(rwsem)); } \
185
{ au_rw_write_unlock(&(rwsem)); } \
184
186
static inline void prefix##_downgrade_lock(param) \
185
{ rw_dgrade_lock(&(rwsem)); }
187
{ au_rw_dgrade_lock(&(rwsem)); }
187
#define SimpleRwsemFuncs(prefix, param, rwsem) \
188
SimpleLockRwsemFuncs(prefix, param, rwsem) \
189
SimpleUnlockRwsemFuncs(prefix, param, rwsem)
189
#define AuSimpleRwsemFuncs(prefix, param, rwsem) \
190
AuSimpleLockRwsemFuncs(prefix, param, rwsem) \
191
AuSimpleUnlockRwsemFuncs(prefix, param, rwsem)
191
193
/* ---------------------------------------------------------------------- */
193
195
void *au_kzrealloc(void *p, unsigned int nused, unsigned int new_sz, gfp_t gfp);
196
struct nameidata *au_dup_nd(struct aufs_sbinfo *sbinfo, struct nameidata *dst,
198
struct nameidata *au_dup_nd(struct au_sbinfo *sbinfo, struct nameidata *dst,
197
199
struct nameidata *src);
198
201
struct nameidata *au_fake_dm(struct nameidata *fake_nd, struct nameidata *nd,
199
202
struct super_block *sb, aufs_bindex_t bindex);
200
203
void au_fake_dm_release(struct nameidata *fake_nd);