Skip to content

Commit

Permalink
ovl: add ovl_read_iter()
Browse files Browse the repository at this point in the history
Implement stacked reading.

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
  • Loading branch information
Miklos Szeredi committed Jul 18, 2018
1 parent 2ef66b8 commit 16914e6
Showing 1 changed file with 67 additions and 0 deletions.
67 changes: 67 additions & 0 deletions fs/overlayfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <linux/cred.h>
#include <linux/file.h>
#include <linux/xattr.h>
#include <linux/uio.h>
#include "overlayfs.h"

static struct file *ovl_open_realfile(const struct file *file)
Expand Down Expand Up @@ -129,8 +130,74 @@ static loff_t ovl_llseek(struct file *file, loff_t offset, int whence)
i_size_read(realinode));
}

static void ovl_file_accessed(struct file *file)
{
struct inode *inode, *upperinode;

if (file->f_flags & O_NOATIME)
return;

inode = file_inode(file);
upperinode = ovl_inode_upper(inode);

if (!upperinode)
return;

if ((!timespec64_equal(&inode->i_mtime, &upperinode->i_mtime) ||
!timespec64_equal(&inode->i_ctime, &upperinode->i_ctime))) {
inode->i_mtime = upperinode->i_mtime;
inode->i_ctime = upperinode->i_ctime;
}

touch_atime(&file->f_path);
}

static rwf_t ovl_iocb_to_rwf(struct kiocb *iocb)
{
int ifl = iocb->ki_flags;
rwf_t flags = 0;

if (ifl & IOCB_NOWAIT)
flags |= RWF_NOWAIT;
if (ifl & IOCB_HIPRI)
flags |= RWF_HIPRI;
if (ifl & IOCB_DSYNC)
flags |= RWF_DSYNC;
if (ifl & IOCB_SYNC)
flags |= RWF_SYNC;

return flags;
}

static ssize_t ovl_read_iter(struct kiocb *iocb, struct iov_iter *iter)
{
struct file *file = iocb->ki_filp;
struct fd real;
const struct cred *old_cred;
ssize_t ret;

if (!iov_iter_count(iter))
return 0;

ret = ovl_real_fdget(file, &real);
if (ret)
return ret;

old_cred = ovl_override_creds(file_inode(file)->i_sb);
ret = vfs_iter_read(real.file, iter, &iocb->ki_pos,
ovl_iocb_to_rwf(iocb));
revert_creds(old_cred);

ovl_file_accessed(file);

fdput(real);

return ret;
}

const struct file_operations ovl_file_operations = {
.open = ovl_open,
.release = ovl_release,
.llseek = ovl_llseek,
.read_iter = ovl_read_iter,
};

0 comments on commit 16914e6

Please sign in to comment.