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