99
104
int aufs_rename(struct inode *src_dir, struct dentry *src_dentry,
100
105
struct inode *dir, struct dentry *dentry);
107
#ifdef CONFIG_AUFS_DLGT
109
int au_security_inode_permission(struct inode *h_inode, int mask,
110
struct nameidata *fake_nd, int dlgt);
113
int au_security_inode_permission(struct inode *h_inode, int mask,
114
struct nameidata *fake_nd, int dlgt)
116
return security_inode_permission(h_inode, mask, fake_nd);
118
#endif /* CONFIG_AUFS_DLGT */
120
#ifdef CONFIG_AUFS_WORKAROUND_FUSE
122
int aufs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *st);
104
127
int aufs_setxattr(struct dentry *dentry, const char *name, const void *value,
113
struct aufs_iinfo *itoii(struct inode *inode);
114
aufs_bindex_t ibstart(struct inode *inode);
115
aufs_bindex_t ibend(struct inode *inode);
116
struct aufs_vdir *ivdir(struct inode *inode);
117
struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex);
136
struct au_iinfo *au_ii(struct inode *inode);
118
137
struct inode *au_h_iptr_i(struct inode *inode, aufs_bindex_t bindex);
119
struct inode *au_h_iptr(struct inode *inode);
120
aufs_bindex_t itoid_index(struct inode *inode, aufs_bindex_t bindex);
138
aufs_bindex_t au_ii_br_id(struct inode *inode, aufs_bindex_t bindex);
122
void set_ibstart(struct inode *inode, aufs_bindex_t bindex);
123
void set_ibend(struct inode *inode, aufs_bindex_t bindex);
124
void set_ivdir(struct inode *inode, struct aufs_vdir *vdir);
125
void set_hi_wh(struct inode *inode, aufs_bindex_t bindex, struct dentry *h_wh);
126
void aufs_hiput(struct aufs_hinode *hinode);
140
void au_set_ibstart(struct inode *inode, aufs_bindex_t bindex);
141
void au_set_hi_wh(struct inode *inode, aufs_bindex_t bindex,
142
struct dentry *h_wh);
127
143
unsigned int au_hi_flags(struct inode *inode, int isdir);
128
struct aufs_hinode *itohi(struct inode *inode, aufs_bindex_t bindex);
130
145
/* hinode flags */
131
146
#define AuHi_XINO 1
147
166
#ifdef CONFIG_AUFS_DEBUG
148
void au_list_plink(struct super_block *sb);
167
void au_plink_list(struct super_block *sb);
150
static inline void au_list_plink(struct super_block *sb)
169
static inline void au_plink_list(struct super_block *sb)
155
int au_test_plink(struct super_block *sb, struct inode *inode);
156
struct dentry *au_lkup_plink(struct super_block *sb, aufs_bindex_t bindex,
174
int au_plink_test(struct super_block *sb, struct inode *inode);
175
struct dentry *au_plink_lkup(struct super_block *sb, aufs_bindex_t bindex,
157
176
struct inode *inode);
158
void au_append_plink(struct super_block *sb, struct inode *inode,
177
void au_plink_append(struct super_block *sb, struct inode *inode,
159
178
struct dentry *h_dentry, aufs_bindex_t bindex);
160
void au_put_plink(struct super_block *sb);
161
void au_half_refresh_plink(struct super_block *sb, aufs_bindex_t br_id);
163
/* ---------------------------------------------------------------------- */
165
/* tiny test for inode number */
166
/* tmpfs generation is too rough */
167
static inline int au_test_higen(struct inode *inode, struct inode *h_inode)
169
//IiMustAnyLock(inode);
170
return !(itoii(inode)->ii_hsb1 == h_inode->i_sb
171
&& inode->i_generation == h_inode->i_generation);
174
static inline au_gen_t au_iigen(struct inode *inode)
176
return atomic_read(&itoii(inode)->ii_generation);
179
#ifdef CONFIG_AUFS_HINOTIFY
180
static inline au_gen_t au_iigen_dec(struct inode *inode)
182
//AuDbg("i%lu\n", inode->i_ino);
183
return atomic_dec_return(&itoii(inode)->ii_generation);
179
void au_plink_put(struct super_block *sb);
180
void au_plink_half_refresh(struct super_block *sb, aufs_bindex_t br_id);
187
182
/* ---------------------------------------------------------------------- */
208
203
* ii_read_lock_parent4, ii_write_lock_parent4,
209
204
* ii_read_lock_new, ii_write_lock_new
211
#define ReadLockFunc(name, lsc) \
206
#define AuReadLockFunc(name, lsc) \
212
207
static inline void ii_read_lock_##name(struct inode *i) \
213
{ rw_read_lock_nested(&itoii(i)->ii_rwsem, AuLsc_II_##lsc); }
208
{ au_rw_read_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); }
215
#define WriteLockFunc(name, lsc) \
210
#define AuWriteLockFunc(name, lsc) \
216
211
static inline void ii_write_lock_##name(struct inode *i) \
217
{ rw_write_lock_nested(&itoii(i)->ii_rwsem, AuLsc_II_##lsc); }
219
#define RWLockFuncs(name, lsc) \
220
ReadLockFunc(name, lsc) \
221
WriteLockFunc(name, lsc)
223
RWLockFuncs(child, CHILD);
224
RWLockFuncs(child2, CHILD2);
225
RWLockFuncs(child3, CHILD3);
226
RWLockFuncs(parent, PARENT);
227
RWLockFuncs(parent2, PARENT2);
228
RWLockFuncs(parent3, PARENT3);
229
RWLockFuncs(parent4, PARENT4);
230
RWLockFuncs(new, NEW);
212
{ au_rw_write_lock_nested(&au_ii(i)->ii_rwsem, AuLsc_II_##lsc); }
214
#define AuRWLockFuncs(name, lsc) \
215
AuReadLockFunc(name, lsc) \
216
AuWriteLockFunc(name, lsc)
218
AuRWLockFuncs(child, CHILD);
219
AuRWLockFuncs(child2, CHILD2);
220
AuRWLockFuncs(child3, CHILD3);
221
AuRWLockFuncs(parent, PARENT);
222
AuRWLockFuncs(parent2, PARENT2);
223
AuRWLockFuncs(parent3, PARENT3);
224
AuRWLockFuncs(parent4, PARENT4);
225
AuRWLockFuncs(new, NEW);
227
#undef AuReadLockFunc
228
#undef AuWriteLockFunc
237
232
* ii_read_unlock, ii_write_unlock, ii_downgrade_lock
239
SimpleUnlockRwsemFuncs(ii, struct inode *i, itoii(i)->ii_rwsem);
234
AuSimpleUnlockRwsemFuncs(ii, struct inode *i, au_ii(i)->ii_rwsem);
241
236
/* to debug easier, do not make them inlined functions */
242
237
#define IiMustReadLock(i) do { \
243
238
SiMustAnyLock((i)->i_sb); \
244
RwMustReadLock(&itoii(i)->ii_rwsem); \
239
AuRwMustReadLock(&au_ii(i)->ii_rwsem); \
247
242
#define IiMustWriteLock(i) do { \
248
243
SiMustAnyLock((i)->i_sb); \
249
RwMustWriteLock(&itoii(i)->ii_rwsem); \
244
AuRwMustWriteLock(&au_ii(i)->ii_rwsem); \
252
247
#define IiMustAnyLock(i) do { \
253
248
SiMustAnyLock((i)->i_sb); \
254
RwMustAnyLock(&itoii(i)->ii_rwsem); \
249
AuRwMustAnyLock(&au_ii(i)->ii_rwsem); \
257
#define IiMustNoWaiters(i) RwMustNoWaiters(&itoii(i)->ii_rwsem)
252
#define IiMustNoWaiters(i) AuRwMustNoWaiters(&au_ii(i)->ii_rwsem)
254
/* ---------------------------------------------------------------------- */
256
static inline aufs_bindex_t au_ibstart(struct inode *inode)
258
IiMustAnyLock(inode);
259
return au_ii(inode)->ii_bstart;
262
static inline aufs_bindex_t au_ibend(struct inode *inode)
264
IiMustAnyLock(inode);
265
return au_ii(inode)->ii_bend;
268
static inline struct au_vdir *au_ivdir(struct inode *inode)
270
IiMustAnyLock(inode);
271
AuDebugOn(!S_ISDIR(inode->i_mode));
272
return au_ii(inode)->ii_vdir;
275
static inline struct dentry *au_hi_wh(struct inode *inode, aufs_bindex_t bindex)
277
struct au_hinode *hinode;
278
IiMustAnyLock(inode);
279
hinode = au_ii(inode)->ii_hinode + bindex;
280
return hinode->hi_whdentry;
283
static inline struct inode *au_h_iptr(struct inode *inode)
285
return au_h_iptr_i(inode, au_ibstart(inode));
288
static inline void au_set_ibend(struct inode *inode, aufs_bindex_t bindex)
290
IiMustWriteLock(inode);
291
AuDebugOn(au_sbend(inode->i_sb) < bindex || bindex < au_ibstart(inode));
292
au_ii(inode)->ii_bend = bindex;
295
static inline void au_set_ivdir(struct inode *inode, struct au_vdir *vdir)
297
IiMustWriteLock(inode);
298
AuDebugOn(!S_ISDIR(inode->i_mode) || (au_ii(inode)->ii_vdir && vdir));
299
au_ii(inode)->ii_vdir = vdir;
302
static inline void au_hiput(struct au_hinode *hinode)
305
dput(hinode->hi_whdentry);
306
iput(hinode->hi_inode);
309
static inline struct au_hinode *au_hi(struct inode *inode, aufs_bindex_t bindex)
311
//todo: this lock check causes some unnecessary locks in callers.
312
IiMustAnyLock(inode);
313
return au_ii(inode)->ii_hinode + bindex;
316
/* tiny test for inode number */
317
/* tmpfs generation is too rough */
318
static inline int au_test_higen(struct inode *inode, struct inode *h_inode)
320
//IiMustAnyLock(inode);
321
return !(au_ii(inode)->ii_hsb1 == h_inode->i_sb
322
&& inode->i_generation == h_inode->i_generation);
325
static inline au_gen_t au_iigen(struct inode *inode)
327
return atomic_read(&au_ii(inode)->ii_generation);
330
#ifdef CONFIG_AUFS_HINOTIFY
331
static inline au_gen_t au_iigen_dec(struct inode *inode)
333
//AuDbg("i%lu\n", inode->i_ino);
334
return atomic_dec_return(&au_ii(inode)->ii_generation);
259
338
#endif /* __KERNEL__ */
260
339
#endif /* __AUFS_INODE_H__ */