• Home
  • Raw
  • Download

Lines Matching refs:file

31 static struct file *ovl_open_realfile(const struct file *file,  in ovl_open_realfile()  argument
34 struct inode *inode = file_inode(file); in ovl_open_realfile()
35 struct file *realfile; in ovl_open_realfile()
37 int flags = file->f_flags | OVL_OPEN_FLAGS; in ovl_open_realfile()
52 realfile = open_with_fake_path(&file->f_path, flags, realinode, in ovl_open_realfile()
58 file, file, ovl_whatisit(inode, realinode), file->f_flags, in ovl_open_realfile()
66 static int ovl_change_flags(struct file *file, unsigned int flags) in ovl_change_flags() argument
68 struct inode *inode = file_inode(file); in ovl_change_flags()
73 if (((flags ^ file->f_flags) & O_APPEND) && IS_APPEND(inode)) in ovl_change_flags()
77 if (!file->f_mapping->a_ops || in ovl_change_flags()
78 !file->f_mapping->a_ops->direct_IO) in ovl_change_flags()
82 if (file->f_op->check_flags) { in ovl_change_flags()
83 err = file->f_op->check_flags(flags); in ovl_change_flags()
88 spin_lock(&file->f_lock); in ovl_change_flags()
89 file->f_flags = (file->f_flags & ~OVL_SETFL_MASK) | flags; in ovl_change_flags()
90 spin_unlock(&file->f_lock); in ovl_change_flags()
95 static int ovl_real_fdget_meta(const struct file *file, struct fd *real, in ovl_real_fdget_meta() argument
98 struct inode *inode = file_inode(file); in ovl_real_fdget_meta()
102 real->file = file->private_data; in ovl_real_fdget_meta()
110 if (unlikely(file_inode(real->file) != realinode)) { in ovl_real_fdget_meta()
112 real->file = ovl_open_realfile(file, realinode); in ovl_real_fdget_meta()
114 return PTR_ERR_OR_ZERO(real->file); in ovl_real_fdget_meta()
118 if (unlikely((file->f_flags ^ real->file->f_flags) & ~OVL_OPEN_FLAGS)) in ovl_real_fdget_meta()
119 return ovl_change_flags(real->file, file->f_flags); in ovl_real_fdget_meta()
124 static int ovl_real_fdget(const struct file *file, struct fd *real) in ovl_real_fdget() argument
126 return ovl_real_fdget_meta(file, real, false); in ovl_real_fdget()
129 static int ovl_open(struct inode *inode, struct file *file) in ovl_open() argument
131 struct file *realfile; in ovl_open()
134 err = ovl_maybe_copy_up(file_dentry(file), file->f_flags); in ovl_open()
139 file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); in ovl_open()
141 realfile = ovl_open_realfile(file, ovl_inode_realdata(inode)); in ovl_open()
145 file->private_data = realfile; in ovl_open()
150 static int ovl_release(struct inode *inode, struct file *file) in ovl_release() argument
152 fput(file->private_data); in ovl_release()
157 static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) in ovl_llseek() argument
159 struct inode *inode = file_inode(file); in ovl_llseek()
170 return file->f_pos; in ovl_llseek()
173 return vfs_setpos(file, 0, 0); in ovl_llseek()
176 ret = ovl_real_fdget(file, &real); in ovl_llseek()
188 real.file->f_pos = file->f_pos; in ovl_llseek()
191 ret = vfs_llseek(real.file, offset, whence); in ovl_llseek()
194 file->f_pos = real.file->f_pos; in ovl_llseek()
202 static void ovl_file_accessed(struct file *file) in ovl_file_accessed() argument
206 if (file->f_flags & O_NOATIME) in ovl_file_accessed()
209 inode = file_inode(file); in ovl_file_accessed()
221 touch_atime(&file->f_path); in ovl_file_accessed()
243 struct file *file = iocb->ki_filp; in ovl_read_iter() local
251 ret = ovl_real_fdget(file, &real); in ovl_read_iter()
255 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_read_iter()
256 ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, in ovl_read_iter()
260 ovl_file_accessed(file); in ovl_read_iter()
269 struct file *file = iocb->ki_filp; in ovl_write_iter() local
270 struct inode *inode = file_inode(file); in ovl_write_iter()
281 ret = file_remove_privs(file); in ovl_write_iter()
285 ret = ovl_real_fdget(file, &real); in ovl_write_iter()
289 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_write_iter()
290 file_start_write(real.file); in ovl_write_iter()
291 ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, in ovl_write_iter()
293 file_end_write(real.file); in ovl_write_iter()
307 static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) in ovl_fsync() argument
313 ret = ovl_real_fdget_meta(file, &real, !datasync); in ovl_fsync()
318 if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) { in ovl_fsync()
319 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fsync()
320 ret = vfs_fsync_range(real.file, start, end, datasync); in ovl_fsync()
329 static int ovl_mmap(struct file *file, struct vm_area_struct *vma) in ovl_mmap() argument
331 struct file *realfile = file->private_data; in ovl_mmap()
338 if (WARN_ON(file != vma->vm_file)) in ovl_mmap()
343 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_mmap()
352 fput(file); in ovl_mmap()
355 ovl_file_accessed(file); in ovl_mmap()
360 static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len) in ovl_fallocate() argument
362 struct inode *inode = file_inode(file); in ovl_fallocate()
367 ret = ovl_real_fdget(file, &real); in ovl_fallocate()
371 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fallocate()
372 ret = vfs_fallocate(real.file, mode, offset, len); in ovl_fallocate()
383 static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice) in ovl_fadvise() argument
389 ret = ovl_real_fdget(file, &real); in ovl_fadvise()
393 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fadvise()
394 ret = vfs_fadvise(real.file, offset, len, advice); in ovl_fadvise()
402 static long ovl_real_ioctl(struct file *file, unsigned int cmd, in ovl_real_ioctl() argument
409 ret = ovl_real_fdget(file, &real); in ovl_real_ioctl()
413 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_real_ioctl()
414 ret = security_file_ioctl(real.file, cmd, arg); in ovl_real_ioctl()
416 ret = vfs_ioctl(real.file, cmd, arg); in ovl_real_ioctl()
424 static long ovl_ioctl_set_flags(struct file *file, unsigned int cmd, in ovl_ioctl_set_flags() argument
428 struct inode *inode = file_inode(file); in ovl_ioctl_set_flags()
434 ret = mnt_want_write_file(file); in ovl_ioctl_set_flags()
447 ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY); in ovl_ioctl_set_flags()
451 ret = ovl_real_ioctl(file, cmd, arg); in ovl_ioctl_set_flags()
457 mnt_drop_write_file(file); in ovl_ioctl_set_flags()
479 static long ovl_ioctl_set_fsflags(struct file *file, unsigned int cmd, in ovl_ioctl_set_fsflags() argument
487 return ovl_ioctl_set_flags(file, cmd, arg, in ovl_ioctl_set_fsflags()
507 static long ovl_ioctl_set_fsxflags(struct file *file, unsigned int cmd, in ovl_ioctl_set_fsxflags() argument
516 return ovl_ioctl_set_flags(file, cmd, arg, in ovl_ioctl_set_fsxflags()
520 static long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) in ovl_ioctl() argument
527 ret = ovl_real_ioctl(file, cmd, arg); in ovl_ioctl()
531 ret = ovl_ioctl_set_fsflags(file, cmd, arg); in ovl_ioctl()
535 ret = ovl_ioctl_set_fsxflags(file, cmd, arg); in ovl_ioctl()
545 static long ovl_compat_ioctl(struct file *file, unsigned int cmd, in ovl_compat_ioctl() argument
561 return ovl_ioctl(file, cmd, arg); in ovl_compat_ioctl()
570 static ssize_t ovl_copyfile(struct file *file_in, loff_t pos_in, in ovl_copyfile()
571 struct file *file_out, loff_t pos_out, in ovl_copyfile()
592 ret = vfs_copy_file_range(real_in.file, pos_in, in ovl_copyfile()
593 real_out.file, pos_out, len, flags); in ovl_copyfile()
597 ret = vfs_clone_file_range(real_in.file, pos_in, in ovl_copyfile()
598 real_out.file, pos_out, len); in ovl_copyfile()
602 ret = vfs_dedupe_file_range_one(real_in.file, pos_in, in ovl_copyfile()
603 real_out.file, pos_out, len); in ovl_copyfile()
617 static ssize_t ovl_copy_file_range(struct file *file_in, loff_t pos_in, in ovl_copy_file_range()
618 struct file *file_out, loff_t pos_out, in ovl_copy_file_range()
625 static int ovl_clone_file_range(struct file *file_in, loff_t pos_in, in ovl_clone_file_range()
626 struct file *file_out, loff_t pos_out, u64 len) in ovl_clone_file_range()
632 static int ovl_dedupe_file_range(struct file *file_in, loff_t pos_in, in ovl_dedupe_file_range()
633 struct file *file_out, loff_t pos_out, u64 len) in ovl_dedupe_file_range()