From: Badari Pulavarty This patch cleans up generic_file_*_read/write() interfaces. Christoph Hellwig gave me the idea for this clean ups. In a nutshell, all filesystems should set .aio_read/.aio_write methods and use do_sync_read/ do_sync_write() as their .read/.write methods. This allows us to cleanup all variants of generic_file_* routines. Final available interfaces: generic_file_aio_read() - read handler generic_file_aio_write() - write handler generic_file_aio_write_nolock() - no lock write handler __generic_file_aio_write_nolock() - internal worker routine Signed-off-by: Badari Pulavarty Signed-off-by: Christoph Hellwig Signed-off-by: Andrew Morton --- fs/ecryptfs/file.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff -puN fs/ecryptfs/file.c~streamline-generic_file_-interfaces-and-filemap-ecryptfs fs/ecryptfs/file.c --- a/fs/ecryptfs/file.c~streamline-generic_file_-interfaces-and-filemap-ecryptfs +++ a/fs/ecryptfs/file.c @@ -99,14 +99,22 @@ out: * 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_read_update_atime(struct file *file, char __user * buf, - size_t count, loff_t * ppos) +static ssize_t ecryptfs_read_update_atime(struct kiocb *iocb, + const struct iovec *iov, + unsigned long nr_segs, loff_t pos) { int rc; struct dentry *lower_dentry; struct vfsmount *lower_vfsmount; + struct file *file = iocb->ki_filp; - rc = generic_file_read(file, buf, count, ppos); + rc = generic_file_aio_read(iocb, iov, nr_segs, pos); + /* + * Even though this is a async interface, we need to wait + * for IO to finish to update atime + */ + if (-EIOCBQUEUED == rc) + rc = wait_on_sync_kiocb(iocb); if (rc >= 0) { lower_dentry = ecryptfs_dentry_to_lower(file->f_dentry); lower_vfsmount = ecryptfs_superblock_to_private( @@ -479,8 +487,10 @@ const struct file_operations ecryptfs_di const struct file_operations ecryptfs_main_fops = { .llseek = ecryptfs_llseek, - .read = ecryptfs_read_update_atime, - .write = generic_file_write, + .read = do_sync_read, + .aio_read = ecryptfs_read_update_atime, + .write = do_sync_write, + .aio_write = generic_file_aio_write, .readdir = ecryptfs_readdir, .ioctl = ecryptfs_ioctl, .mmap = generic_file_mmap, _