Lines Matching refs:file

26 static struct file *ovl_open_realfile(const struct file *file,  in ovl_open_realfile()  argument
29 struct inode *inode = file_inode(file); in ovl_open_realfile()
30 struct file *realfile; in ovl_open_realfile()
34 realfile = open_with_fake_path(&file->f_path, file->f_flags | O_NOATIME, in ovl_open_realfile()
39 file, file, ovl_whatisit(inode, realinode), file->f_flags, in ovl_open_realfile()
47 static int ovl_change_flags(struct file *file, unsigned int flags) in ovl_change_flags() argument
49 struct inode *inode = file_inode(file); in ovl_change_flags()
56 if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK)) in ovl_change_flags()
61 if (((flags ^ file->f_flags) & O_APPEND) && IS_APPEND(inode)) in ovl_change_flags()
65 if (!file->f_mapping->a_ops || in ovl_change_flags()
66 !file->f_mapping->a_ops->direct_IO) in ovl_change_flags()
70 if (file->f_op->check_flags) { in ovl_change_flags()
71 err = file->f_op->check_flags(flags); in ovl_change_flags()
76 spin_lock(&file->f_lock); in ovl_change_flags()
77 file->f_flags = (file->f_flags & ~OVL_SETFL_MASK) | flags; in ovl_change_flags()
78 spin_unlock(&file->f_lock); in ovl_change_flags()
83 static int ovl_real_fdget_meta(const struct file *file, struct fd *real, in ovl_real_fdget_meta() argument
86 struct inode *inode = file_inode(file); in ovl_real_fdget_meta()
90 real->file = file->private_data; in ovl_real_fdget_meta()
98 if (unlikely(file_inode(real->file) != realinode)) { in ovl_real_fdget_meta()
100 real->file = ovl_open_realfile(file, realinode); in ovl_real_fdget_meta()
102 return PTR_ERR_OR_ZERO(real->file); in ovl_real_fdget_meta()
106 if (unlikely((file->f_flags ^ real->file->f_flags) & ~O_NOATIME)) in ovl_real_fdget_meta()
107 return ovl_change_flags(real->file, file->f_flags); in ovl_real_fdget_meta()
112 static int ovl_real_fdget(const struct file *file, struct fd *real) in ovl_real_fdget() argument
114 return ovl_real_fdget_meta(file, real, false); in ovl_real_fdget()
117 static int ovl_open(struct inode *inode, struct file *file) in ovl_open() argument
119 struct dentry *dentry = file_dentry(file); in ovl_open()
120 struct file *realfile; in ovl_open()
123 err = ovl_open_maybe_copy_up(dentry, file->f_flags); in ovl_open()
128 file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); in ovl_open()
130 realfile = ovl_open_realfile(file, ovl_inode_realdata(inode)); in ovl_open()
134 file->private_data = realfile; in ovl_open()
139 static int ovl_release(struct inode *inode, struct file *file) in ovl_release() argument
141 fput(file->private_data); in ovl_release()
146 static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) in ovl_llseek() argument
148 struct inode *realinode = ovl_inode_real(file_inode(file)); in ovl_llseek()
150 return generic_file_llseek_size(file, offset, whence, in ovl_llseek()
155 static void ovl_file_accessed(struct file *file) in ovl_file_accessed() argument
159 if (file->f_flags & O_NOATIME) in ovl_file_accessed()
162 inode = file_inode(file); in ovl_file_accessed()
174 touch_atime(&file->f_path); in ovl_file_accessed()
196 struct file *file = iocb->ki_filp; in ovl_read_iter() local
204 ret = ovl_real_fdget(file, &real); in ovl_read_iter()
208 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_read_iter()
209 ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, in ovl_read_iter()
213 ovl_file_accessed(file); in ovl_read_iter()
222 struct file *file = iocb->ki_filp; in ovl_write_iter() local
223 struct inode *inode = file_inode(file); in ovl_write_iter()
234 ret = file_remove_privs(file); in ovl_write_iter()
238 ret = ovl_real_fdget(file, &real); in ovl_write_iter()
242 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_write_iter()
243 file_start_write(real.file); in ovl_write_iter()
244 ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, in ovl_write_iter()
246 file_end_write(real.file); in ovl_write_iter()
260 static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) in ovl_fsync() argument
266 ret = ovl_real_fdget_meta(file, &real, !datasync); in ovl_fsync()
271 if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) { in ovl_fsync()
272 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fsync()
273 ret = vfs_fsync_range(real.file, start, end, datasync); in ovl_fsync()
282 static int ovl_mmap(struct file *file, struct vm_area_struct *vma) in ovl_mmap() argument
284 struct file *realfile = file->private_data; in ovl_mmap()
291 if (WARN_ON(file != vma->vm_file)) in ovl_mmap()
296 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_mmap()
305 fput(file); in ovl_mmap()
308 ovl_file_accessed(file); in ovl_mmap()
313 static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len) in ovl_fallocate() argument
315 struct inode *inode = file_inode(file); in ovl_fallocate()
320 ret = ovl_real_fdget(file, &real); in ovl_fallocate()
324 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fallocate()
325 ret = vfs_fallocate(real.file, mode, offset, len); in ovl_fallocate()
336 static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice) in ovl_fadvise() argument
342 ret = ovl_real_fdget(file, &real); in ovl_fadvise()
346 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fadvise()
347 ret = vfs_fadvise(real.file, offset, len, advice); in ovl_fadvise()
355 static long ovl_real_ioctl(struct file *file, unsigned int cmd, in ovl_real_ioctl() argument
362 ret = ovl_real_fdget(file, &real); in ovl_real_ioctl()
366 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_real_ioctl()
367 ret = vfs_ioctl(real.file, cmd, arg); in ovl_real_ioctl()
375 static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) in ovl_ioctl() argument
378 struct inode *inode = file_inode(file); in ovl_ioctl()
382 ret = ovl_real_ioctl(file, cmd, arg); in ovl_ioctl()
389 ret = mnt_want_write_file(file); in ovl_ioctl()
393 ret = ovl_copy_up_with_data(file_dentry(file)); in ovl_ioctl()
395 ret = ovl_real_ioctl(file, cmd, arg); in ovl_ioctl()
402 mnt_drop_write_file(file); in ovl_ioctl()
412 static long ovl_compat_ioctl(struct file *file, unsigned int cmd, in ovl_compat_ioctl() argument
428 return ovl_ioctl(file, cmd, arg); in ovl_compat_ioctl()
437 static ssize_t ovl_copyfile(struct file *file_in, loff_t pos_in, in ovl_copyfile()
438 struct file *file_out, loff_t pos_out, in ovl_copyfile()
459 ret = vfs_copy_file_range(real_in.file, pos_in, in ovl_copyfile()
460 real_out.file, pos_out, len, flags); in ovl_copyfile()
464 ret = vfs_clone_file_range(real_in.file, pos_in, in ovl_copyfile()
465 real_out.file, pos_out, len); in ovl_copyfile()
469 ret = vfs_dedupe_file_range_one(real_in.file, pos_in, in ovl_copyfile()
470 real_out.file, pos_out, len); in ovl_copyfile()
484 static ssize_t ovl_copy_file_range(struct file *file_in, loff_t pos_in, in ovl_copy_file_range()
485 struct file *file_out, loff_t pos_out, in ovl_copy_file_range()
492 static int ovl_clone_file_range(struct file *file_in, loff_t pos_in, in ovl_clone_file_range()
493 struct file *file_out, loff_t pos_out, u64 len) in ovl_clone_file_range()
499 static int ovl_dedupe_file_range(struct file *file_in, loff_t pos_in, in ovl_dedupe_file_range()
500 struct file *file_out, loff_t pos_out, u64 len) in ovl_dedupe_file_range()