From: Christoph Hellwig Every filesystem using generic_file_read/generic_file_write directly can easily support vectored and async (well at least the API, it's not async quite yet in mainline) I/O. This patch adds the proper vectors to all filesystems and switches them to do_sync_read/do_sync_write. This we we can get rid of plain generic_file_read/generic_file_write soon and remove one of the many variants of those functions. Long term I plan to unify aio and vectored support into a single operation so we can cut down filemap.c to a sane set of these routines. Signed-off-by: Christoph Hellwig Signed-off-by: Andrew Morton --- drivers/char/raw.c | 2 +- fs/adfs/file.c | 9 +++++++-- fs/bfs/file.c | 8 ++++++-- fs/block_dev.c | 2 +- fs/ext2/file.c | 4 ++-- fs/fuse/file.c | 8 ++++++-- fs/hfs/inode.c | 8 ++++++-- fs/hfsplus/inode.c | 8 ++++++-- fs/hostfs/hostfs_kern.c | 4 ++-- fs/jffs/inode-v23.c | 8 ++++++-- fs/jffs2/file.c | 8 ++++++-- fs/jfs/file.c | 4 ++-- fs/minix/file.c | 8 ++++++-- fs/ntfs/file.c | 2 +- fs/qnx4/file.c | 8 ++++++-- fs/ramfs/inode.c | 8 ++++++-- fs/read_write.c | 4 +++- fs/reiserfs/file.c | 12 ++++-------- fs/sysv/file.c | 8 ++++++-- fs/ufs/file.c | 8 ++++++-- 20 files changed, 89 insertions(+), 42 deletions(-) diff -puN drivers/char/raw.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems drivers/char/raw.c --- devel/drivers/char/raw.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/drivers/char/raw.c 2005-11-05 02:23:26.000000000 -0800 @@ -262,7 +262,7 @@ static ssize_t raw_file_aio_write(struct static struct file_operations raw_fops = { - .read = generic_file_read, + .read = do_sync_read, .aio_read = generic_file_aio_read, .write = raw_file_write, .aio_write = raw_file_aio_write, diff -puN fs/adfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/adfs/file.c --- devel/fs/adfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/adfs/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -31,11 +31,16 @@ struct file_operations adfs_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .fsync = file_fsync, - .write = generic_file_write, .sendfile = generic_file_sendfile, + }; struct inode_operations adfs_file_inode_operations = { diff -puN fs/bfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/bfs/file.c --- devel/fs/bfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/bfs/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -19,8 +19,12 @@ struct file_operations bfs_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .sendfile = generic_file_sendfile, }; diff -puN fs/block_dev.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/block_dev.c --- devel/fs/block_dev.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/block_dev.c 2005-11-05 02:23:26.000000000 -0800 @@ -796,7 +796,7 @@ struct file_operations def_blk_fops = { .open = blkdev_open, .release = blkdev_close, .llseek = block_llseek, - .read = generic_file_read, + .read = do_sync_read, .write = blkdev_file_write, .aio_read = generic_file_aio_read, .aio_write = blkdev_file_aio_write, diff -puN fs/ext2/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/ext2/file.c --- devel/fs/ext2/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/ext2/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -41,8 +41,8 @@ static int ext2_release_file (struct ino */ struct file_operations ext2_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, .aio_read = generic_file_aio_read, .aio_write = generic_file_aio_write, .ioctl = ext2_ioctl, diff -puN fs/fuse/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/fuse/file.c --- devel/fs/fuse/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/fuse/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -523,8 +523,12 @@ static int fuse_set_page_dirty(struct pa static struct file_operations fuse_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = fuse_file_mmap, .open = fuse_open, .flush = fuse_flush, diff -puN fs/hfs/inode.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/hfs/inode.c --- devel/fs/hfs/inode.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/hfs/inode.c 2005-11-05 02:23:26.000000000 -0800 @@ -616,8 +616,12 @@ int hfs_inode_setattr(struct dentry *den static struct file_operations hfs_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .sendfile = generic_file_sendfile, .fsync = file_fsync, diff -puN fs/hfsplus/inode.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/hfsplus/inode.c --- devel/fs/hfsplus/inode.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/hfsplus/inode.c 2005-11-05 02:23:26.000000000 -0800 @@ -302,8 +302,12 @@ static struct inode_operations hfsplus_f static struct file_operations hfsplus_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .sendfile = generic_file_sendfile, .fsync = file_fsync, diff -puN fs/hostfs/hostfs_kern.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/hostfs/hostfs_kern.c --- devel/fs/hostfs/hostfs_kern.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/hostfs/hostfs_kern.c 2005-11-05 02:23:26.000000000 -0800 @@ -388,13 +388,13 @@ int hostfs_fsync(struct file *file, stru static struct file_operations hostfs_file_fops = { .llseek = generic_file_llseek, - .read = generic_file_read, + .read = do_sync_read, .sendfile = generic_file_sendfile, .aio_read = generic_file_aio_read, .aio_write = generic_file_aio_write, .readv = generic_file_readv, .writev = generic_file_writev, - .write = generic_file_write, + .write = do_sync_write, .mmap = generic_file_mmap, .open = hostfs_file_open, .release = NULL, diff -puN fs/jffs2/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/jffs2/file.c --- devel/fs/jffs2/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/jffs2/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -42,8 +42,12 @@ struct file_operations jffs2_file_operat { .llseek = generic_file_llseek, .open = generic_file_open, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .ioctl = jffs2_ioctl, .mmap = generic_file_readonly_mmap, .fsync = jffs2_fsync, diff -puN fs/jffs/inode-v23.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/jffs/inode-v23.c --- devel/fs/jffs/inode-v23.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/jffs/inode-v23.c 2005-11-05 02:23:26.000000000 -0800 @@ -1633,8 +1633,12 @@ static struct file_operations jffs_file_ { .open = generic_file_open, .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .ioctl = jffs_ioctl, .mmap = generic_file_readonly_mmap, .fsync = jffs_fsync, diff -puN fs/jfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/jfs/file.c --- devel/fs/jfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/jfs/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -103,8 +103,8 @@ struct inode_operations jfs_file_inode_o struct file_operations jfs_file_operations = { .open = jfs_open, .llseek = generic_file_llseek, - .write = generic_file_write, - .read = generic_file_read, + .write = do_sync_write, + .read = do_sync_read, .aio_read = generic_file_aio_read, .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, diff -puN fs/minix/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/minix/file.c --- devel/fs/minix/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/minix/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -17,8 +17,12 @@ int minix_sync_file(struct file *, struc struct file_operations minix_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .fsync = minix_sync_file, .sendfile = generic_file_sendfile, diff -puN fs/ntfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/ntfs/file.c --- devel/fs/ntfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/ntfs/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -2306,7 +2306,7 @@ static int ntfs_file_fsync(struct file * struct file_operations ntfs_file_ops = { .llseek = generic_file_llseek, /* Seek inside file. */ - .read = generic_file_read, /* Read from file. */ + .read = do_sync_read, /* Read from file. */ .aio_read = generic_file_aio_read, /* Async read from file. */ .readv = generic_file_readv, /* Read from file. */ #ifdef NTFS_RW diff -puN fs/qnx4/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/qnx4/file.c --- devel/fs/qnx4/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/qnx4/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -25,11 +25,15 @@ struct file_operations qnx4_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, + .read = do_sync_read, + .readv = generic_file_readv, + .aio_read = generic_file_aio_read, .mmap = generic_file_mmap, .sendfile = generic_file_sendfile, #ifdef CONFIG_QNX4FS_RW - .write = generic_file_write, + .write = do_sync_write, + .writev = generic_file_writev, + .aio_write = generic_file_aio_write, .fsync = qnx4_sync_file, #endif }; diff -puN fs/ramfs/inode.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/ramfs/inode.c --- devel/fs/ramfs/inode.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/ramfs/inode.c 2005-11-05 02:23:26.000000000 -0800 @@ -149,8 +149,12 @@ static struct address_space_operations r }; struct file_operations ramfs_file_operations = { - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .fsync = simple_sync_file, .sendfile = generic_file_sendfile, diff -puN fs/read_write.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/read_write.c --- devel/fs/read_write.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/read_write.c 2005-11-05 02:23:26.000000000 -0800 @@ -20,7 +20,9 @@ struct file_operations generic_ro_fops = { .llseek = generic_file_llseek, - .read = generic_file_read, + .read = do_sync_read, + .readv = generic_file_readv, + .aio_read = generic_file_aio_read, .mmap = generic_file_readonly_mmap, .sendfile = generic_file_sendfile, }; diff -puN fs/reiserfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/reiserfs/file.c --- devel/fs/reiserfs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/reiserfs/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -1541,22 +1541,18 @@ static ssize_t reiserfs_file_write(struc return res; } -static ssize_t reiserfs_aio_write(struct kiocb *iocb, const char __user * buf, - size_t count, loff_t pos) -{ - return generic_file_aio_write(iocb, buf, count, pos); -} - struct file_operations reiserfs_file_operations = { - .read = generic_file_read, + .read = do_sync_read, .write = reiserfs_file_write, + .readv = generic_file_readv, + .writev = generic_file_writev, .ioctl = reiserfs_ioctl, .mmap = generic_file_mmap, .release = reiserfs_file_release, .fsync = reiserfs_sync_file, .sendfile = generic_file_sendfile, .aio_read = generic_file_aio_read, - .aio_write = reiserfs_aio_write, + .aio_write = generic_file_aio_write, }; struct inode_operations reiserfs_file_inode_operations = { diff -puN fs/sysv/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/sysv/file.c --- devel/fs/sysv/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/sysv/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -21,8 +21,12 @@ */ struct file_operations sysv_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .fsync = sysv_sync_file, .sendfile = generic_file_sendfile, diff -puN fs/ufs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems fs/ufs/file.c --- devel/fs/ufs/file.c~add-support-for-vectored-and-async-i-o-to-all-simple-filesystems 2005-11-05 02:23:26.000000000 -0800 +++ devel-akpm/fs/ufs/file.c 2005-11-05 02:23:26.000000000 -0800 @@ -43,8 +43,12 @@ struct file_operations ufs_file_operations = { .llseek = generic_file_llseek, - .read = generic_file_read, - .write = generic_file_write, + .read = do_sync_read, + .write = do_sync_write, + .readv = generic_file_readv, + .writev = generic_file_writev, + .aio_read = generic_file_aio_read, + .aio_write = generic_file_aio_write, .mmap = generic_file_mmap, .open = generic_file_open, .sendfile = generic_file_sendfile, _