]>
git.proxmox.com Git - mirror_ubuntu-bionic-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 /* why VFS doesn't define it? */
59 void vfsub_inode_lock_shared_nested(struct inode
*inode
, unsigned int sc
)
61 down_read_nested(&inode
->i_rwsem
, sc
);
64 /* ---------------------------------------------------------------------- */
66 static inline void vfsub_drop_nlink(struct inode
*inode
)
68 AuDebugOn(!inode
->i_nlink
);
72 static inline void vfsub_dead_dir(struct inode
*inode
)
74 AuDebugOn(!S_ISDIR(inode
->i_mode
));
75 inode
->i_flags
|= S_DEAD
;
79 static inline int vfsub_native_ro(struct inode
*inode
)
81 return sb_rdonly(inode
->i_sb
)
83 /* || IS_APPEND(inode) */
84 || IS_IMMUTABLE(inode
);
87 #ifdef CONFIG_AUFS_BR_FUSE
88 int vfsub_test_mntns(struct vfsmount
*mnt
, struct super_block
*h_sb
);
90 AuStubInt0(vfsub_test_mntns
, struct vfsmount
*mnt
, struct super_block
*h_sb
);
93 int vfsub_sync_filesystem(struct super_block
*h_sb
, int wait
);
95 /* ---------------------------------------------------------------------- */
97 int vfsub_update_h_iattr(struct path
*h_path
, int *did
);
98 struct file
*vfsub_dentry_open(struct path
*path
, int flags
);
99 struct file
*vfsub_filp_open(const char *path
, int oflags
, int mode
);
100 struct vfsub_aopen_args
{
102 unsigned int open_flag
;
107 int vfsub_atomic_open(struct inode
*dir
, struct dentry
*dentry
,
108 struct vfsub_aopen_args
*args
, struct au_branch
*br
);
109 int vfsub_kern_path(const char *name
, unsigned int flags
, struct path
*path
);
111 struct dentry
*vfsub_lookup_one_len_unlocked(const char *name
,
112 struct dentry
*parent
, int len
);
113 struct dentry
*vfsub_lookup_one_len(const char *name
, struct dentry
*parent
,
116 struct vfsub_lkup_one_args
{
117 struct dentry
**errp
;
119 struct dentry
*parent
;
122 static inline struct dentry
*vfsub_lkup_one(struct qstr
*name
,
123 struct dentry
*parent
)
125 return vfsub_lookup_one_len(name
->name
, parent
, name
->len
);
128 void vfsub_call_lkup_one(void *args
);
130 /* ---------------------------------------------------------------------- */
132 static inline int vfsub_mnt_want_write(struct vfsmount
*mnt
)
137 err
= mnt_want_write(mnt
);
142 static inline void vfsub_mnt_drop_write(struct vfsmount
*mnt
)
150 static inline void vfsub_mnt_drop_write_file(struct file
*file
)
153 mnt_drop_write_file(file
);
158 /* ---------------------------------------------------------------------- */
161 struct dentry
*vfsub_lock_rename(struct dentry
*d1
, struct au_hinode
*hdir1
,
162 struct dentry
*d2
, struct au_hinode
*hdir2
);
163 void vfsub_unlock_rename(struct dentry
*d1
, struct au_hinode
*hdir1
,
164 struct dentry
*d2
, struct au_hinode
*hdir2
);
166 int vfsub_create(struct inode
*dir
, struct path
*path
, int mode
,
168 int vfsub_symlink(struct inode
*dir
, struct path
*path
,
169 const char *symname
);
170 int vfsub_mknod(struct inode
*dir
, struct path
*path
, int mode
, dev_t dev
);
171 int vfsub_link(struct dentry
*src_dentry
, struct inode
*dir
,
172 struct path
*path
, struct inode
**delegated_inode
);
173 int vfsub_rename(struct inode
*src_hdir
, struct dentry
*src_dentry
,
174 struct inode
*hdir
, struct path
*path
,
175 struct inode
**delegated_inode
, unsigned int flags
);
176 int vfsub_mkdir(struct inode
*dir
, struct path
*path
, int mode
);
177 int vfsub_rmdir(struct inode
*dir
, struct path
*path
);
179 /* ---------------------------------------------------------------------- */
181 ssize_t
vfsub_read_u(struct file
*file
, char __user
*ubuf
, size_t count
,
183 ssize_t
vfsub_read_k(struct file
*file
, void *kbuf
, size_t count
,
185 ssize_t
vfsub_write_u(struct file
*file
, const char __user
*ubuf
, size_t count
,
187 ssize_t
vfsub_write_k(struct file
*file
, void *kbuf
, size_t count
,
189 int vfsub_flush(struct file
*file
, fl_owner_t id
);
190 int vfsub_iterate_dir(struct file
*file
, struct dir_context
*ctx
);
192 static inline loff_t
vfsub_f_size_read(struct file
*file
)
194 return i_size_read(file_inode(file
));
197 static inline unsigned int vfsub_file_flags(struct file
*file
)
201 spin_lock(&file
->f_lock
);
202 flags
= file
->f_flags
;
203 spin_unlock(&file
->f_lock
);
208 static inline int vfsub_file_execed(struct file
*file
)
210 /* todo: direct access f_flags */
211 return !!(vfsub_file_flags(file
) & __FMODE_EXEC
);
215 static inline void vfsub_file_accessed(struct file
*h_file
)
217 file_accessed(h_file
);
218 vfsub_update_h_iattr(&h_file
->f_path
, /*did*/NULL
); /*ignore*/
223 static inline void vfsub_touch_atime(struct vfsmount
*h_mnt
,
224 struct dentry
*h_dentry
)
226 struct path h_path
= {
230 touch_atime(&h_path
);
231 vfsub_update_h_iattr(&h_path
, /*did*/NULL
); /*ignore*/
235 static inline int vfsub_update_time(struct inode
*h_inode
, struct timespec
*ts
,
238 return update_time(h_inode
, ts
, flags
);
239 /* no vfsub_update_h_iattr() since we don't have struct path */
242 #ifdef CONFIG_FS_POSIX_ACL
243 static inline int vfsub_acl_chmod(struct inode
*h_inode
, umode_t h_mode
)
247 err
= posix_acl_chmod(h_inode
, h_mode
);
248 if (err
== -EOPNOTSUPP
)
253 AuStubInt0(vfsub_acl_chmod
, struct inode
*h_inode
, umode_t h_mode
);
256 long vfsub_splice_to(struct file
*in
, loff_t
*ppos
,
257 struct pipe_inode_info
*pipe
, size_t len
,
259 long vfsub_splice_from(struct pipe_inode_info
*pipe
, struct file
*out
,
260 loff_t
*ppos
, size_t len
, unsigned int flags
);
262 static inline long vfsub_truncate(struct path
*path
, loff_t length
)
267 err
= vfs_truncate(path
, length
);
272 int vfsub_trunc(struct path
*h_path
, loff_t length
, unsigned int attr
,
273 struct file
*h_file
);
274 int vfsub_fsync(struct file
*file
, struct path
*path
, int datasync
);
277 * re-use branch fs's ioctl(FICLONE) while aufs itself doesn't support such
280 static inline int vfsub_clone_file_range(struct file
*src
, struct file
*dst
,
286 err
= vfs_clone_file_range(src
, 0, dst
, 0, len
);
292 /* copy_file_range(2) is a systemcall */
293 static inline ssize_t
vfsub_copy_file_range(struct file
*src
, loff_t src_pos
,
294 struct file
*dst
, loff_t dst_pos
,
295 size_t len
, unsigned int flags
)
300 ssz
= vfs_copy_file_range(src
, src_pos
, dst
, dst_pos
, len
, flags
);
306 /* ---------------------------------------------------------------------- */
308 static inline loff_t
vfsub_llseek(struct file
*file
, loff_t offset
, int origin
)
313 err
= vfs_llseek(file
, offset
, origin
);
318 /* ---------------------------------------------------------------------- */
320 int vfsub_sio_mkdir(struct inode
*dir
, struct path
*path
, int mode
);
321 int vfsub_sio_rmdir(struct inode
*dir
, struct path
*path
);
322 int vfsub_sio_notify_change(struct path
*path
, struct iattr
*ia
,
323 struct inode
**delegated_inode
);
324 int vfsub_notify_change(struct path
*path
, struct iattr
*ia
,
325 struct inode
**delegated_inode
);
326 int vfsub_unlink(struct inode
*dir
, struct path
*path
,
327 struct inode
**delegated_inode
, int force
);
329 static inline int vfsub_getattr(const struct path
*path
, struct kstat
*st
)
331 return vfs_getattr(path
, st
, STATX_BASIC_STATS
, AT_STATX_SYNC_AS_STAT
);
334 /* ---------------------------------------------------------------------- */
336 static inline int vfsub_setxattr(struct dentry
*dentry
, const char *name
,
337 const void *value
, size_t size
, int flags
)
342 err
= vfs_setxattr(dentry
, name
, value
, size
, flags
);
348 static inline int vfsub_removexattr(struct dentry
*dentry
, const char *name
)
353 err
= vfs_removexattr(dentry
, name
);
359 #endif /* __KERNEL__ */
360 #endif /* __AUFS_VFSUB_H__ */