Lines Matching refs:file
7 #include <linux/file.h>
39 static struct file *ovl_open_realfile(const struct file *file,
42 struct inode *inode = file_inode(file);
43 struct file *realfile;
45 int flags = file->f_flags | OVL_OPEN_FLAGS;
59 realfile = open_with_fake_path(&file->f_path, flags, realinode,
65 file, file, ovl_whatisit(inode, realinode), file->f_flags,
73 static int ovl_change_flags(struct file *file, unsigned int flags)
75 struct inode *inode = file_inode(file);
81 if (WARN_ON((file->f_flags ^ flags) & ~OVL_SETFL_MASK))
86 if (((flags ^ file->f_flags) & O_APPEND) && IS_APPEND(inode))
90 if (!file->f_mapping->a_ops ||
91 !file->f_mapping->a_ops->direct_IO)
95 if (file->f_op->check_flags) {
96 err = file->f_op->check_flags(flags);
101 spin_lock(&file->f_lock);
102 file->f_flags = (file->f_flags & ~OVL_SETFL_MASK) | flags;
103 spin_unlock(&file->f_lock);
108 static int ovl_real_fdget_meta(const struct file *file, struct fd *real,
111 struct inode *inode = file_inode(file);
115 real->file = file->private_data;
123 if (unlikely(file_inode(real->file) != realinode)) {
125 real->file = ovl_open_realfile(file, realinode);
127 return PTR_ERR_OR_ZERO(real->file);
131 if (unlikely((file->f_flags ^ real->file->f_flags) & ~OVL_OPEN_FLAGS))
132 return ovl_change_flags(real->file, file->f_flags);
137 static int ovl_real_fdget(const struct file *file, struct fd *real)
139 if (d_is_dir(file_dentry(file))) {
141 real->file = ovl_dir_real_file(file, false);
143 return PTR_ERR_OR_ZERO(real->file);
146 return ovl_real_fdget_meta(file, real, false);
149 static int ovl_open(struct inode *inode, struct file *file)
151 struct file *realfile;
154 err = ovl_maybe_copy_up(file_dentry(file), file->f_flags);
159 file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
161 realfile = ovl_open_realfile(file, ovl_inode_realdata(inode));
165 file->private_data = realfile;
170 static int ovl_release(struct inode *inode, struct file *file)
172 fput(file->private_data);
177 static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
179 struct inode *inode = file_inode(file);
190 return file->f_pos;
193 return vfs_setpos(file, 0, 0);
196 ret = ovl_real_fdget(file, &real);
201 * Overlay file f_pos is the master copy that is preserved
205 * files, so we use the real file to perform seeks.
208 real.file->f_pos = file->f_pos;
211 ret = vfs_llseek(real.file, offset, whence);
214 file->f_pos = real.file->f_pos;
222 static void ovl_file_accessed(struct file *file)
226 if (file->f_flags & O_NOATIME)
229 inode = file_inode(file);
241 touch_atime(&file->f_path);
299 struct file *file = iocb->ki_filp;
307 ret = ovl_real_fdget(file, &real);
313 (!real.file->f_mapping->a_ops ||
314 !real.file->f_mapping->a_ops->direct_IO))
317 old_cred = ovl_override_creds(file_inode(file)->i_sb);
319 ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
331 kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));
334 ret = vfs_iocb_iter_read(real.file, &aio_req->iocb, iter);
341 ovl_file_accessed(file);
350 struct file *file = iocb->ki_filp;
351 struct inode *inode = file_inode(file);
363 ret = file_remove_privs(file);
367 ret = ovl_real_fdget(file, &real);
373 (!real.file->f_mapping->a_ops ||
374 !real.file->f_mapping->a_ops->direct_IO))
380 old_cred = ovl_override_creds(file_inode(file)->i_sb);
382 file_start_write(real.file);
383 ret = vfs_iter_write(real.file, iter, &iocb->ki_pos,
385 file_end_write(real.file);
396 file_start_write(real.file);
398 __sb_writers_release(file_inode(real.file)->i_sb,
402 kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));
406 ret = vfs_iocb_iter_write(real.file, &aio_req->iocb, iter);
425 * and file_start_write(real.file) in ovl_write_iter().
428 * the real file.
430 static ssize_t ovl_splice_write(struct pipe_inode_info *pipe, struct file *out,
451 file_start_write(real.file);
453 ret = iter_file_splice_write(pipe, real.file, ppos, len, flags);
455 file_end_write(real.file);
467 static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync)
473 ret = ovl_sync_status(OVL_FS(file_inode(file)->i_sb));
477 ret = ovl_real_fdget_meta(file, &real, !datasync);
481 /* Don't sync lower file for fear of receiving EROFS error */
482 if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) {
483 old_cred = ovl_override_creds(file_inode(file)->i_sb);
484 ret = vfs_fsync_range(real.file, start, end, datasync);
493 static int ovl_mmap(struct file *file, struct vm_area_struct *vma)
495 struct file *realfile = file->private_data;
502 if (WARN_ON(file != vma->vm_file))
507 old_cred = ovl_override_creds(file_inode(file)->i_sb);
516 fput(file);
519 ovl_file_accessed(file);
524 static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
526 struct inode *inode = file_inode(file);
534 ret = file_remove_privs(file);
538 ret = ovl_real_fdget(file, &real);
542 old_cred = ovl_override_creds(file_inode(file)->i_sb);
543 ret = vfs_fallocate(real.file, mode, offset, len);
557 static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
563 ret = ovl_real_fdget(file, &real);
567 old_cred = ovl_override_creds(file_inode(file)->i_sb);
568 ret = vfs_fadvise(real.file, offset, len, advice);
576 static long ovl_real_ioctl(struct file *file, unsigned int cmd,
582 ret = ovl_real_fdget(file, &real);
586 ret = security_file_ioctl(real.file, cmd, arg);
592 ret = vfs_ioctl(real.file, cmd, arg);
600 static long ovl_ioctl_set_flags(struct file *file, unsigned int cmd,
604 struct inode *inode = file_inode(file);
609 ret = mnt_want_write_file(file);
624 ret = ovl_maybe_copy_up(file_dentry(file), O_WRONLY);
628 ret = ovl_real_ioctl(file, cmd, arg);
634 mnt_drop_write_file(file);
640 long ovl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
647 ret = ovl_real_ioctl(file, cmd, arg);
652 ret = ovl_ioctl_set_flags(file, cmd, arg);
663 long ovl_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
678 return ovl_ioctl(file, cmd, arg);
688 static loff_t ovl_copyfile(struct file *file_in, loff_t pos_in,
689 struct file *file_out, loff_t pos_out,
719 ret = vfs_copy_file_range(real_in.file, pos_in,
720 real_out.file, pos_out, len, flags);
724 ret = vfs_clone_file_range(real_in.file, pos_in,
725 real_out.file, pos_out, len, flags);
729 ret = vfs_dedupe_file_range_one(real_in.file, pos_in,
730 real_out.file, pos_out, len,
748 static ssize_t ovl_copy_file_range(struct file *file_in, loff_t pos_in,
749 struct file *file_out, loff_t pos_out,
756 static loff_t ovl_remap_file_range(struct file *file_in, loff_t pos_in,
757 struct file *file_out, loff_t pos_out,