26
26
#include <linux/fs.h>
27
#include <asm/uaccess.h>
30
/* ---------------------------------------------------------------------- */
27
#include <linux/version.h>
28
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23) \
29
&& defined(CONFIG_AUFS_SPLICE_PATCH)
30
#include <linux/splice.h>
32
#ifdef CONFIG_AUFS_HINOTIFY
33
#include <linux/inotify.h>
36
/* ---------------------------------------------------------------------- */
38
struct aufs_hin_ignore;
40
#ifdef CONFIG_AUFS_HINOTIFY
41
/* inotify events to be ignored */
43
struct aufs_hin_ignore *ignore;
46
/* operation with delegation */
50
unsigned int force_unlink:1;
54
#ifdef CONFIG_AUFS_HINOTIFY
56
void do_vfsub_args_reinit(struct vfsub_args *vargs, struct aufs_hin_ignore *ign)
63
void vfsub_args_reinit(struct vfsub_args *vargs)
68
__u32 vfsub_events_notify_change(struct iattr *ia);
69
void vfsub_ign_hinode(struct vfsub_args *vargs, __u32 events,
70
struct aufs_hinode *hinode);
71
void vfsub_ign_inode(struct vfsub_args *vargs, __u32 events,
72
struct inode *inode, struct inode *h_inode);
74
void vfsub_ignore(struct vfsub_args *vargs);
75
void vfsub_unignore(struct vfsub_args *vargs);
78
void do_vfsub_args_reinit(struct vfsub_args *vargs, struct aufs_hin_ignore *ign)
84
void vfsub_args_reinit(struct vfsub_args *vargs)
89
static inline __u32 vfsub_events_notify_change(struct iattr *ia)
95
void vfsub_ign_hinode(struct vfsub_args *vargs, __u32 events,
96
struct aufs_hinode *hinode)
102
void vfsub_ign_inode(struct vfsub_args *vargs, __u32 events,
103
struct inode *inode, struct inode *h_inode)
108
static inline void vfsub_ignore(struct vfsub_args *vargs)
113
static inline void vfsub_unignore(struct vfsub_args *vargs)
117
#endif /* CONFIG_AUFS_HINOTIFY */
120
void vfsub_args_init(struct vfsub_args *vargs, struct aufs_hin_ignore *ign,
121
int dlgt, int force_unlink)
123
do_vfsub_args_reinit(vargs, ign);
124
vargs->dlgt = !!dlgt;
125
vargs->force_unlink = !!force_unlink;
128
/* ---------------------------------------------------------------------- */
130
/* lock subclass for hidden inode */
131
/* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */
134
AuLsc_I_Begin = I_MUTEX_QUOTA, /* 4 */
135
AuLsc_I_PARENT, /* hidden inode, parent first */
137
AuLsc_I_PARENT2, /* copyup dirs */
142
/* simple abstraction */
143
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 16)
144
static inline void vfsub_i_lock(struct inode *i)
149
static inline void vfsub_i_lock_nested(struct inode *i, unsigned lsc)
154
static inline void vfsub_i_unlock(struct inode *i)
159
static inline int vfsub_i_trylock(struct inode *i)
161
return down_trylock(&i->i_sem);
164
#define IMustLock(i) AuDebugOn(!down_trylock(&(i)->i_sem))
166
static inline void vfsub_i_lock(struct inode *i)
168
mutex_lock(&i->i_mutex);
171
static inline void vfsub_i_lock_nested(struct inode *i, unsigned lsc)
173
mutex_lock_nested(&i->i_mutex, lsc);
176
static inline void vfsub_i_unlock(struct inode *i)
178
mutex_unlock(&i->i_mutex);
181
static inline int vfsub_i_trylock(struct inode *i)
183
return mutex_trylock(&i->i_mutex);
186
#define IMustLock(i) MtxMustLock(&(i)->i_mutex)
187
#endif /* LINUX_VERSION_CODE */
190
struct dentry *vfsub_lock_rename(struct dentry *d1, struct dentry *d2)
195
d = lock_rename(d1, d2);
200
static inline void vfsub_unlock_rename(struct dentry *d1, struct dentry *d2)
203
unlock_rename(d1, d2);
207
/* ---------------------------------------------------------------------- */
209
#ifdef CONFIG_AUFS_WORKAROUND_FUSE
210
int au_update_fuse_h_inode(struct vfsmount *h_mnt, struct dentry *h_dentry);
213
int au_update_fuse_h_inode(struct vfsmount *h_mnt, struct dentry *h_dentry)
32
219
/* simple abstractions, for future use */
34
221
int do_vfsub_permission(struct inode *inode, int mask, struct nameidata *nd)
36
LKTRTrace("i%lu, mask 0x%x, nd %p\n", inode->i_ino, mask, nd);
223
LKTRTrace("i%lu, mask 0x%x, nd %d\n", inode->i_ino, mask, !!nd);
39
225
return permission(inode, mask, nd);
62
249
LKTRTrace("%s\n", name);
65
252
err = path_lookup(name, flags, nd);
255
au_update_fuse_h_inode(nd->mnt, nd->dentry); /*ignore*/
260
struct dentry *vfsub_lookup_one_len(const char *name, struct dentry *parent,
265
LKTRTrace("%.*s/%.*s\n", AuDLNPair(parent), len, name);
266
IMustLock(parent->d_inode);
268
d = lookup_one_len(name, parent, len);
270
au_update_fuse_h_inode(NULL, d); /*ignore*/
274
#ifdef CONFIG_AUFS_LHASH_PATCH
276
struct dentry *vfsub__lookup_hash(struct qstr *name, struct dentry *parent,
277
struct nameidata *nd)
281
LKTRTrace("%.*s/%.*s, nd %d\n",
282
AuDLNPair(parent), AuLNPair(name), !!nd);
283
IMustLock(parent->d_inode);
285
d = __lookup_hash(name, parent, nd);
287
au_update_fuse_h_inode(NULL, d); /*ignore*/
292
/* because of the internal lock, never use vfs_path_lookup() */
293
#if 0 //LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 23)
295
int vfsub_vfs_path_lookup(struct dentry *parent, struct vfsmount *mnt,
296
char *name, unsigned int flags, struct nameidata *nd)
300
LKTRTrace("%.*s/%s, 0x%x, nd{}\n", AuDLNPair(parent), name, flags);
302
/* vfs_path_lookup() will lock the parent inode */
304
err = vfs_path_lookup(parent, mnt, name, flags, nd);
307
au_update_fuse_h_inode(mnt, nd->dentry); /*ignore*/
70
314
/* ---------------------------------------------------------------------- */
73
317
int do_vfsub_create(struct inode *dir, struct dentry *dentry, int mode,
74
318
struct nameidata *nd)
76
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, DLNPair(dentry), mode);
79
return vfs_create(dir, dentry, mode, nd);
321
struct vfsmount *mnt;
323
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
326
err = vfs_create(dir, dentry, mode, nd);
331
/* dir inode is locked */
332
au_update_fuse_h_inode(mnt, dentry->d_parent); /*ignore*/
333
au_update_fuse_h_inode(mnt, dentry); /*ignore*/
84
339
int do_vfsub_symlink(struct inode *dir, struct dentry *dentry,
85
340
const char *symname, int mode)
87
344
LKTRTrace("i%lu, %.*s, %s, 0x%x\n",
88
dir->i_ino, DLNPair(dentry), symname, mode);
89
#if 0//def CONFIG_VSERVER
90
return vfs_symlink(dir, dentry, symname, mode, NULL);
92
return vfs_symlink(dir, dentry, NULL, symname, mode);
345
dir->i_ino, AuDLNPair(dentry), symname, mode);
348
err = vfs_symlink(dir, dentry, symname, mode);
350
/* dir inode is locked */
351
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
352
au_update_fuse_h_inode(NULL, dentry); /*ignore*/
97
358
int do_vfsub_mknod(struct inode *dir, struct dentry *dentry, int mode,
100
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, DLNPair(dentry), mode);
101
#if 0//def CONFIG_VSERVER
102
return vfs_mknod(dir, dentry, mode, dev, NULL);
104
return vfs_mknod(dir, dentry, NULL, mode, dev);
363
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
366
err = vfs_mknod(dir, dentry, mode, dev);
368
/* dir inode is locked */
369
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
370
au_update_fuse_h_inode(NULL, dentry); /*ignore*/
114
381
LKTRTrace("%.*s, i%lu, %.*s\n",
115
DLNPair(src_dentry), dir->i_ino, DLNPair(dentry));
382
AuDLNPair(src_dentry), dir->i_ino, AuDLNPair(dentry));
118
#if 0//def CONFIG_VSERVER
119
err = vfs_link(src_dentry, dir, dentry, NULL);
121
err = vfs_link(src_dentry, NULL, dir, dentry, NULL);
386
err = vfs_link(src_dentry, dir, dentry);
389
LKTRTrace("src_i %p, dst_i %p\n",
390
src_dentry->d_inode, dentry->d_inode);
391
/* fuse has different memory inode for the same inumber */
392
au_update_fuse_h_inode(NULL, src_dentry); /*ignore*/
393
/* dir inode is locked */
394
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
395
au_update_fuse_h_inode(NULL, dentry); /*ignore*/
133
406
LKTRTrace("i%lu, %.*s, i%lu, %.*s\n",
134
src_dir->i_ino, DLNPair(src_dentry),
135
dir->i_ino, DLNPair(dentry));
407
src_dir->i_ino, AuDLNPair(src_dentry),
408
dir->i_ino, AuDLNPair(dentry));
140
err = vfs_rename(src_dir, src_dentry, NULL, dir, dentry, NULL);
413
err = vfs_rename(src_dir, src_dentry, dir, dentry);
416
/* dir inode is locked */
417
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
418
au_update_fuse_h_inode(NULL, src_dentry->d_parent); /*ignore*/
419
au_update_fuse_h_inode(NULL, src_dentry); /*ignore*/
147
425
int do_vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode)
149
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, DLNPair(dentry), mode);
150
#if 0//def CONFIG_VSERVER
151
return vfs_mkdir(dir, dentry, mode, NULL);
153
return vfs_mkdir(dir, dentry, NULL, mode);
429
LKTRTrace("i%lu, %.*s, 0x%x\n", dir->i_ino, AuDLNPair(dentry), mode);
432
err = vfs_mkdir(dir, dentry, mode);
434
/* dir inode is locked */
435
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
436
au_update_fuse_h_inode(NULL, dentry); /*ignore*/
157
441
static inline int do_vfsub_rmdir(struct inode *dir, struct dentry *dentry)
161
LKTRTrace("i%lu, %.*s\n", dir->i_ino, DLNPair(dentry));
445
LKTRTrace("i%lu, %.*s\n", dir->i_ino, AuDLNPair(dentry));
164
#if 0//def CONFIG_VSERVER
165
err = vfs_rmdir(dir, dentry, NULL);
167
err = vfs_rmdir(dir, dentry, NULL);
449
err = vfs_rmdir(dir, dentry);
451
/* dir inode is locked */
453
au_update_fuse_h_inode(NULL, dentry->d_parent); /*ignore*/
197
482
LKTRTrace("%.*s, cnt %lu, pos %Ld\n",
198
DLNPair(file->f_dentry), (unsigned long)count, *ppos);
483
AuDLNPair(file->f_dentry), (unsigned long)count, *ppos);
200
/* nfs uses some locks */
204
err = vfs_read(file, ubuf, count, ppos);
485
if (0 /*!au_test_nfs(file->f_vfsmnt->mnt_sb)*/)
486
err = vfs_read(file, ubuf, count, ppos);
489
err = vfs_read(file, ubuf, count, ppos);
493
au_update_fuse_h_inode(file->f_vfsmnt, file->f_dentry);
262
LKTRTrace("%.*s\n", DLNPair(file->f_dentry));
550
LKTRTrace("%.*s\n", AuDLNPair(file->f_dentry));
267
553
err = vfs_readdir(file, filldir, arg);
556
au_update_fuse_h_inode(file->f_vfsmnt, file->f_dentry);
561
/* ---------------------------------------------------------------------- */
563
#ifdef CONFIG_AUFS_SPLICE_PATCH
565
long do_vfsub_splice_to(struct file *in, loff_t *ppos,
566
struct pipe_inode_info *pipe, size_t len,
571
LKTRTrace("%.*s, pos %Ld, len %lu, 0x%x\n",
572
AuDLNPair(in->f_dentry), *ppos, (unsigned long)len, flags);
575
err = do_splice_to(in, ppos, pipe, len, flags);
578
au_update_fuse_h_inode(in->f_vfsmnt, in->f_dentry); /*ignore*/
583
long do_vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
584
loff_t *ppos, size_t len, unsigned int flags)
588
LKTRTrace("%.*s, pos %Ld, len %lu, 0x%x\n",
589
AuDLNPair(out->f_dentry), *ppos, (unsigned long)len, flags);
592
err = do_splice_from(pipe, out, ppos, len, flags);
595
au_update_fuse_h_inode(out->f_vfsmnt, out->f_dentry); /*ignore*/
600
long do_vfsub_splice_to(struct file *in, loff_t *ppos,
601
struct pipe_inode_info *pipe, size_t len,
608
long do_vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
609
loff_t *ppos, size_t len, unsigned int flags)
613
#endif /* CONFIG_AUFS_SPLICE_PATCH */
273
615
/* ---------------------------------------------------------------------- */
279
LKTRTrace("%.*s\n", DLNPair(file->f_dentry));
621
LKTRTrace("%.*s\n", AuDLNPair(file->f_dentry));
284
624
err = vfs_llseek(file, offset, origin);
629
static inline int do_vfsub_getattr(struct vfsmount *mnt, struct dentry *dentry,
632
LKTRTrace("%.*s\n", AuDLNPair(dentry));
633
return vfs_getattr(mnt, dentry, st);
290
636
/* ---------------------------------------------------------------------- */
292
#ifdef CONFIG_AUFS_DLGT
293
static inline int need_dlgt(struct super_block *sb)
295
return (au_flag_test(sb, AuFlag_DLGT) && !is_au_wkq(current));
638
#if defined(CONFIG_AUFS_DLGT) || defined(CONFIG_AUFS_HINOTIFY)
298
639
int vfsub_permission(struct inode *inode, int mask, struct nameidata *nd,
307
648
int vfsub_link(struct dentry *src_dentry, struct inode *dir,
308
649
struct dentry *dentry, int dlgt);
309
650
int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
310
struct inode *dir, struct dentry *dentry, int dlgt);
651
struct inode *dir, struct dentry *dentry,
652
struct vfsub_args *vargs);
311
653
int vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode, int dlgt);
312
int vfsub_rmdir(struct inode *dir, struct dentry *dentry, int dlgt);
654
int vfsub_rmdir(struct inode *dir, struct dentry *dentry,
655
struct vfsub_args *vargs);
314
657
ssize_t vfsub_read_u(struct file *file, char __user *ubuf, size_t count,
315
658
loff_t *ppos, int dlgt);
316
659
ssize_t vfsub_read_k(struct file *file, void *kbuf, size_t count, loff_t *ppos,
318
661
ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count,
319
loff_t *ppos, int dlgt);
662
loff_t *ppos, struct vfsub_args *vargs);
320
663
ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos,
664
struct vfsub_args *vargs);
322
665
int vfsub_readdir(struct file *file, filldir_t filldir, void *arg, int dlgt);
666
long vfsub_splice_to(struct file *in, loff_t *ppos,
667
struct pipe_inode_info *pipe, size_t len,
668
unsigned int flags, int dlgt);
669
long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
670
loff_t *ppos, size_t len, unsigned int flags,
671
struct vfsub_args *vargs);
673
int vfsub_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *st,
326
static inline int need_dlgt(struct super_block *sb)
332
678
int vfsub_permission(struct inode *inode, int mask, struct nameidata *nd,
367
713
int vfsub_rename(struct inode *src_dir, struct dentry *src_dentry,
368
struct inode *dir, struct dentry *dentry, int dlgt)
714
struct inode *dir, struct dentry *dentry,
715
struct vfsub_args *vargs)
370
return do_vfsub_rename(src_dir, src_dentry, dir, dentry);
720
err = do_vfsub_rename(src_dir, src_dentry, dir, dentry);
722
vfsub_unignore(vargs);
374
int vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode,
727
int vfsub_mkdir(struct inode *dir, struct dentry *dentry, int mode, int dlgt)
377
729
return do_vfsub_mkdir(dir, dentry, mode);
381
int vfsub_rmdir(struct inode *dir, struct dentry *dentry, int dlgt)
733
int vfsub_rmdir(struct inode *dir, struct dentry *dentry,
734
struct vfsub_args *vargs)
383
return do_vfsub_rmdir(dir, dentry);
739
err = do_vfsub_rmdir(dir, dentry);
741
vfsub_unignore(vargs);
401
760
ssize_t vfsub_write_u(struct file *file, const char __user *ubuf, size_t count,
402
loff_t *ppos, int dlgt)
761
loff_t *ppos, struct vfsub_args *vargs)
404
return do_vfsub_write_u(file, ubuf, count, ppos);
766
err = do_vfsub_write_u(file, ubuf, count, ppos);
767
if (unlikely(err < 0))
768
vfsub_unignore(vargs);
408
773
ssize_t vfsub_write_k(struct file *file, void *kbuf, size_t count, loff_t *ppos,
774
struct vfsub_args *vargs)
411
return do_vfsub_write_k(file, kbuf, count, ppos);
779
err = do_vfsub_write_k(file, kbuf, count, ppos);
780
if (unlikely(err < 0))
781
vfsub_unignore(vargs);
417
788
return do_vfsub_readdir(file, filldir, arg);
419
#endif /* CONFIG_AUFS_DLGT */
421
/* ---------------------------------------------------------------------- */
424
struct dentry *vfsub_lock_rename(struct dentry *d1, struct dentry *d2)
429
d = lock_rename(d1, d2);
434
static inline void vfsub_unlock_rename(struct dentry *d1, struct dentry *d2)
437
unlock_rename(d1, d2);
441
/* ---------------------------------------------------------------------- */
443
int vfsub_notify_change(struct dentry *dentry, struct iattr *ia, int dlgt);
444
int vfsub_unlink(struct inode *dir, struct dentry *dentry, int dlgt);
792
long vfsub_splice_to(struct file *in, loff_t *ppos,
793
struct pipe_inode_info *pipe, size_t len,
794
unsigned int flags, int dlgt)
796
return do_vfsub_splice_to(in, ppos, pipe, len, flags);
800
long vfsub_splice_from(struct pipe_inode_info *pipe, struct file *out,
801
loff_t *ppos, size_t len, unsigned int flags,
802
struct vfsub_args *vargs)
807
err = do_vfsub_splice_from(pipe, out, ppos, len, flags);
808
if (unlikely(err < 0))
809
vfsub_unignore(vargs);
813
static inline int vfsub_getattr(struct vfsmount *mnt, struct dentry *dentry,
814
struct kstat *st, int dlgt)
816
return do_vfsub_getattr(mnt, dentry, st);
818
#endif /* CONFIG_AUFS_DLGT || CONFIG_AUFS_HINOTIFY */
820
/* ---------------------------------------------------------------------- */
822
int vfsub_sio_mkdir(struct inode *dir, struct dentry *dentry, int mode,
824
int vfsub_sio_rmdir(struct inode *dir, struct dentry *dentry, int dlgt);
826
/* ---------------------------------------------------------------------- */
828
int vfsub_notify_change(struct dentry *dentry, struct iattr *ia,
829
struct vfsub_args *vargs);
830
int vfsub_unlink(struct inode *dir, struct dentry *dentry,
831
struct vfsub_args *vargs);
445
832
int vfsub_statfs(void *arg, struct kstatfs *buf, int dlgt);
447
834
#endif /* __KERNEL__ */