]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - fs/aufs/vfsub.h
2 * Copyright (C) 2005-2017 Junjiro R. Okajima
4 * This program, aufs is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 * sub-routines for VFS
22 #ifndef __AUFS_VFSUB_H__
23 #define __AUFS_VFSUB_H__
28 #include <linux/mount.h>
29 #include <linux/posix_acl.h>
30 #include <linux/xattr.h>
33 /* copied from linux/fs/internal.h */
34 /* todo: BAD approach!! */
35 extern void __mnt_drop_write(struct vfsmount
*);
36 extern int open_check_o_direct(struct file
*f
);
38 /* ---------------------------------------------------------------------- */
40 /* lock subclass for lower inode */
41 /* default MAX_LOCKDEP_SUBCLASSES(8) is not enough */
42 /* reduce? gave up. */
44 AuLsc_I_Begin
= I_MUTEX_PARENT2
, /* 5 */
45 AuLsc_I_PARENT
, /* lower inode, parent first */
46 AuLsc_I_PARENT2
, /* copyup dirs */
47 AuLsc_I_PARENT3
, /* copyup wh */
53 /* to debug easier, do not make them inlined functions */
54 #define MtxMustLock(mtx) AuDebugOn(!mutex_is_locked(mtx))
55 #define IMustLock(i) AuDebugOn(!inode_is_locked(i))
57 /* ---------------------------------------------------------------------- */
59 static inline void vfsub_drop_nlink(struct inode
*inode
)
61 AuDebugOn(!inode
->i_nlink
);
65 static inline void vfsub_dead_dir(struct inode
*inode
)
67 AuDebugOn(!S_ISDIR(inode
->i_mode
));
68 inode
->i_flags
|= S_DEAD
;
72 static inline int vfsub_native_ro(struct inode
*inode
)
74 return (inode
->i_sb
->s_flags
& MS_RDONLY
)
76 /* || IS_APPEND(inode) */
77 || IS_IMMUTABLE(inode
);
80 #ifdef CONFIG_AUFS_BR_FUSE
81 int vfsub_test_mntns(struct vfsmount
*mnt
, struct super_block
*h_sb
);
83 AuStubInt0(vfsub_test_mntns
, struct vfsmount
*mnt
, struct super_block
*h_sb
);
86 int vfsub_sync_filesystem(struct super_block
*h_sb
, int wait
);
88 /* ---------------------------------------------------------------------- */
90 int vfsub_update_h_iattr(struct path
*h_path
, int *did
);
91 struct file
*vfsub_dentry_open(struct path
*path
, int flags
);
92 struct file
*vfsub_filp_open(const char *path
, int oflags
, int mode
);
93 struct vfsub_aopen_args
{
95 unsigned int open_flag
;
100 int vfsub_atomic_open(struct inode
*dir
, struct dentry
*dentry
,
101 struct vfsub_aopen_args
*args
, struct au_branch
*br
);
102 int vfsub_kern_path(const char *name
, unsigned int flags
, struct path
*path
);
104 struct dentry
*vfsub_lookup_one_len_unlocked(const char *name
,
105 struct dentry
*parent
, int len
);
106 struct dentry
*vfsub_lookup_one_len(const char *name
, struct dentry
*parent
,
109 struct vfsub_lkup_one_args
{
110 struct dentry
**errp
;
112 struct dentry
*parent
;
115 static inline struct dentry
*vfsub_lkup_one(struct qstr
*name
,
116 struct dentry
*parent
)
118 return vfsub_lookup_one_len(name
->name
, parent
, name
->len
);
121 void vfsub_call_lkup_one(void *args
);
123 /* ---------------------------------------------------------------------- */
125 static inline int vfsub_mnt_want_write(struct vfsmount
*mnt
)
130 err
= mnt_want_write(mnt
);
135 static inline void vfsub_mnt_drop_write(struct vfsmount
*mnt
)
143 static inline void vfsub_mnt_drop_write_file(struct file
*file
)
146 mnt_drop_write_file(file
);
151 /* ---------------------------------------------------------------------- */
154 struct dentry
*vfsub_lock_rename(struct dentry
*d1
, struct au_hinode
*hdir1
,
155 struct dentry
*d2
, struct au_hinode
*hdir2
);
156 void vfsub_unlock_rename(struct dentry
*d1
, struct au_hinode
*hdir1
,
157 struct dentry
*d2
, struct au_hinode
*hdir2
);
159 int vfsub_create(struct inode
*dir
, struct path
*path
, int mode
,
161 int vfsub_symlink(struct inode
*dir
, struct path
*path
,
162 const char *symname
);
163 int vfsub_mknod(struct inode
*dir
, struct path
*path
, int mode
, dev_t dev
);
164 int vfsub_link(struct dentry
*src_dentry
, struct inode
*dir
,
165 struct path
*path
, struct inode
**delegated_inode
);
166 int vfsub_rename(struct inode
*src_hdir
, struct dentry
*src_dentry
,
167 struct inode
*hdir
, struct path
*path
,
168 struct inode
**delegated_inode
, unsigned int flags
);
169 int vfsub_mkdir(struct inode
*dir
, struct path
*path
, int mode
);
170 int vfsub_rmdir(struct inode
*dir
, struct path
*path
);
172 /* ---------------------------------------------------------------------- */
174 ssize_t
vfsub_read_u(struct file
*file
, char __user
*ubuf
, size_t count
,
176 ssize_t
vfsub_read_k(struct file
*file
, void *kbuf
, size_t count
,
178 ssize_t
vfsub_write_u(struct file
*file
, const char __user
*ubuf
, size_t count
,
180 ssize_t
vfsub_write_k(struct file
*file
, void *kbuf
, size_t count
,
182 int vfsub_flush(struct file
*file
, fl_owner_t id
);
183 int vfsub_iterate_dir(struct file
*file
, struct dir_context
*ctx
);
185 static inline loff_t
vfsub_f_size_read(struct file
*file
)
187 return i_size_read(file_inode(file
));
190 static inline unsigned int vfsub_file_flags(struct file
*file
)
194 spin_lock(&file
->f_lock
);
195 flags
= file
->f_flags
;
196 spin_unlock(&file
->f_lock
);
201 static inline int vfsub_file_execed(struct file
*file
)
203 /* todo: direct access f_flags */
204 return !!(vfsub_file_flags(file
) & __FMODE_EXEC
);
208 static inline void vfsub_file_accessed(struct file
*h_file
)
210 file_accessed(h_file
);
211 vfsub_update_h_iattr(&h_file
->f_path
, /*did*/NULL
); /*ignore*/
216 static inline void vfsub_touch_atime(struct vfsmount
*h_mnt
,
217 struct dentry
*h_dentry
)
219 struct path h_path
= {
223 touch_atime(&h_path
);
224 vfsub_update_h_iattr(&h_path
, /*did*/NULL
); /*ignore*/
228 static inline int vfsub_update_time(struct inode
*h_inode
, struct timespec
*ts
,
231 return update_time(h_inode
, ts
, flags
);
232 /* no vfsub_update_h_iattr() since we don't have struct path */
235 #ifdef CONFIG_FS_POSIX_ACL
236 static inline int vfsub_acl_chmod(struct inode
*h_inode
, umode_t h_mode
)
240 err
= posix_acl_chmod(h_inode
, h_mode
);
241 if (err
== -EOPNOTSUPP
)
246 AuStubInt0(vfsub_acl_chmod
, struct inode
*h_inode
, umode_t h_mode
);
249 long vfsub_splice_to(struct file
*in
, loff_t
*ppos
,
250 struct pipe_inode_info
*pipe
, size_t len
,
252 long vfsub_splice_from(struct pipe_inode_info
*pipe
, struct file
*out
,
253 loff_t
*ppos
, size_t len
, unsigned int flags
);
255 static inline long vfsub_truncate(struct path
*path
, loff_t length
)
260 err
= vfs_truncate(path
, length
);
265 int vfsub_trunc(struct path
*h_path
, loff_t length
, unsigned int attr
,
266 struct file
*h_file
);
267 int vfsub_fsync(struct file
*file
, struct path
*path
, int datasync
);
270 * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such
273 static inline int vfsub_clone_file_range(struct file
*src
, struct file
*dst
,
279 err
= vfs_clone_file_range(src
, 0, dst
, 0, len
);
285 /* copy_file_range(2) is a systemcall */
286 static inline ssize_t
vfsub_copy_file_range(struct file
*src
, loff_t src_pos
,
287 struct file
*dst
, loff_t dst_pos
,
288 size_t len
, unsigned int flags
)
293 ssz
= vfs_copy_file_range(src
, src_pos
, dst
, dst_pos
, len
, flags
);
299 /* ---------------------------------------------------------------------- */
301 static inline loff_t
vfsub_llseek(struct file
*file
, loff_t offset
, int origin
)
306 err
= vfs_llseek(file
, offset
, origin
);
311 /* ---------------------------------------------------------------------- */
313 int vfsub_sio_mkdir(struct inode
*dir
, struct path
*path
, int mode
);
314 int vfsub_sio_rmdir(struct inode
*dir
, struct path
*path
);
315 int vfsub_sio_notify_change(struct path
*path
, struct iattr
*ia
,
316 struct inode
**delegated_inode
);
317 int vfsub_notify_change(struct path
*path
, struct iattr
*ia
,
318 struct inode
**delegated_inode
);
319 int vfsub_unlink(struct inode
*dir
, struct path
*path
,
320 struct inode
**delegated_inode
, int force
);
322 static inline int vfsub_getattr(const struct path
*path
, struct kstat
*st
)
324 return vfs_getattr(path
, st
, STATX_BASIC_STATS
, AT_STATX_SYNC_AS_STAT
);
327 /* ---------------------------------------------------------------------- */
329 static inline int vfsub_setxattr(struct dentry
*dentry
, const char *name
,
330 const void *value
, size_t size
, int flags
)
335 err
= vfs_setxattr(dentry
, name
, value
, size
, flags
);
341 static inline int vfsub_removexattr(struct dentry
*dentry
, const char *name
)
346 err
= vfs_removexattr(dentry
, name
);
352 #endif /* __KERNEL__ */
353 #endif /* __AUFS_VFSUB_H__ */