Commit 390df3b8 authored by David Howells's avatar David Howells Committed by Jens Axboe
Browse files

ecryptfs: Provide a splice-read wrapper



Provide a splice_read wrapper for ecryptfs to update the access time on the
lower file after the operation.  Splicing from a direct I/O fd will update
the access time when ->read_iter() is called.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
cc: Christoph Hellwig <hch@lst.de>
cc: Al Viro <viro@zeniv.linux.org.uk>
cc: Jens Axboe <axboe@kernel.dk>
cc: Tyler Hicks <code@tyhicks.com>
cc: ecryptfs@vger.kernel.org
cc: linux-fsdevel@vger.kernel.org
cc: linux-block@vger.kernel.org
cc: linux-mm@kvack.org
Link: https://lore.kernel.org/r/20230522135018.2742245-18-dhowells@redhat.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent ccfdf7cb
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -44,6 +44,31 @@ static ssize_t ecryptfs_read_update_atime(struct kiocb *iocb,
	return rc;
}

/*
 * ecryptfs_splice_read_update_atime
 *
 * generic_file_splice_read updates the atime of upper layer inode.  But, it
 * doesn't give us a chance to update the atime of the lower layer inode.  This
 * function is a wrapper to generic_file_read.  It updates the atime of the
 * lower level inode if generic_file_read returns without any errors. This is
 * to be used only for file reads.  The function to be used for directory reads
 * is ecryptfs_read.
 */
static ssize_t ecryptfs_splice_read_update_atime(struct file *in, loff_t *ppos,
						 struct pipe_inode_info *pipe,
						 size_t len, unsigned int flags)
{
	ssize_t rc;
	const struct path *path;

	rc = generic_file_splice_read(in, ppos, pipe, len, flags);
	if (rc >= 0) {
		path = ecryptfs_dentry_to_lower_path(in->f_path.dentry);
		touch_atime(path);
	}
	return rc;
}

struct ecryptfs_getdents_callback {
	struct dir_context ctx;
	struct dir_context *caller;
@@ -414,5 +439,5 @@ const struct file_operations ecryptfs_main_fops = {
	.release = ecryptfs_release,
	.fsync = ecryptfs_fsync,
	.fasync = ecryptfs_fasync,
	.splice_read = generic_file_splice_read,
	.splice_read = ecryptfs_splice_read_update_atime,
};