On Mon, Jul 10, 2023 at 12:33:07AM +0200, Ahelenia Ziemiańska wrote: > On Sun, Jul 09, 2023 at 03:03:22AM +0200, Ahelenia Ziemiańska wrote: > > On Sat, Jul 08, 2023 at 01:06:56PM -0700, Linus Torvalds wrote: > > > I guess combined with something like > > > > > > if (!(in->f_mode & FMODE_NOWAIT)) > > > return -EINVAL; > > > > > > it might all work. > > Yes, that makes the splice instantly -EINVAL for ttys, but doesn't > > affect the socketpair() case above, which still blocks forever. > This also triggers for regular file -> pipe splices, > which is probably a no-go. Actually, that's only the case for regular files on some filesystems? I originally tested on tmpfs, and now on vfat, ramfs, procfs, and sysfs, and none have FMODE_NOWAIT set. Conversely, ext4 and XFS files both have FMODE_NOWAIT set, and behave like blockdevs incl. the filemap_splice_read() oddities below. Indeed, it looks like Some filesystems (btrfs/ext4/f2fs/ocfs2/xfs, blockdevs, /dev/{null,zero,random,urandom}, pipes, tun/tap) set FMODE_NOWAIT, but that's by far not All of them, so maybe /* File is capable of returning -EAGAIN if I/O will block */ is not the right check for regular files. > filemap_get_pages() does use and inspect IOCB_NOWAIT if set in > filemap_splice_read(), but it appears to not really make much sense, > inasmuch it returns EAGAIN for the first splice() from a > blockdev and then instantly return with data on the next go-around. Indeed, this is inconsistent to both: * readv2(off=-1, RWF_NOWAIT), which always returns EAGAIN, and * fcntl(0, F_SETFL, O_NONBLOCK), read(), which always reads. Thus, > This doesn't really make much sense ‒ and open(2) says blockdevs > don't have O_NONBLOCK semantics, so I'm assuming this is not supposed > to be exposed to userspace ‒ so I'm not setting it in the diff. not specifying IOCB_NOWAIT in filemap_splice_read() provides consistent semantics to "file is read as-if it had O_NONBLOCK set". I've tentatively updated the check to if (!((in->f_mode & FMODE_NOWAIT) || S_ISREG(in->f_inode->i_mode))) (with the reasoning, as previously, that regular files don't /have/ a distinct O_NONBLOCK mode, because they always behave non-blockingly) and with that > I've tested this for: * regular file: works as expected
Attachment:
signature.asc
Description: PGP signature