Message ID | 20170528094807.26801-2-hch@lst.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sun, 2017-05-28 at 12:48 +0300, Christoph Hellwig wrote: > If a file_operations instance has the read or write iter methods we should > use the iter based splice code by default. We still allow to overide it > with explicit ->read_iter and ->write_iter methods, but few of them are > left, and there is a non-zero chance that we could get rid of them in the > future. > > Signed-off-by: Christoph Hellwig <hch@lst.de> > --- > drivers/staging/lustre/lustre/llite/file.c | 3 --- > fs/adfs/file.c | 1 - > fs/affs/file.c | 1 - > fs/afs/file.c | 1 - > fs/bfs/file.c | 1 - > fs/block_dev.c | 2 -- > fs/btrfs/file.c | 1 - > fs/ceph/file.c | 2 -- > fs/cifs/cifsfs.c | 6 ------ > fs/coda/file.c | 1 - > fs/ecryptfs/file.c | 1 - > fs/exofs/file.c | 2 -- > fs/ext2/file.c | 2 -- > fs/ext4/file.c | 2 -- > fs/f2fs/file.c | 2 -- > fs/fat/file.c | 1 - > fs/fuse/file.c | 1 - > fs/gfs2/file.c | 2 -- > fs/hfs/inode.c | 1 - > fs/hfsplus/inode.c | 1 - > fs/hostfs/hostfs_kern.c | 1 - > fs/hpfs/file.c | 1 - > fs/jffs2/file.c | 1 - > fs/jfs/file.c | 2 -- > fs/minix/file.c | 1 - > fs/nfs/file.c | 2 -- > fs/nfs/nfs4file.c | 2 -- > fs/nfsd/nfs4xdr.c | 2 +- > fs/nfsd/vfs.c | 3 ++- > fs/nilfs2/file.c | 1 - > fs/ntfs/file.c | 1 - > fs/ocfs2/file.c | 4 ---- > fs/omfs/file.c | 1 - > fs/ramfs/file-mmu.c | 2 -- > fs/ramfs/file-nommu.c | 2 -- > fs/read_write.c | 1 - > fs/reiserfs/file.c | 2 -- > fs/romfs/mmap-nommu.c | 1 - > fs/splice.c | 9 ++++++--- > fs/sysv/file.c | 1 - > fs/ubifs/file.c | 2 -- > fs/udf/file.c | 1 - > fs/ufs/file.c | 1 - > fs/xfs/xfs_file.c | 2 -- > include/linux/fs.h | 2 -- > mm/shmem.c | 2 -- > 46 files changed, 9 insertions(+), 75 deletions(-) > Love that diffstat: > diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c > index 67c4b9cc6e75..86044e00e00b 100644 > --- a/drivers/staging/lustre/lustre/llite/file.c > +++ b/drivers/staging/lustre/lustre/llite/file.c > @@ -3122,7 +3122,6 @@ struct file_operations ll_file_operations = { > .release = ll_file_release, > .mmap = ll_file_mmap, > .llseek = ll_file_seek, > - .splice_read = generic_file_splice_read, > .fsync = ll_fsync, > .flush = ll_flush > }; > @@ -3135,7 +3134,6 @@ struct file_operations ll_file_operations_flock = { > .release = ll_file_release, > .mmap = ll_file_mmap, > .llseek = ll_file_seek, > - .splice_read = generic_file_splice_read, > .fsync = ll_fsync, > .flush = ll_flush, > .flock = ll_file_flock, > @@ -3151,7 +3149,6 @@ struct file_operations ll_file_operations_noflock = { > .release = ll_file_release, > .mmap = ll_file_mmap, > .llseek = ll_file_seek, > - .splice_read = generic_file_splice_read, > .fsync = ll_fsync, > .flush = ll_flush, > .flock = ll_file_noflock, > diff --git a/fs/adfs/file.c b/fs/adfs/file.c > index 46c0d5671cd5..2f86134e95b7 100644 > --- a/fs/adfs/file.c > +++ b/fs/adfs/file.c > @@ -27,7 +27,6 @@ const struct file_operations adfs_file_operations = { > .mmap = generic_file_mmap, > .fsync = generic_file_fsync, > .write_iter = generic_file_write_iter, > - .splice_read = generic_file_splice_read, > }; > > const struct inode_operations adfs_file_inode_operations = { > diff --git a/fs/affs/file.c b/fs/affs/file.c > index 196ee7f6fdc4..c3498025ba8e 100644 > --- a/fs/affs/file.c > +++ b/fs/affs/file.c > @@ -974,7 +974,6 @@ const struct file_operations affs_file_operations = { > .open = affs_file_open, > .release = affs_file_release, > .fsync = affs_file_fsync, > - .splice_read = generic_file_splice_read, > }; > > const struct inode_operations affs_file_inode_operations = { > diff --git a/fs/afs/file.c b/fs/afs/file.c > index 0d5b8508869b..6fbfafbdebe9 100644 > --- a/fs/afs/file.c > +++ b/fs/afs/file.c > @@ -36,7 +36,6 @@ const struct file_operations afs_file_operations = { > .read_iter = generic_file_read_iter, > .write_iter = afs_file_write, > .mmap = generic_file_readonly_mmap, > - .splice_read = generic_file_splice_read, > .fsync = afs_fsync, > .lock = afs_lock, > .flock = afs_flock, > diff --git a/fs/bfs/file.c b/fs/bfs/file.c > index 97f1b5160155..ff5994cfd769 100644 > --- a/fs/bfs/file.c > +++ b/fs/bfs/file.c > @@ -26,7 +26,6 @@ const struct file_operations bfs_file_operations = { > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > - .splice_read = generic_file_splice_read, > }; > > static int bfs_move_block(unsigned long from, unsigned long to, > diff --git a/fs/block_dev.c b/fs/block_dev.c > index 519599dddd36..53b9902140b0 100644 > --- a/fs/block_dev.c > +++ b/fs/block_dev.c > @@ -2027,8 +2027,6 @@ const struct file_operations def_blk_fops = { > #ifdef CONFIG_COMPAT > .compat_ioctl = compat_blkdev_ioctl, > #endif > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .fallocate = blkdev_fallocate, > }; > > diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c > index da1096eb1a40..109c475729e0 100644 > --- a/fs/btrfs/file.c > +++ b/fs/btrfs/file.c > @@ -3074,7 +3074,6 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int whence) > const struct file_operations btrfs_file_operations = { > .llseek = btrfs_file_llseek, > .read_iter = generic_file_read_iter, > - .splice_read = generic_file_splice_read, > .write_iter = btrfs_file_write_iter, > .mmap = btrfs_file_mmap, > .open = generic_file_open, > diff --git a/fs/ceph/file.c b/fs/ceph/file.c > index 3fdde0b283c9..8842c869265c 100644 > --- a/fs/ceph/file.c > +++ b/fs/ceph/file.c > @@ -1721,8 +1721,6 @@ const struct file_operations ceph_file_fops = { > .fsync = ceph_fsync, > .lock = ceph_lock, > .flock = ceph_flock, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .unlocked_ioctl = ceph_ioctl, > .compat_ioctl = ceph_ioctl, > .fallocate = ceph_fallocate, > diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > index 9a1667e0e8d6..9b7cf2ad302e 100644 > --- a/fs/cifs/cifsfs.c > +++ b/fs/cifs/cifsfs.c > @@ -1068,7 +1068,6 @@ const struct file_operations cifs_file_ops = { > .fsync = cifs_fsync, > .flush = cifs_flush, > .mmap = cifs_file_mmap, > - .splice_read = generic_file_splice_read, > .llseek = cifs_llseek, > .unlocked_ioctl = cifs_ioctl, > .copy_file_range = cifs_copy_file_range, > @@ -1086,7 +1085,6 @@ const struct file_operations cifs_file_strict_ops = { > .fsync = cifs_strict_fsync, > .flush = cifs_flush, > .mmap = cifs_file_strict_mmap, > - .splice_read = generic_file_splice_read, > .llseek = cifs_llseek, > .unlocked_ioctl = cifs_ioctl, > .copy_file_range = cifs_copy_file_range, > @@ -1105,7 +1103,6 @@ const struct file_operations cifs_file_direct_ops = { > .fsync = cifs_fsync, > .flush = cifs_flush, > .mmap = cifs_file_mmap, > - .splice_read = generic_file_splice_read, > .unlocked_ioctl = cifs_ioctl, > .copy_file_range = cifs_copy_file_range, > .clone_file_range = cifs_clone_file_range, > @@ -1122,7 +1119,6 @@ const struct file_operations cifs_file_nobrl_ops = { > .fsync = cifs_fsync, > .flush = cifs_flush, > .mmap = cifs_file_mmap, > - .splice_read = generic_file_splice_read, > .llseek = cifs_llseek, > .unlocked_ioctl = cifs_ioctl, > .copy_file_range = cifs_copy_file_range, > @@ -1139,7 +1135,6 @@ const struct file_operations cifs_file_strict_nobrl_ops = { > .fsync = cifs_strict_fsync, > .flush = cifs_flush, > .mmap = cifs_file_strict_mmap, > - .splice_read = generic_file_splice_read, > .llseek = cifs_llseek, > .unlocked_ioctl = cifs_ioctl, > .copy_file_range = cifs_copy_file_range, > @@ -1157,7 +1152,6 @@ const struct file_operations cifs_file_direct_nobrl_ops = { > .fsync = cifs_fsync, > .flush = cifs_flush, > .mmap = cifs_file_mmap, > - .splice_read = generic_file_splice_read, > .unlocked_ioctl = cifs_ioctl, > .copy_file_range = cifs_copy_file_range, > .clone_file_range = cifs_clone_file_range, > diff --git a/fs/coda/file.c b/fs/coda/file.c > index 363402fcb3ed..0297b3835f27 100644 > --- a/fs/coda/file.c > +++ b/fs/coda/file.c > @@ -204,6 +204,5 @@ const struct file_operations coda_file_operations = { > .open = coda_open, > .release = coda_release, > .fsync = coda_fsync, > - .splice_read = generic_file_splice_read, > }; > > diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c > index ca4e83750214..f0c1894b8301 100644 > --- a/fs/ecryptfs/file.c > +++ b/fs/ecryptfs/file.c > @@ -422,5 +422,4 @@ const struct file_operations ecryptfs_main_fops = { > .release = ecryptfs_release, > .fsync = ecryptfs_fsync, > .fasync = ecryptfs_fasync, > - .splice_read = generic_file_splice_read, > }; > diff --git a/fs/exofs/file.c b/fs/exofs/file.c > index 28645f0640f7..86fc0049cb0d 100644 > --- a/fs/exofs/file.c > +++ b/fs/exofs/file.c > @@ -74,8 +74,6 @@ const struct file_operations exofs_file_operations = { > .release = exofs_release_file, > .fsync = exofs_file_fsync, > .flush = exofs_flush, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > }; > > const struct inode_operations exofs_file_inode_operations = { > diff --git a/fs/ext2/file.c b/fs/ext2/file.c > index b21891a6bfca..ef52e5ad2ef5 100644 > --- a/fs/ext2/file.c > +++ b/fs/ext2/file.c > @@ -217,8 +217,6 @@ const struct file_operations ext2_file_operations = { > .release = ext2_release_file, > .fsync = ext2_fsync, > .get_unmapped_area = thp_get_unmapped_area, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > }; > > const struct inode_operations ext2_file_inode_operations = { > diff --git a/fs/ext4/file.c b/fs/ext4/file.c > index 831fd6beebf0..053d030deb16 100644 > --- a/fs/ext4/file.c > +++ b/fs/ext4/file.c > @@ -750,8 +750,6 @@ const struct file_operations ext4_file_operations = { > .release = ext4_release_file, > .fsync = ext4_sync_file, > .get_unmapped_area = thp_get_unmapped_area, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .fallocate = ext4_fallocate, > }; > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > index 61af721329fa..abfb9a9b23a3 100644 > --- a/fs/f2fs/file.c > +++ b/fs/f2fs/file.c > @@ -2404,6 +2404,4 @@ const struct file_operations f2fs_file_operations = { > #ifdef CONFIG_COMPAT > .compat_ioctl = f2fs_compat_ioctl, > #endif > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > }; > diff --git a/fs/fat/file.c b/fs/fat/file.c > index 4724cc9ad650..5a879f2249af 100644 > --- a/fs/fat/file.c > +++ b/fs/fat/file.c > @@ -180,7 +180,6 @@ const struct file_operations fat_file_operations = { > .compat_ioctl = fat_generic_compat_ioctl, > #endif > .fsync = fat_file_fsync, > - .splice_read = generic_file_splice_read, > .fallocate = fat_fallocate, > }; > > diff --git a/fs/fuse/file.c b/fs/fuse/file.c > index 3ee4fdc3da9e..ee9d1dd7eba1 100644 > --- a/fs/fuse/file.c > +++ b/fs/fuse/file.c > @@ -3015,7 +3015,6 @@ static const struct file_operations fuse_file_operations = { > .fsync = fuse_fsync, > .lock = fuse_file_lock, > .flock = fuse_file_flock, > - .splice_read = generic_file_splice_read, > .unlocked_ioctl = fuse_file_ioctl, > .compat_ioctl = fuse_file_compat_ioctl, > .poll = fuse_file_poll, > diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c > index c2062a108d19..9c21a57661bf 100644 > --- a/fs/gfs2/file.c > +++ b/fs/gfs2/file.c > @@ -1120,7 +1120,6 @@ const struct file_operations gfs2_file_fops = { > .fsync = gfs2_fsync, > .lock = gfs2_lock, > .flock = gfs2_flock, > - .splice_read = generic_file_splice_read, > .splice_write = gfs2_file_splice_write, > .setlease = simple_nosetlease, > .fallocate = gfs2_fallocate, > @@ -1148,7 +1147,6 @@ const struct file_operations gfs2_file_fops_nolock = { > .open = gfs2_open, > .release = gfs2_release, > .fsync = gfs2_fsync, > - .splice_read = generic_file_splice_read, > .splice_write = gfs2_file_splice_write, > .setlease = generic_setlease, > .fallocate = gfs2_fallocate, > diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c > index bfbba799430f..4b9e3e4fcf93 100644 > --- a/fs/hfs/inode.c > +++ b/fs/hfs/inode.c > @@ -680,7 +680,6 @@ static const struct file_operations hfs_file_operations = { > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > - .splice_read = generic_file_splice_read, > .fsync = hfs_file_fsync, > .open = hfs_file_open, > .release = hfs_file_release, > diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c > index e8638d528195..d028d32f1c5f 100644 > --- a/fs/hfsplus/inode.c > +++ b/fs/hfsplus/inode.c > @@ -346,7 +346,6 @@ static const struct file_operations hfsplus_file_operations = { > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > - .splice_read = generic_file_splice_read, > .fsync = hfsplus_file_fsync, > .open = hfsplus_file_open, > .release = hfsplus_file_release, > diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c > index e61261a7417e..c0f5ba4f835f 100644 > --- a/fs/hostfs/hostfs_kern.c > +++ b/fs/hostfs/hostfs_kern.c > @@ -387,7 +387,6 @@ static int hostfs_fsync(struct file *file, loff_t start, loff_t end, > > static const struct file_operations hostfs_file_fops = { > .llseek = generic_file_llseek, > - .splice_read = generic_file_splice_read, > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c > index b3be1b5a62e2..474933a15e28 100644 > --- a/fs/hpfs/file.c > +++ b/fs/hpfs/file.c > @@ -212,7 +212,6 @@ const struct file_operations hpfs_file_ops = > .mmap = generic_file_mmap, > .release = hpfs_file_release, > .fsync = hpfs_file_fsync, > - .splice_read = generic_file_splice_read, > .unlocked_ioctl = hpfs_ioctl, > }; > > diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c > index c12476e309c6..843918d2204b 100644 > --- a/fs/jffs2/file.c > +++ b/fs/jffs2/file.c > @@ -56,7 +56,6 @@ const struct file_operations jffs2_file_operations = > .unlocked_ioctl=jffs2_ioctl, > .mmap = generic_file_readonly_mmap, > .fsync = jffs2_fsync, > - .splice_read = generic_file_splice_read, > }; > > /* jffs2_file_inode_operations */ > diff --git a/fs/jfs/file.c b/fs/jfs/file.c > index 739492c7a3fd..91d2c46c0a3e 100644 > --- a/fs/jfs/file.c > +++ b/fs/jfs/file.c > @@ -154,8 +154,6 @@ const struct file_operations jfs_file_operations = { > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .fsync = jfs_fsync, > .release = jfs_release, > .unlocked_ioctl = jfs_ioctl, > diff --git a/fs/minix/file.c b/fs/minix/file.c > index a6a4797aa0d4..340bbe384985 100644 > --- a/fs/minix/file.c > +++ b/fs/minix/file.c > @@ -18,7 +18,6 @@ const struct file_operations minix_file_operations = { > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > .fsync = generic_file_fsync, > - .splice_read = generic_file_splice_read, > }; > > static int minix_setattr(struct dentry *dentry, struct iattr *attr) > diff --git a/fs/nfs/file.c b/fs/nfs/file.c > index 5713eb32a45e..e262b0b4f03c 100644 > --- a/fs/nfs/file.c > +++ b/fs/nfs/file.c > @@ -852,8 +852,6 @@ const struct file_operations nfs_file_operations = { > .fsync = nfs_file_fsync, > .lock = nfs_lock, > .flock = nfs_flock, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .check_flags = nfs_check_flags, > .setlease = simple_nosetlease, > }; > diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c > index 0efba77789b9..91688552295c 100644 > --- a/fs/nfs/nfs4file.c > +++ b/fs/nfs/nfs4file.c > @@ -248,8 +248,6 @@ const struct file_operations nfs4_file_operations = { > .fsync = nfs_file_fsync, > .lock = nfs_lock, > .flock = nfs_flock, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .check_flags = nfs_check_flags, > .setlease = simple_nosetlease, > #ifdef CONFIG_NFS_V4_2 > diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c > index 26780d53a6f9..c780ce2bdf47 100644 > --- a/fs/nfsd/nfs4xdr.c > +++ b/fs/nfsd/nfs4xdr.c > @@ -3579,7 +3579,7 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, > if (read->rd_tmp_file) > ra = nfsd_init_raparms(file); > > - if (file->f_op->splice_read && > + if ((file->f_op->read_iter || file->f_op->splice_read) && > test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) > nfserr = nfsd4_encode_splice_read(resp, read, file, maxcount); > else > diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c > index 0d19ab1b9404..c23b3adbcff2 100644 > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -1032,7 +1032,8 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, > > trace_read_opened(rqstp, fhp, offset, vlen); > > - if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) > + if ((file->f_op->read_iter || file->f_op->splice_read) && > + test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) > err = nfsd_splice_read(rqstp, file, offset, count); > else > err = nfsd_readv(file, offset, vec, vlen, count); > diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c > index c5fa3dee72fc..e9a5507f9e70 100644 > --- a/fs/nilfs2/file.c > +++ b/fs/nilfs2/file.c > @@ -149,7 +149,6 @@ const struct file_operations nilfs_file_operations = { > .open = generic_file_open, > /* .release = nilfs_release_file, */ > .fsync = nilfs_sync_file, > - .splice_read = generic_file_splice_read, > }; > > const struct inode_operations nilfs_file_inode_operations = { > diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c > index c4f68c338735..3f842b9d7c67 100644 > --- a/fs/ntfs/file.c > +++ b/fs/ntfs/file.c > @@ -2026,7 +2026,6 @@ const struct file_operations ntfs_file_ops = { > #endif /* NTFS_RW */ > .mmap = generic_file_mmap, > .open = ntfs_file_open, > - .splice_read = generic_file_splice_read, > }; > > const struct inode_operations ntfs_file_inode_ops = { > diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c > index bfeb647459d9..a0cdb8bfdf32 100644 > --- a/fs/ocfs2/file.c > +++ b/fs/ocfs2/file.c > @@ -2531,8 +2531,6 @@ const struct file_operations ocfs2_fops = { > #endif > .lock = ocfs2_lock, > .flock = ocfs2_flock, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .fallocate = ocfs2_fallocate, > .clone_file_range = ocfs2_file_clone_range, > .dedupe_file_range = ocfs2_file_dedupe_range, > @@ -2578,8 +2576,6 @@ const struct file_operations ocfs2_fops_no_plocks = { > .compat_ioctl = ocfs2_compat_ioctl, > #endif > .flock = ocfs2_flock, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .fallocate = ocfs2_fallocate, > .clone_file_range = ocfs2_file_clone_range, > .dedupe_file_range = ocfs2_file_dedupe_range, > diff --git a/fs/omfs/file.c b/fs/omfs/file.c > index bf83e6644333..b67118bf1275 100644 > --- a/fs/omfs/file.c > +++ b/fs/omfs/file.c > @@ -341,7 +341,6 @@ const struct file_operations omfs_file_operations = { > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > .fsync = generic_file_fsync, > - .splice_read = generic_file_splice_read, > }; > > static int omfs_setattr(struct dentry *dentry, struct iattr *attr) > diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c > index 12af0490322f..6c74136579d6 100644 > --- a/fs/ramfs/file-mmu.c > +++ b/fs/ramfs/file-mmu.c > @@ -43,8 +43,6 @@ const struct file_operations ramfs_file_operations = { > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > .fsync = noop_fsync, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .llseek = generic_file_llseek, > .get_unmapped_area = ramfs_mmu_get_unmapped_area, > }; > diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c > index 2ef7ce75c062..59cdce5bb7f7 100644 > --- a/fs/ramfs/file-nommu.c > +++ b/fs/ramfs/file-nommu.c > @@ -47,8 +47,6 @@ const struct file_operations ramfs_file_operations = { > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > .fsync = noop_fsync, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .llseek = generic_file_llseek, > }; > > diff --git a/fs/read_write.c b/fs/read_write.c > index acfd3dc63d57..3d76e5bff62d 100644 > --- a/fs/read_write.c > +++ b/fs/read_write.c > @@ -28,7 +28,6 @@ const struct file_operations generic_ro_fops = { > .llseek = generic_file_llseek, > .read_iter = generic_file_read_iter, > .mmap = generic_file_readonly_mmap, > - .splice_read = generic_file_splice_read, > }; > > EXPORT_SYMBOL(generic_ro_fops); > diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c > index b396eb09f288..86dd17fced0b 100644 > --- a/fs/reiserfs/file.c > +++ b/fs/reiserfs/file.c > @@ -253,8 +253,6 @@ const struct file_operations reiserfs_file_operations = { > .fsync = reiserfs_sync_file, > .read_iter = generic_file_read_iter, > .write_iter = generic_file_write_iter, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .llseek = generic_file_llseek, > }; > > diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c > index 1118a0dc6b45..3eb5014068dc 100644 > --- a/fs/romfs/mmap-nommu.c > +++ b/fs/romfs/mmap-nommu.c > @@ -82,7 +82,6 @@ static unsigned romfs_mmap_capabilities(struct file *file) > const struct file_operations romfs_ro_fops = { > .llseek = generic_file_llseek, > .read_iter = generic_file_read_iter, > - .splice_read = generic_file_splice_read, > .mmap = romfs_mmap, > .get_unmapped_area = romfs_get_unmapped_area, > .mmap_capabilities = romfs_mmap_capabilities, > diff --git a/fs/splice.c b/fs/splice.c > index ae41201d0325..ecf8d6edbb30 100644 > --- a/fs/splice.c > +++ b/fs/splice.c > @@ -280,7 +280,7 @@ void splice_shrink_spd(struct splice_pipe_desc *spd) > } > > /** > - * generic_file_splice_read - splice data from file to a pipe > + * iter_file_splice_read - splice data from file to a pipe > * @in: file to splice from > * @ppos: position in @in > * @pipe: pipe to splice to > @@ -292,7 +292,7 @@ void splice_shrink_spd(struct splice_pipe_desc *spd) > * used as long as it has more or less sane ->read_iter(). > * > */ > -ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, > +static ssize_t iter_file_splice_read(struct file *in, loff_t *ppos, > struct pipe_inode_info *pipe, size_t len, > unsigned int flags) > { > @@ -322,7 +322,6 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, > > return ret; > } > -EXPORT_SYMBOL(generic_file_splice_read); > > const struct pipe_buf_operations default_pipe_buf_ops = { > .can_merge = 0, > @@ -861,6 +860,8 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, > > if (out->f_op->splice_write) > splice_write = out->f_op->splice_write; > + else if (out->f_op->write_iter) > + splice_write = iter_file_splice_write; > else > splice_write = default_file_splice_write; > > @@ -890,6 +891,8 @@ static long do_splice_to(struct file *in, loff_t *ppos, > > if (in->f_op->splice_read) > splice_read = in->f_op->splice_read; > + else if (in->f_op->read_iter) > + splice_read = iter_file_splice_read; > else > splice_read = default_file_splice_read; > > diff --git a/fs/sysv/file.c b/fs/sysv/file.c > index 7ba997e31aeb..74a63fb0461e 100644 > --- a/fs/sysv/file.c > +++ b/fs/sysv/file.c > @@ -25,7 +25,6 @@ const struct file_operations sysv_file_operations = { > .write_iter = generic_file_write_iter, > .mmap = generic_file_mmap, > .fsync = generic_file_fsync, > - .splice_read = generic_file_splice_read, > }; > > static int sysv_setattr(struct dentry *dentry, struct iattr *attr) > diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c > index 2cda3d67e2d0..ba349d17cf15 100644 > --- a/fs/ubifs/file.c > +++ b/fs/ubifs/file.c > @@ -1748,8 +1748,6 @@ const struct file_operations ubifs_file_operations = { > .mmap = ubifs_file_mmap, > .fsync = ubifs_fsync, > .unlocked_ioctl = ubifs_ioctl, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .open = ubifs_file_open, > #ifdef CONFIG_COMPAT > .compat_ioctl = ubifs_compat_ioctl, > diff --git a/fs/udf/file.c b/fs/udf/file.c > index f5eb2d5b3bac..8eede44475be 100644 > --- a/fs/udf/file.c > +++ b/fs/udf/file.c > @@ -244,7 +244,6 @@ const struct file_operations udf_file_operations = { > .write_iter = udf_file_write_iter, > .release = udf_release_file, > .fsync = generic_file_fsync, > - .splice_read = generic_file_splice_read, > .llseek = generic_file_llseek, > }; > > diff --git a/fs/ufs/file.c b/fs/ufs/file.c > index 042ddbf110cc..28c45f4f2aae 100644 > --- a/fs/ufs/file.c > +++ b/fs/ufs/file.c > @@ -40,5 +40,4 @@ const struct file_operations ufs_file_operations = { > .mmap = generic_file_mmap, > .open = generic_file_open, > .fsync = generic_file_fsync, > - .splice_read = generic_file_splice_read, > }; > diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c > index 35703a801372..328d16bdfedb 100644 > --- a/fs/xfs/xfs_file.c > +++ b/fs/xfs/xfs_file.c > @@ -1520,8 +1520,6 @@ const struct file_operations xfs_file_operations = { > .llseek = xfs_file_llseek, > .read_iter = xfs_file_read_iter, > .write_iter = xfs_file_write_iter, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .unlocked_ioctl = xfs_file_ioctl, > #ifdef CONFIG_COMPAT > .compat_ioctl = xfs_file_compat_ioctl, > diff --git a/include/linux/fs.h b/include/linux/fs.h > index c67f1f8ee789..17955f196ad5 100644 > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -2802,8 +2802,6 @@ extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end, > extern void block_sync_page(struct page *page); > > /* fs/splice.c */ > -extern ssize_t generic_file_splice_read(struct file *, loff_t *, > - struct pipe_inode_info *, size_t, unsigned int); > extern ssize_t iter_file_splice_write(struct pipe_inode_info *, > struct file *, loff_t *, size_t, unsigned int); > extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, > diff --git a/mm/shmem.c b/mm/shmem.c > index e67d6ba4e98e..ba37addf6c87 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -3843,8 +3843,6 @@ static const struct file_operations shmem_file_operations = { > .read_iter = shmem_file_read_iter, > .write_iter = generic_file_write_iter, > .fsync = noop_fsync, > - .splice_read = generic_file_splice_read, > - .splice_write = iter_file_splice_write, > .fallocate = shmem_fallocate, > #endif > }; Reviewed-by: Jeff Layton <jlayton@redhat.com>
On Sun, May 28, 2017 at 12:48:05PM +0300, Christoph Hellwig wrote: > If a file_operations instance has the read or write iter methods we should > use the iter based splice code by default. We still allow to overide it > with explicit ->read_iter and ->write_iter methods, but few of them are > left, and there is a non-zero chance that we could get rid of them in the > future. ->read_iter() side: you are changing behaviour for the following bunch: arch/s390/hypfs/inode.c:437: .read_iter = hypfs_read_iter, drivers/char/mem.c:798: .read_iter = read_iter_null, drivers/char/mem.c:813: .read_iter = read_iter_zero, drivers/char/mem.c:824: .read_iter = read_iter_zero, drivers/char/raw.c:286: .read_iter = blkdev_read_iter, drivers/net/tap.c:1134: .read_iter = tap_read_iter, drivers/net/tun.c:2423: .read_iter = tun_chr_read_iter, drivers/usb/gadget/function/f_fs.c:1254: .read_iter = ffs_epfile_read_iter, drivers/usb/gadget/legacy/inode.c:704: .read_iter = ep_read_iter, drivers/vhost/net.c:1249: .read_iter = vhost_net_chr_read_iter, fs/9p/vfs_file.c:641: .read_iter = generic_file_read_iter, fs/9p/vfs_file.c:652: .read_iter = generic_file_read_iter, fs/9p/vfs_file.c:664: .read_iter = v9fs_file_read_iter, fs/9p/vfs_file.c:675: .read_iter = v9fs_file_read_iter, fs/9p/vfs_file.c:687: .read_iter = v9fs_mmap_file_read_iter, fs/9p/vfs_file.c:698: .read_iter = v9fs_mmap_file_read_iter, fs/fuse/cuse.c:180: .read_iter = cuse_read_iter, fs/fuse/file.c:3027: .read_iter = fuse_direct_read_iter, fs/hugetlbfs/inode.c:980: .read_iter = hugetlbfs_read_iter, fs/ncpfs/file.c:248: .read_iter = ncp_file_read_iter, fs/orangefs/file.c:743: .read_iter = orangefs_file_read_iter, sound/core/pcm_native.c:3696: .read_iter = snd_pcm_readv, All of them get generic_file_splice_read() for ->splice_read() (OK, modulo your renaming). For some of them it's clearly the right thing to do; however, that depends upon their ->read_iter() not doing anything that wouldn't work on ITER_PIPE ones. Which deserves an explanation in commit message, if nothing else. ncpfs: OK hugetlbfs: probably, but I would suggest testing that. orangefs: OK 9p: can get nasty. It depends upon p9_client_read() being OK with ITER_PIPE. It probably shouldn't be too hard to get working, but at the moment I won't bet that it handles full pipe correctly, for example. At the very least, it needs testing; the interesting setup is virtio with non-caching 9p over it. fuse direct/cuse: *probably* should work (unless we already have bugs there, which is not impossible). Needs testing. drivers/char/mem: OK drivers/char/raw: OK hypfs: OK vhost: dubious, but then so's read() there gadget: might be OK, needs testing. tun/tap: 100% *NOT* OK. ITER_PIPE won't work for those - not with skipping holes in the buffer. This is hopelessly broken; leaving a chunk of userland buffer unmodified is one thing, but doing that to page we are putting into pipe? No go. At the very least, it would need to turn that into iov_iter_zero(), followed by serious testing. sound: fuck, no.
On Tue, May 30, 2017 at 08:11:15AM +0100, Al Viro wrote: > On Sun, May 28, 2017 at 12:48:05PM +0300, Christoph Hellwig wrote: > > If a file_operations instance has the read or write iter methods we should > > use the iter based splice code by default. We still allow to overide it > > with explicit ->read_iter and ->write_iter methods, but few of them are > > left, and there is a non-zero chance that we could get rid of them in the > > future. > > ->read_iter() side: you are changing behaviour for the following bunch: ->write_iter(): a whole lot more changed ones; OTOH, ITER_BDEV is less painful that ITER_PIPE. arch/s390/hypfs/inode.c:438: .write_iter = hypfs_write_iter, drivers/bluetooth/hci_vhci.c:368: .write_iter = vhci_write, drivers/char/mem.c:814: .write_iter = write_iter_zero, drivers/char/raw.c:287: .write_iter = blkdev_write_iter, drivers/infiniband/hw/hfi1/file_ops.c:110: .write_iter = hfi1_write_iter, drivers/infiniband/hw/qib/qib_file_ops.c:72: .write_iter = qib_write_iter, drivers/net/tap.c:1135: .write_iter = tap_write_iter, drivers/net/tun.c:2424: .write_iter = tun_chr_write_iter, drivers/staging/lustre/lustre/llite/file.c:3119: .write_iter = ll_file_write_iter, drivers/staging/lustre/lustre/llite/file.c:3132: .write_iter = ll_file_write_iter, drivers/staging/lustre/lustre/llite/file.c:3148: .write_iter = ll_file_write_iter, drivers/usb/gadget/function/f_fs.c:1253: .write_iter = ffs_epfile_write_iter, drivers/usb/gadget/legacy/inode.c:705: .write_iter = ep_write_iter, drivers/vhost/net.c:1250: .write_iter = vhost_net_chr_write_iter, fs/9p/vfs_file.c:642: .write_iter = generic_file_write_iter, fs/9p/vfs_file.c:653: .write_iter = generic_file_write_iter, fs/9p/vfs_file.c:665: .write_iter = v9fs_file_write_iter, fs/9p/vfs_file.c:676: .write_iter = v9fs_file_write_iter, fs/9p/vfs_file.c:688: .write_iter = v9fs_mmap_file_write_iter, fs/9p/vfs_file.c:699: .write_iter = v9fs_mmap_file_write_iter, fs/adfs/file.c:29: .write_iter = generic_file_write_iter, fs/affs/file.c:972: .write_iter = generic_file_write_iter, fs/afs/file.c:37: .write_iter = afs_file_write, fs/bfs/file.c:27: .write_iter = generic_file_write_iter, fs/btrfs/file.c:3078: .write_iter = btrfs_file_write_iter, fs/cifs/cifsfs.c:1064: .write_iter = cifs_file_write_iter, fs/cifs/cifsfs.c:1082: .write_iter = cifs_strict_writev, fs/cifs/cifsfs.c:1101: .write_iter = cifs_user_writev, fs/cifs/cifsfs.c:1119: .write_iter = cifs_file_write_iter, fs/cifs/cifsfs.c:1136: .write_iter = cifs_strict_writev, fs/cifs/cifsfs.c:1154: .write_iter = cifs_user_writev, fs/coda/file.c:202: .write_iter = coda_file_write_iter, fs/ecryptfs/file.c:414: .write_iter = generic_file_write_iter, fs/fat/file.c:175: .write_iter = generic_file_write_iter, fs/fuse/cuse.c:181: .write_iter = cuse_write_iter, fs/fuse/file.c:3010: .write_iter = fuse_file_write_iter, fs/fuse/file.c:3028: .write_iter = fuse_direct_write_iter, fs/hfs/inode.c:681: .write_iter = generic_file_write_iter, fs/hfsplus/inode.c:347: .write_iter = generic_file_write_iter, fs/hostfs/hostfs_kern.c:392: .write_iter = generic_file_write_iter, fs/hpfs/file.c:211: .write_iter = generic_file_write_iter, fs/jffs2/file.c:55: .write_iter = generic_file_write_iter, fs/minix/file.c:18: .write_iter = generic_file_write_iter, fs/ncpfs/file.c:249: .write_iter = ncp_file_write_iter, fs/nilfs2/file.c:143: .write_iter = generic_file_write_iter, fs/ntfs/file.c:2024: .write_iter = ntfs_file_write_iter, fs/omfs/file.c:341: .write_iter = generic_file_write_iter, fs/orangefs/devorangefs-req.c:834: .write_iter = orangefs_devreq_write_iter, fs/orangefs/file.c:744: .write_iter = orangefs_file_write_iter, fs/sysv/file.c:25: .write_iter = generic_file_write_iter, fs/udf/file.c:244: .write_iter = udf_file_write_iter, fs/ufs/file.c:39: .write_iter = generic_file_write_iter, kernel/printk/printk.c:999: .write_iter = devkmsg_write, sound/core/pcm_native.c:3682: .write_iter = snd_pcm_writev, adfs, affs, afs, bfs, btrfs, coda, fat, ecryptfs, hfs, hfsplus, hostfs, hpfs, jffs2, minix, ncpfs, nilfs2, omfs, orangefs, sysv, udf, ufs: should be OK ntfs: probably OK 9p: depends upon p9_client_write() safety, very likely to be OK. cifs: probably OK fuse/cuse: might be OK, needs testing lustre: probably OK drivers/char/mem: ought to use splice_write_null(), actually. drivers/char/raw: should be OK gadgetfs: needs testing, might be OK bluetooth, orangefs devreq, devkmsg, tun/tap, vhost: will break. These are datagram-oriented and currently pipe buffers serve as datagram boundaries. With this change the would get concatenated, with bogus results. hypfs, infinibarf, sound: fuck, no
diff --git a/drivers/staging/lustre/lustre/llite/file.c b/drivers/staging/lustre/lustre/llite/file.c index 67c4b9cc6e75..86044e00e00b 100644 --- a/drivers/staging/lustre/lustre/llite/file.c +++ b/drivers/staging/lustre/lustre/llite/file.c @@ -3122,7 +3122,6 @@ struct file_operations ll_file_operations = { .release = ll_file_release, .mmap = ll_file_mmap, .llseek = ll_file_seek, - .splice_read = generic_file_splice_read, .fsync = ll_fsync, .flush = ll_flush }; @@ -3135,7 +3134,6 @@ struct file_operations ll_file_operations_flock = { .release = ll_file_release, .mmap = ll_file_mmap, .llseek = ll_file_seek, - .splice_read = generic_file_splice_read, .fsync = ll_fsync, .flush = ll_flush, .flock = ll_file_flock, @@ -3151,7 +3149,6 @@ struct file_operations ll_file_operations_noflock = { .release = ll_file_release, .mmap = ll_file_mmap, .llseek = ll_file_seek, - .splice_read = generic_file_splice_read, .fsync = ll_fsync, .flush = ll_flush, .flock = ll_file_noflock, diff --git a/fs/adfs/file.c b/fs/adfs/file.c index 46c0d5671cd5..2f86134e95b7 100644 --- a/fs/adfs/file.c +++ b/fs/adfs/file.c @@ -27,7 +27,6 @@ const struct file_operations adfs_file_operations = { .mmap = generic_file_mmap, .fsync = generic_file_fsync, .write_iter = generic_file_write_iter, - .splice_read = generic_file_splice_read, }; const struct inode_operations adfs_file_inode_operations = { diff --git a/fs/affs/file.c b/fs/affs/file.c index 196ee7f6fdc4..c3498025ba8e 100644 --- a/fs/affs/file.c +++ b/fs/affs/file.c @@ -974,7 +974,6 @@ const struct file_operations affs_file_operations = { .open = affs_file_open, .release = affs_file_release, .fsync = affs_file_fsync, - .splice_read = generic_file_splice_read, }; const struct inode_operations affs_file_inode_operations = { diff --git a/fs/afs/file.c b/fs/afs/file.c index 0d5b8508869b..6fbfafbdebe9 100644 --- a/fs/afs/file.c +++ b/fs/afs/file.c @@ -36,7 +36,6 @@ const struct file_operations afs_file_operations = { .read_iter = generic_file_read_iter, .write_iter = afs_file_write, .mmap = generic_file_readonly_mmap, - .splice_read = generic_file_splice_read, .fsync = afs_fsync, .lock = afs_lock, .flock = afs_flock, diff --git a/fs/bfs/file.c b/fs/bfs/file.c index 97f1b5160155..ff5994cfd769 100644 --- a/fs/bfs/file.c +++ b/fs/bfs/file.c @@ -26,7 +26,6 @@ const struct file_operations bfs_file_operations = { .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, - .splice_read = generic_file_splice_read, }; static int bfs_move_block(unsigned long from, unsigned long to, diff --git a/fs/block_dev.c b/fs/block_dev.c index 519599dddd36..53b9902140b0 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -2027,8 +2027,6 @@ const struct file_operations def_blk_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = compat_blkdev_ioctl, #endif - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .fallocate = blkdev_fallocate, }; diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c index da1096eb1a40..109c475729e0 100644 --- a/fs/btrfs/file.c +++ b/fs/btrfs/file.c @@ -3074,7 +3074,6 @@ static loff_t btrfs_file_llseek(struct file *file, loff_t offset, int whence) const struct file_operations btrfs_file_operations = { .llseek = btrfs_file_llseek, .read_iter = generic_file_read_iter, - .splice_read = generic_file_splice_read, .write_iter = btrfs_file_write_iter, .mmap = btrfs_file_mmap, .open = generic_file_open, diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 3fdde0b283c9..8842c869265c 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -1721,8 +1721,6 @@ const struct file_operations ceph_file_fops = { .fsync = ceph_fsync, .lock = ceph_lock, .flock = ceph_flock, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .unlocked_ioctl = ceph_ioctl, .compat_ioctl = ceph_ioctl, .fallocate = ceph_fallocate, diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 9a1667e0e8d6..9b7cf2ad302e 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -1068,7 +1068,6 @@ const struct file_operations cifs_file_ops = { .fsync = cifs_fsync, .flush = cifs_flush, .mmap = cifs_file_mmap, - .splice_read = generic_file_splice_read, .llseek = cifs_llseek, .unlocked_ioctl = cifs_ioctl, .copy_file_range = cifs_copy_file_range, @@ -1086,7 +1085,6 @@ const struct file_operations cifs_file_strict_ops = { .fsync = cifs_strict_fsync, .flush = cifs_flush, .mmap = cifs_file_strict_mmap, - .splice_read = generic_file_splice_read, .llseek = cifs_llseek, .unlocked_ioctl = cifs_ioctl, .copy_file_range = cifs_copy_file_range, @@ -1105,7 +1103,6 @@ const struct file_operations cifs_file_direct_ops = { .fsync = cifs_fsync, .flush = cifs_flush, .mmap = cifs_file_mmap, - .splice_read = generic_file_splice_read, .unlocked_ioctl = cifs_ioctl, .copy_file_range = cifs_copy_file_range, .clone_file_range = cifs_clone_file_range, @@ -1122,7 +1119,6 @@ const struct file_operations cifs_file_nobrl_ops = { .fsync = cifs_fsync, .flush = cifs_flush, .mmap = cifs_file_mmap, - .splice_read = generic_file_splice_read, .llseek = cifs_llseek, .unlocked_ioctl = cifs_ioctl, .copy_file_range = cifs_copy_file_range, @@ -1139,7 +1135,6 @@ const struct file_operations cifs_file_strict_nobrl_ops = { .fsync = cifs_strict_fsync, .flush = cifs_flush, .mmap = cifs_file_strict_mmap, - .splice_read = generic_file_splice_read, .llseek = cifs_llseek, .unlocked_ioctl = cifs_ioctl, .copy_file_range = cifs_copy_file_range, @@ -1157,7 +1152,6 @@ const struct file_operations cifs_file_direct_nobrl_ops = { .fsync = cifs_fsync, .flush = cifs_flush, .mmap = cifs_file_mmap, - .splice_read = generic_file_splice_read, .unlocked_ioctl = cifs_ioctl, .copy_file_range = cifs_copy_file_range, .clone_file_range = cifs_clone_file_range, diff --git a/fs/coda/file.c b/fs/coda/file.c index 363402fcb3ed..0297b3835f27 100644 --- a/fs/coda/file.c +++ b/fs/coda/file.c @@ -204,6 +204,5 @@ const struct file_operations coda_file_operations = { .open = coda_open, .release = coda_release, .fsync = coda_fsync, - .splice_read = generic_file_splice_read, }; diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index ca4e83750214..f0c1894b8301 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -422,5 +422,4 @@ const struct file_operations ecryptfs_main_fops = { .release = ecryptfs_release, .fsync = ecryptfs_fsync, .fasync = ecryptfs_fasync, - .splice_read = generic_file_splice_read, }; diff --git a/fs/exofs/file.c b/fs/exofs/file.c index 28645f0640f7..86fc0049cb0d 100644 --- a/fs/exofs/file.c +++ b/fs/exofs/file.c @@ -74,8 +74,6 @@ const struct file_operations exofs_file_operations = { .release = exofs_release_file, .fsync = exofs_file_fsync, .flush = exofs_flush, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, }; const struct inode_operations exofs_file_inode_operations = { diff --git a/fs/ext2/file.c b/fs/ext2/file.c index b21891a6bfca..ef52e5ad2ef5 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c @@ -217,8 +217,6 @@ const struct file_operations ext2_file_operations = { .release = ext2_release_file, .fsync = ext2_fsync, .get_unmapped_area = thp_get_unmapped_area, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, }; const struct inode_operations ext2_file_inode_operations = { diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 831fd6beebf0..053d030deb16 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c @@ -750,8 +750,6 @@ const struct file_operations ext4_file_operations = { .release = ext4_release_file, .fsync = ext4_sync_file, .get_unmapped_area = thp_get_unmapped_area, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .fallocate = ext4_fallocate, }; diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 61af721329fa..abfb9a9b23a3 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -2404,6 +2404,4 @@ const struct file_operations f2fs_file_operations = { #ifdef CONFIG_COMPAT .compat_ioctl = f2fs_compat_ioctl, #endif - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, }; diff --git a/fs/fat/file.c b/fs/fat/file.c index 4724cc9ad650..5a879f2249af 100644 --- a/fs/fat/file.c +++ b/fs/fat/file.c @@ -180,7 +180,6 @@ const struct file_operations fat_file_operations = { .compat_ioctl = fat_generic_compat_ioctl, #endif .fsync = fat_file_fsync, - .splice_read = generic_file_splice_read, .fallocate = fat_fallocate, }; diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 3ee4fdc3da9e..ee9d1dd7eba1 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c @@ -3015,7 +3015,6 @@ static const struct file_operations fuse_file_operations = { .fsync = fuse_fsync, .lock = fuse_file_lock, .flock = fuse_file_flock, - .splice_read = generic_file_splice_read, .unlocked_ioctl = fuse_file_ioctl, .compat_ioctl = fuse_file_compat_ioctl, .poll = fuse_file_poll, diff --git a/fs/gfs2/file.c b/fs/gfs2/file.c index c2062a108d19..9c21a57661bf 100644 --- a/fs/gfs2/file.c +++ b/fs/gfs2/file.c @@ -1120,7 +1120,6 @@ const struct file_operations gfs2_file_fops = { .fsync = gfs2_fsync, .lock = gfs2_lock, .flock = gfs2_flock, - .splice_read = generic_file_splice_read, .splice_write = gfs2_file_splice_write, .setlease = simple_nosetlease, .fallocate = gfs2_fallocate, @@ -1148,7 +1147,6 @@ const struct file_operations gfs2_file_fops_nolock = { .open = gfs2_open, .release = gfs2_release, .fsync = gfs2_fsync, - .splice_read = generic_file_splice_read, .splice_write = gfs2_file_splice_write, .setlease = generic_setlease, .fallocate = gfs2_fallocate, diff --git a/fs/hfs/inode.c b/fs/hfs/inode.c index bfbba799430f..4b9e3e4fcf93 100644 --- a/fs/hfs/inode.c +++ b/fs/hfs/inode.c @@ -680,7 +680,6 @@ static const struct file_operations hfs_file_operations = { .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, - .splice_read = generic_file_splice_read, .fsync = hfs_file_fsync, .open = hfs_file_open, .release = hfs_file_release, diff --git a/fs/hfsplus/inode.c b/fs/hfsplus/inode.c index e8638d528195..d028d32f1c5f 100644 --- a/fs/hfsplus/inode.c +++ b/fs/hfsplus/inode.c @@ -346,7 +346,6 @@ static const struct file_operations hfsplus_file_operations = { .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, - .splice_read = generic_file_splice_read, .fsync = hfsplus_file_fsync, .open = hfsplus_file_open, .release = hfsplus_file_release, diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index e61261a7417e..c0f5ba4f835f 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -387,7 +387,6 @@ static int hostfs_fsync(struct file *file, loff_t start, loff_t end, static const struct file_operations hostfs_file_fops = { .llseek = generic_file_llseek, - .splice_read = generic_file_splice_read, .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index b3be1b5a62e2..474933a15e28 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c @@ -212,7 +212,6 @@ const struct file_operations hpfs_file_ops = .mmap = generic_file_mmap, .release = hpfs_file_release, .fsync = hpfs_file_fsync, - .splice_read = generic_file_splice_read, .unlocked_ioctl = hpfs_ioctl, }; diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c index c12476e309c6..843918d2204b 100644 --- a/fs/jffs2/file.c +++ b/fs/jffs2/file.c @@ -56,7 +56,6 @@ const struct file_operations jffs2_file_operations = .unlocked_ioctl=jffs2_ioctl, .mmap = generic_file_readonly_mmap, .fsync = jffs2_fsync, - .splice_read = generic_file_splice_read, }; /* jffs2_file_inode_operations */ diff --git a/fs/jfs/file.c b/fs/jfs/file.c index 739492c7a3fd..91d2c46c0a3e 100644 --- a/fs/jfs/file.c +++ b/fs/jfs/file.c @@ -154,8 +154,6 @@ const struct file_operations jfs_file_operations = { .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .fsync = jfs_fsync, .release = jfs_release, .unlocked_ioctl = jfs_ioctl, diff --git a/fs/minix/file.c b/fs/minix/file.c index a6a4797aa0d4..340bbe384985 100644 --- a/fs/minix/file.c +++ b/fs/minix/file.c @@ -18,7 +18,6 @@ const struct file_operations minix_file_operations = { .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, .fsync = generic_file_fsync, - .splice_read = generic_file_splice_read, }; static int minix_setattr(struct dentry *dentry, struct iattr *attr) diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 5713eb32a45e..e262b0b4f03c 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -852,8 +852,6 @@ const struct file_operations nfs_file_operations = { .fsync = nfs_file_fsync, .lock = nfs_lock, .flock = nfs_flock, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .check_flags = nfs_check_flags, .setlease = simple_nosetlease, }; diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c index 0efba77789b9..91688552295c 100644 --- a/fs/nfs/nfs4file.c +++ b/fs/nfs/nfs4file.c @@ -248,8 +248,6 @@ const struct file_operations nfs4_file_operations = { .fsync = nfs_file_fsync, .lock = nfs_lock, .flock = nfs_flock, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .check_flags = nfs_check_flags, .setlease = simple_nosetlease, #ifdef CONFIG_NFS_V4_2 diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 26780d53a6f9..c780ce2bdf47 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -3579,7 +3579,7 @@ nfsd4_encode_read(struct nfsd4_compoundres *resp, __be32 nfserr, if (read->rd_tmp_file) ra = nfsd_init_raparms(file); - if (file->f_op->splice_read && + if ((file->f_op->read_iter || file->f_op->splice_read) && test_bit(RQ_SPLICE_OK, &resp->rqstp->rq_flags)) nfserr = nfsd4_encode_splice_read(resp, read, file, maxcount); else diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 0d19ab1b9404..c23b3adbcff2 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1032,7 +1032,8 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp, trace_read_opened(rqstp, fhp, offset, vlen); - if (file->f_op->splice_read && test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) + if ((file->f_op->read_iter || file->f_op->splice_read) && + test_bit(RQ_SPLICE_OK, &rqstp->rq_flags)) err = nfsd_splice_read(rqstp, file, offset, count); else err = nfsd_readv(file, offset, vec, vlen, count); diff --git a/fs/nilfs2/file.c b/fs/nilfs2/file.c index c5fa3dee72fc..e9a5507f9e70 100644 --- a/fs/nilfs2/file.c +++ b/fs/nilfs2/file.c @@ -149,7 +149,6 @@ const struct file_operations nilfs_file_operations = { .open = generic_file_open, /* .release = nilfs_release_file, */ .fsync = nilfs_sync_file, - .splice_read = generic_file_splice_read, }; const struct inode_operations nilfs_file_inode_operations = { diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c index c4f68c338735..3f842b9d7c67 100644 --- a/fs/ntfs/file.c +++ b/fs/ntfs/file.c @@ -2026,7 +2026,6 @@ const struct file_operations ntfs_file_ops = { #endif /* NTFS_RW */ .mmap = generic_file_mmap, .open = ntfs_file_open, - .splice_read = generic_file_splice_read, }; const struct inode_operations ntfs_file_inode_ops = { diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index bfeb647459d9..a0cdb8bfdf32 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2531,8 +2531,6 @@ const struct file_operations ocfs2_fops = { #endif .lock = ocfs2_lock, .flock = ocfs2_flock, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .fallocate = ocfs2_fallocate, .clone_file_range = ocfs2_file_clone_range, .dedupe_file_range = ocfs2_file_dedupe_range, @@ -2578,8 +2576,6 @@ const struct file_operations ocfs2_fops_no_plocks = { .compat_ioctl = ocfs2_compat_ioctl, #endif .flock = ocfs2_flock, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .fallocate = ocfs2_fallocate, .clone_file_range = ocfs2_file_clone_range, .dedupe_file_range = ocfs2_file_dedupe_range, diff --git a/fs/omfs/file.c b/fs/omfs/file.c index bf83e6644333..b67118bf1275 100644 --- a/fs/omfs/file.c +++ b/fs/omfs/file.c @@ -341,7 +341,6 @@ const struct file_operations omfs_file_operations = { .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, .fsync = generic_file_fsync, - .splice_read = generic_file_splice_read, }; static int omfs_setattr(struct dentry *dentry, struct iattr *attr) diff --git a/fs/ramfs/file-mmu.c b/fs/ramfs/file-mmu.c index 12af0490322f..6c74136579d6 100644 --- a/fs/ramfs/file-mmu.c +++ b/fs/ramfs/file-mmu.c @@ -43,8 +43,6 @@ const struct file_operations ramfs_file_operations = { .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, .fsync = noop_fsync, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .llseek = generic_file_llseek, .get_unmapped_area = ramfs_mmu_get_unmapped_area, }; diff --git a/fs/ramfs/file-nommu.c b/fs/ramfs/file-nommu.c index 2ef7ce75c062..59cdce5bb7f7 100644 --- a/fs/ramfs/file-nommu.c +++ b/fs/ramfs/file-nommu.c @@ -47,8 +47,6 @@ const struct file_operations ramfs_file_operations = { .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, .fsync = noop_fsync, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .llseek = generic_file_llseek, }; diff --git a/fs/read_write.c b/fs/read_write.c index acfd3dc63d57..3d76e5bff62d 100644 --- a/fs/read_write.c +++ b/fs/read_write.c @@ -28,7 +28,6 @@ const struct file_operations generic_ro_fops = { .llseek = generic_file_llseek, .read_iter = generic_file_read_iter, .mmap = generic_file_readonly_mmap, - .splice_read = generic_file_splice_read, }; EXPORT_SYMBOL(generic_ro_fops); diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c index b396eb09f288..86dd17fced0b 100644 --- a/fs/reiserfs/file.c +++ b/fs/reiserfs/file.c @@ -253,8 +253,6 @@ const struct file_operations reiserfs_file_operations = { .fsync = reiserfs_sync_file, .read_iter = generic_file_read_iter, .write_iter = generic_file_write_iter, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .llseek = generic_file_llseek, }; diff --git a/fs/romfs/mmap-nommu.c b/fs/romfs/mmap-nommu.c index 1118a0dc6b45..3eb5014068dc 100644 --- a/fs/romfs/mmap-nommu.c +++ b/fs/romfs/mmap-nommu.c @@ -82,7 +82,6 @@ static unsigned romfs_mmap_capabilities(struct file *file) const struct file_operations romfs_ro_fops = { .llseek = generic_file_llseek, .read_iter = generic_file_read_iter, - .splice_read = generic_file_splice_read, .mmap = romfs_mmap, .get_unmapped_area = romfs_get_unmapped_area, .mmap_capabilities = romfs_mmap_capabilities, diff --git a/fs/splice.c b/fs/splice.c index ae41201d0325..ecf8d6edbb30 100644 --- a/fs/splice.c +++ b/fs/splice.c @@ -280,7 +280,7 @@ void splice_shrink_spd(struct splice_pipe_desc *spd) } /** - * generic_file_splice_read - splice data from file to a pipe + * iter_file_splice_read - splice data from file to a pipe * @in: file to splice from * @ppos: position in @in * @pipe: pipe to splice to @@ -292,7 +292,7 @@ void splice_shrink_spd(struct splice_pipe_desc *spd) * used as long as it has more or less sane ->read_iter(). * */ -ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, +static ssize_t iter_file_splice_read(struct file *in, loff_t *ppos, struct pipe_inode_info *pipe, size_t len, unsigned int flags) { @@ -322,7 +322,6 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos, return ret; } -EXPORT_SYMBOL(generic_file_splice_read); const struct pipe_buf_operations default_pipe_buf_ops = { .can_merge = 0, @@ -861,6 +860,8 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out, if (out->f_op->splice_write) splice_write = out->f_op->splice_write; + else if (out->f_op->write_iter) + splice_write = iter_file_splice_write; else splice_write = default_file_splice_write; @@ -890,6 +891,8 @@ static long do_splice_to(struct file *in, loff_t *ppos, if (in->f_op->splice_read) splice_read = in->f_op->splice_read; + else if (in->f_op->read_iter) + splice_read = iter_file_splice_read; else splice_read = default_file_splice_read; diff --git a/fs/sysv/file.c b/fs/sysv/file.c index 7ba997e31aeb..74a63fb0461e 100644 --- a/fs/sysv/file.c +++ b/fs/sysv/file.c @@ -25,7 +25,6 @@ const struct file_operations sysv_file_operations = { .write_iter = generic_file_write_iter, .mmap = generic_file_mmap, .fsync = generic_file_fsync, - .splice_read = generic_file_splice_read, }; static int sysv_setattr(struct dentry *dentry, struct iattr *attr) diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c index 2cda3d67e2d0..ba349d17cf15 100644 --- a/fs/ubifs/file.c +++ b/fs/ubifs/file.c @@ -1748,8 +1748,6 @@ const struct file_operations ubifs_file_operations = { .mmap = ubifs_file_mmap, .fsync = ubifs_fsync, .unlocked_ioctl = ubifs_ioctl, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .open = ubifs_file_open, #ifdef CONFIG_COMPAT .compat_ioctl = ubifs_compat_ioctl, diff --git a/fs/udf/file.c b/fs/udf/file.c index f5eb2d5b3bac..8eede44475be 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -244,7 +244,6 @@ const struct file_operations udf_file_operations = { .write_iter = udf_file_write_iter, .release = udf_release_file, .fsync = generic_file_fsync, - .splice_read = generic_file_splice_read, .llseek = generic_file_llseek, }; diff --git a/fs/ufs/file.c b/fs/ufs/file.c index 042ddbf110cc..28c45f4f2aae 100644 --- a/fs/ufs/file.c +++ b/fs/ufs/file.c @@ -40,5 +40,4 @@ const struct file_operations ufs_file_operations = { .mmap = generic_file_mmap, .open = generic_file_open, .fsync = generic_file_fsync, - .splice_read = generic_file_splice_read, }; diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 35703a801372..328d16bdfedb 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c @@ -1520,8 +1520,6 @@ const struct file_operations xfs_file_operations = { .llseek = xfs_file_llseek, .read_iter = xfs_file_read_iter, .write_iter = xfs_file_write_iter, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .unlocked_ioctl = xfs_file_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = xfs_file_compat_ioctl, diff --git a/include/linux/fs.h b/include/linux/fs.h index c67f1f8ee789..17955f196ad5 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2802,8 +2802,6 @@ extern int blkdev_fsync(struct file *filp, loff_t start, loff_t end, extern void block_sync_page(struct page *page); /* fs/splice.c */ -extern ssize_t generic_file_splice_read(struct file *, loff_t *, - struct pipe_inode_info *, size_t, unsigned int); extern ssize_t iter_file_splice_write(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe, diff --git a/mm/shmem.c b/mm/shmem.c index e67d6ba4e98e..ba37addf6c87 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -3843,8 +3843,6 @@ static const struct file_operations shmem_file_operations = { .read_iter = shmem_file_read_iter, .write_iter = generic_file_write_iter, .fsync = noop_fsync, - .splice_read = generic_file_splice_read, - .splice_write = iter_file_splice_write, .fallocate = shmem_fallocate, #endif };
If a file_operations instance has the read or write iter methods we should use the iter based splice code by default. We still allow to overide it with explicit ->read_iter and ->write_iter methods, but few of them are left, and there is a non-zero chance that we could get rid of them in the future. Signed-off-by: Christoph Hellwig <hch@lst.de> --- drivers/staging/lustre/lustre/llite/file.c | 3 --- fs/adfs/file.c | 1 - fs/affs/file.c | 1 - fs/afs/file.c | 1 - fs/bfs/file.c | 1 - fs/block_dev.c | 2 -- fs/btrfs/file.c | 1 - fs/ceph/file.c | 2 -- fs/cifs/cifsfs.c | 6 ------ fs/coda/file.c | 1 - fs/ecryptfs/file.c | 1 - fs/exofs/file.c | 2 -- fs/ext2/file.c | 2 -- fs/ext4/file.c | 2 -- fs/f2fs/file.c | 2 -- fs/fat/file.c | 1 - fs/fuse/file.c | 1 - fs/gfs2/file.c | 2 -- fs/hfs/inode.c | 1 - fs/hfsplus/inode.c | 1 - fs/hostfs/hostfs_kern.c | 1 - fs/hpfs/file.c | 1 - fs/jffs2/file.c | 1 - fs/jfs/file.c | 2 -- fs/minix/file.c | 1 - fs/nfs/file.c | 2 -- fs/nfs/nfs4file.c | 2 -- fs/nfsd/nfs4xdr.c | 2 +- fs/nfsd/vfs.c | 3 ++- fs/nilfs2/file.c | 1 - fs/ntfs/file.c | 1 - fs/ocfs2/file.c | 4 ---- fs/omfs/file.c | 1 - fs/ramfs/file-mmu.c | 2 -- fs/ramfs/file-nommu.c | 2 -- fs/read_write.c | 1 - fs/reiserfs/file.c | 2 -- fs/romfs/mmap-nommu.c | 1 - fs/splice.c | 9 ++++++--- fs/sysv/file.c | 1 - fs/ubifs/file.c | 2 -- fs/udf/file.c | 1 - fs/ufs/file.c | 1 - fs/xfs/xfs_file.c | 2 -- include/linux/fs.h | 2 -- mm/shmem.c | 2 -- 46 files changed, 9 insertions(+), 75 deletions(-)