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@xxxxxx> > --- > 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@xxxxxxxxxx>