Lines Matching full:file

7 #include <linux/file.h>
39 static struct file *ovl_open_realfile(const struct file *file, in ovl_open_realfile() argument
42 struct inode *inode = file_inode(file); in ovl_open_realfile()
43 struct file *realfile; in ovl_open_realfile()
45 int flags = file->f_flags | OVL_OPEN_FLAGS; in ovl_open_realfile()
59 realfile = open_with_fake_path(&file->f_path, flags, realinode, in ovl_open_realfile()
65 file, file, ovl_whatisit(inode, realinode), file->f_flags, in ovl_open_realfile()
73 static int ovl_change_flags(struct file *file, unsigned int flags) in ovl_change_flags() argument
75 struct inode *inode = file_inode(file); in ovl_change_flags()
81 if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK)) in ovl_change_flags()
86 if (((flags ^ file->f_flags) & O_APPEND) && IS_APPEND(inode)) in ovl_change_flags()
90 if (!file->f_mapping->a_ops || in ovl_change_flags()
91 !file->f_mapping->a_ops->direct_IO) in ovl_change_flags()
95 if (file->f_op->check_flags) { in ovl_change_flags()
96 err = file->f_op->check_flags(flags); in ovl_change_flags()
101 spin_lock(&file->f_lock); in ovl_change_flags()
102 file->f_flags = (file->f_flags & ~OVL_SETFL_MASK) | flags; in ovl_change_flags()
103 spin_unlock(&file->f_lock); in ovl_change_flags()
108 static int ovl_real_fdget_meta(const struct file *file, struct fd *real, in ovl_real_fdget_meta() argument
111 struct inode *inode = file_inode(file); in ovl_real_fdget_meta()
115 real->file = file->private_data; in ovl_real_fdget_meta()
123 if (unlikely(file_inode(real->file) != realinode)) { in ovl_real_fdget_meta()
125 real->file = ovl_open_realfile(file, realinode); in ovl_real_fdget_meta()
127 return PTR_ERR_OR_ZERO(real->file); in ovl_real_fdget_meta()
131 if (unlikely((file->f_flags ^ real->file->f_flags) & ~OVL_OPEN_FLAGS)) in ovl_real_fdget_meta()
132 return ovl_change_flags(real->file, file->f_flags); in ovl_real_fdget_meta()
137 static int ovl_real_fdget(const struct file *file, struct fd *real) in ovl_real_fdget() argument
139 if (d_is_dir(file_dentry(file))) { in ovl_real_fdget()
141 real->file = ovl_dir_real_file(file, false); in ovl_real_fdget()
143 return PTR_ERR_OR_ZERO(real->file); in ovl_real_fdget()
146 return ovl_real_fdget_meta(file, real, false); in ovl_real_fdget()
149 static int ovl_open(struct inode *inode, struct file *file) in ovl_open() argument
151 struct file *realfile; in ovl_open()
154 err = ovl_maybe_copy_up(file_dentry(file), file->f_flags); in ovl_open()
159 file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC); in ovl_open()
161 realfile = ovl_open_realfile(file, ovl_inode_realdata(inode)); in ovl_open()
165 file->private_data = realfile; in ovl_open()
170 static int ovl_release(struct inode *inode, struct file *file) in ovl_release() argument
172 fput(file->private_data); in ovl_release()
177 static loff_t ovl_llseek(struct file *file, loff_t offset, int whence) in ovl_llseek() argument
179 struct inode *inode = file_inode(file); in ovl_llseek()
190 return file->f_pos; in ovl_llseek()
193 return vfs_setpos(file, 0, 0); in ovl_llseek()
196 ret = ovl_real_fdget(file, &real); in ovl_llseek()
201 * Overlay file f_pos is the master copy that is preserved in ovl_llseek()
205 * files, so we use the real file to perform seeks. in ovl_llseek()
208 real.file->f_pos = file->f_pos; in ovl_llseek()
211 ret = vfs_llseek(real.file, offset, whence); in ovl_llseek()
214 file->f_pos = real.file->f_pos; in ovl_llseek()
222 static void ovl_file_accessed(struct file *file) in ovl_file_accessed() argument
226 if (file->f_flags & O_NOATIME) in ovl_file_accessed()
229 inode = file_inode(file); in ovl_file_accessed()
241 touch_atime(&file->f_path); in ovl_file_accessed()
292 struct file *file = iocb->ki_filp; in ovl_read_iter() local
300 ret = ovl_real_fdget(file, &real); in ovl_read_iter()
304 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_read_iter()
306 ret = vfs_iter_read(real.file, iter, &iocb->ki_pos, in ovl_read_iter()
319 kiocb_clone(&aio_req->iocb, iocb, real.file); in ovl_read_iter()
321 ret = vfs_iocb_iter_read(real.file, &aio_req->iocb, iter); in ovl_read_iter()
327 ovl_file_accessed(file); in ovl_read_iter()
336 struct file *file = iocb->ki_filp; in ovl_write_iter() local
337 struct inode *inode = file_inode(file); in ovl_write_iter()
349 ret = file_remove_privs(file); in ovl_write_iter()
353 ret = ovl_real_fdget(file, &real); in ovl_write_iter()
360 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_write_iter()
362 file_start_write(real.file); in ovl_write_iter()
363 ret = vfs_iter_write(real.file, iter, &iocb->ki_pos, in ovl_write_iter()
365 file_end_write(real.file); in ovl_write_iter()
376 file_start_write(real.file); in ovl_write_iter()
378 __sb_writers_release(file_inode(real.file)->i_sb, in ovl_write_iter()
383 kiocb_clone(&aio_req->iocb, iocb, real.file); in ovl_write_iter()
386 ret = vfs_iocb_iter_write(real.file, &aio_req->iocb, iter); in ovl_write_iter()
400 static ssize_t ovl_splice_read(struct file *in, loff_t *ppos, in ovl_splice_read()
413 ret = generic_file_splice_read(real.file, ppos, pipe, len, flags); in ovl_splice_read()
422 ovl_splice_write(struct pipe_inode_info *pipe, struct file *out, in ovl_splice_write()
434 ret = iter_file_splice_write(pipe, real.file, ppos, len, flags); in ovl_splice_write()
442 static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync) in ovl_fsync() argument
448 if (!ovl_should_sync(OVL_FS(file_inode(file)->i_sb))) in ovl_fsync()
451 ret = ovl_real_fdget_meta(file, &real, !datasync); in ovl_fsync()
455 /* Don't sync lower file for fear of receiving EROFS error */ in ovl_fsync()
456 if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) { in ovl_fsync()
457 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fsync()
458 ret = vfs_fsync_range(real.file, start, end, datasync); in ovl_fsync()
467 static int ovl_mmap(struct file *file, struct vm_area_struct *vma) in ovl_mmap() argument
469 struct file *realfile = file->private_data; in ovl_mmap()
476 if (WARN_ON(file != vma->vm_file)) in ovl_mmap()
481 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_mmap()
490 fput(file); in ovl_mmap()
493 ovl_file_accessed(file); in ovl_mmap()
498 static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len) in ovl_fallocate() argument
500 struct inode *inode = file_inode(file); in ovl_fallocate()
505 ret = ovl_real_fdget(file, &real); in ovl_fallocate()
509 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fallocate()
510 ret = vfs_fallocate(real.file, mode, offset, len); in ovl_fallocate()
521 static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice) in ovl_fadvise() argument
527 ret = ovl_real_fdget(file, &real); in ovl_fadvise()
531 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_fadvise()
532 ret = vfs_fadvise(real.file, offset, len, advice); in ovl_fadvise()
540 static long ovl_real_ioctl(struct file *file, unsigned int cmd, in ovl_real_ioctl() argument
547 ret = ovl_real_fdget(file, &real); in ovl_real_ioctl()
551 old_cred = ovl_override_creds(file_inode(file)->i_sb); in ovl_real_ioctl()
552 ret = security_file_ioctl(real.file, cmd, arg); in ovl_real_ioctl()
554 ret = vfs_ioctl(real.file, cmd, arg); in ovl_real_ioctl()
578 static long ovl_ioctl_set_flags(struct file *file, unsigned int cmd, in ovl_ioctl_set_flags() argument
582 struct inode *inode = file_inode(file); in ovl_ioctl_set_flags()
588 ret = mnt_want_write_file(file); in ovl_ioctl_set_flags()
600 ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY); in ovl_ioctl_set_flags()
604 ret = ovl_real_ioctl(file, cmd, arg); in ovl_ioctl_set_flags()
610 mnt_drop_write_file(file); in ovl_ioctl_set_flags()
616 static long ovl_ioctl_set_fsflags(struct file *file, unsigned int cmd, in ovl_ioctl_set_fsflags() argument
624 return ovl_ioctl_set_flags(file, cmd, arg, flags); in ovl_ioctl_set_fsflags()
643 static long ovl_ioctl_set_fsxflags(struct file *file, unsigned int cmd, in ovl_ioctl_set_fsxflags() argument
652 return ovl_ioctl_set_flags(file, cmd, arg, in ovl_ioctl_set_fsxflags()
656 long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg) in ovl_ioctl() argument
663 ret = ovl_real_ioctl(file, cmd, arg); in ovl_ioctl()
667 ret = ovl_ioctl_set_fsflags(file, cmd, arg); in ovl_ioctl()
671 ret = ovl_ioctl_set_fsxflags(file, cmd, arg); in ovl_ioctl()
682 long ovl_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) in ovl_compat_ioctl() argument
697 return ovl_ioctl(file, cmd, arg); in ovl_compat_ioctl()
707 static loff_t ovl_copyfile(struct file *file_in, loff_t pos_in, in ovl_copyfile()
708 struct file *file_out, loff_t pos_out, in ovl_copyfile()
729 ret = vfs_copy_file_range(real_in.file, pos_in, in ovl_copyfile()
730 real_out.file, pos_out, len, flags); in ovl_copyfile()
734 ret = vfs_clone_file_range(real_in.file, pos_in, in ovl_copyfile()
735 real_out.file, pos_out, len, flags); in ovl_copyfile()
739 ret = vfs_dedupe_file_range_one(real_in.file, pos_in, in ovl_copyfile()
740 real_out.file, pos_out, len, in ovl_copyfile()
755 static ssize_t ovl_copy_file_range(struct file *file_in, loff_t pos_in, in ovl_copy_file_range()
756 struct file *file_out, loff_t pos_out, in ovl_copy_file_range()
763 static loff_t ovl_remap_file_range(struct file *file_in, loff_t pos_in, in ovl_remap_file_range()
764 struct file *file_out, loff_t pos_out, in ovl_remap_file_range()