Lines Matching refs:file
7 #include <linux/file.h>
39 static struct file *ovl_open_realfile(const struct file *file,
43 struct inode *inode = file_inode(file);
45 struct file *realfile;
47 int flags = file->f_flags | OVL_OPEN_FLAGS;
63 realfile = backing_file_open(&file->f_path, flags, realpath,
69 file, file, ovl_whatisit(inode, realinode), file->f_flags,
77 static int ovl_change_flags(struct file *file, unsigned int flags)
79 struct inode *inode = file_inode(file);
84 if (((flags ^ file->f_flags) & O_APPEND) && IS_APPEND(inode))
87 if ((flags & O_DIRECT) && !(file->f_mode & FMODE_CAN_ODIRECT))
90 if (file->f_op->check_flags) {
91 err = file->f_op->check_flags(flags);
96 spin_lock(&file->f_lock);
97 file->f_flags = (file->f_flags & ~OVL_SETFL_MASK) | flags;
98 file->f_iocb_flags = iocb_flags(file);
99 spin_unlock(&file->f_lock);
104 static int ovl_real_fdget_meta(const struct file *file, struct fd *real,
107 struct dentry *dentry = file_dentry(file);
112 real->file = file->private_data;
128 if (unlikely(file_inode(real->file) != d_inode(realpath.dentry))) {
130 real->file = ovl_open_realfile(file, &realpath);
132 return PTR_ERR_OR_ZERO(real->file);
136 if (unlikely((file->f_flags ^ real->file->f_flags) & ~OVL_OPEN_FLAGS))
137 return ovl_change_flags(real->file, file->f_flags);
142 static int ovl_real_fdget(const struct file *file, struct fd *real)
144 if (d_is_dir(file_dentry(file))) {
146 real->file = ovl_dir_real_file(file, false);
148 return PTR_ERR_OR_ZERO(real->file);
151 return ovl_real_fdget_meta(file, real, false);
154 static int ovl_open(struct inode *inode, struct file *file)
156 struct dentry *dentry = file_dentry(file);
157 struct file *realfile;
166 err = ovl_maybe_copy_up(dentry, file->f_flags);
171 file->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
177 realfile = ovl_open_realfile(file, &realpath);
181 file->private_data = realfile;
186 static int ovl_release(struct inode *inode, struct file *file)
188 fput(file->private_data);
193 static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
195 struct inode *inode = file_inode(file);
206 return file->f_pos;
209 return vfs_setpos(file, 0, 0);
212 ret = ovl_real_fdget(file, &real);
217 * Overlay file f_pos is the master copy that is preserved
221 * files, so we use the real file to perform seeks.
224 real.file->f_pos = file->f_pos;
227 ret = vfs_llseek(real.file, offset, whence);
230 file->f_pos = real.file->f_pos;
238 static void ovl_file_accessed(struct file *file)
243 if (file->f_flags & O_NOATIME)
246 inode = file_inode(file);
260 touch_atime(&file->f_path);
315 struct file *file = iocb->ki_filp;
323 ret = ovl_real_fdget(file, &real);
329 !(real.file->f_mode & FMODE_CAN_ODIRECT))
332 old_cred = ovl_override_creds(file_inode(file)->i_sb);
334 ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
345 kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));
348 ret = vfs_iocb_iter_read(real.file, &aio_req->iocb, iter);
355 ovl_file_accessed(file);
364 struct file *file = iocb->ki_filp;
365 struct inode *inode = file_inode(file);
377 ret = file_remove_privs(file);
381 ret = ovl_real_fdget(file, &real);
387 !(real.file->f_mode & FMODE_CAN_ODIRECT))
399 old_cred = ovl_override_creds(file_inode(file)->i_sb);
401 file_start_write(real.file);
402 ret = vfs_iter_write(real.file, iter, &iocb->ki_pos,
404 file_end_write(real.file);
416 kiocb_clone(&aio_req->iocb, iocb, get_file(real.file));
421 ret = vfs_iocb_iter_write(real.file, &aio_req->iocb, iter);
437 static ssize_t ovl_splice_read(struct file *in, loff_t *ppos,
450 ret = vfs_splice_read(real.file, ppos, pipe, len, flags);
461 * and file_start_write(real.file) in ovl_write_iter().
464 * the real file.
466 static ssize_t ovl_splice_write(struct pipe_inode_info *pipe, struct file *out,
486 file_start_write(real.file);
488 ret = iter_file_splice_write(pipe, real.file, ppos, len, flags);
490 file_end_write(real.file);
502 static int ovl_fsync(struct file *file, loff_t start, loff_t end, int datasync)
508 ret = ovl_sync_status(OVL_FS(file_inode(file)->i_sb));
512 ret = ovl_real_fdget_meta(file, &real, !datasync);
516 /* Don't sync lower file for fear of receiving EROFS error */
517 if (file_inode(real.file) == ovl_inode_upper(file_inode(file))) {
518 old_cred = ovl_override_creds(file_inode(file)->i_sb);
519 ret = vfs_fsync_range(real.file, start, end, datasync);
528 static int ovl_mmap(struct file *file, struct vm_area_struct *vma)
530 struct file *realfile = file->private_data;
537 if (WARN_ON(file != vma->vm_file))
542 old_cred = ovl_override_creds(file_inode(file)->i_sb);
545 ovl_file_accessed(file);
550 static long ovl_fallocate(struct file *file, int mode, loff_t offset, loff_t len)
552 struct inode *inode = file_inode(file);
560 ret = file_remove_privs(file);
564 ret = ovl_real_fdget(file, &real);
568 old_cred = ovl_override_creds(file_inode(file)->i_sb);
569 ret = vfs_fallocate(real.file, mode, offset, len);
583 static int ovl_fadvise(struct file *file, loff_t offset, loff_t len, int advice)
589 ret = ovl_real_fdget(file, &real);
593 old_cred = ovl_override_creds(file_inode(file)->i_sb);
594 ret = vfs_fadvise(real.file, offset, len, advice);
608 static loff_t ovl_copyfile(struct file *file_in, loff_t pos_in,
609 struct file *file_out, loff_t pos_out,
639 ret = vfs_copy_file_range(real_in.file, pos_in,
640 real_out.file, pos_out, len, flags);
644 ret = vfs_clone_file_range(real_in.file, pos_in,
645 real_out.file, pos_out, len, flags);
649 ret = vfs_dedupe_file_range_one(real_in.file, pos_in,
650 real_out.file, pos_out, len,
668 static ssize_t ovl_copy_file_range(struct file *file_in, loff_t pos_in,
669 struct file *file_out, loff_t pos_out,
676 static loff_t ovl_remap_file_range(struct file *file_in, loff_t pos_in,
677 struct file *file_out, loff_t pos_out,
703 static int ovl_flush(struct file *file, fl_owner_t id)
709 err = ovl_real_fdget(file, &real);
713 if (real.file->f_op->flush) {
714 old_cred = ovl_override_creds(file_inode(file)->i_sb);
715 err = real.file->f_op->flush(real.file, id);