Created attachment 232438 [details] Patch to add a fallback to Linuxulator sendfile to support any FDs In Linux < 2.6.33, sendfile could only be used to send from a file to a socket. This is the behaviour implemented by the FreeBSD Linuxulator. However, since 2.6.33, sendfile can send from any FD to any other FD, which is not implemented by FreeBSD sendfile or by the Linuxulator. I ran into this problem trying to run the game "Factorio" using the Linuxulator, which relies on sendfile to copy files on disk. Here is another thread on freebsd-emulation describing the same problem: https://www.mail-archive.com/freebsd-emulation@freebsd.org/msg11340.html Attached is a patch which changes the Linuxulator sendfile such that it will use FreeBSD sendfile where possible, but otherwise fallback on a simple read/write loop for compatibility. I would very much appreciate some feedback on the patch, as I have never contributed to the FreeBSD kernel before. In particular, any suggestion for a better way to choose the buffer size than the arbitrary 8 KB I have hardcoded would be welcome.
Patch also viewable as a PR on GitHub: https://github.com/freebsd/freebsd-src/pull/590
I just hit the same issue with the Microchip Libero FPGA software. Will attempt to triage the patch.
A commit in branch main references this bug: URL: https://cgit.FreeBSD.org/src/commit/?id=bb66c59753836cd8abb596fe316dcdb77ea66999 commit bb66c59753836cd8abb596fe316dcdb77ea66999 Author: James McLaughlin <james_mclgh.net> AuthorDate: 2023-08-17 19:57:17 +0000 Commit: Dmitry Chagin <dchagin@FreeBSD.org> CommitDate: 2023-08-17 19:57:17 +0000 linux(4): Add sendfile fallback for non-socket fds Before Linux 2.6.33, out_fd must refer to a socket. Since Linux 2.6.33 it can be any file. The patch was originally provided by James McLaughlin and adapted by me for copy_file_range. PR: 262535 Differential revision: https://reviews.freebsd.org/D34555 MFC after: 1 month sys/compat/linux/linux_socket.c | 209 ++++++++++++++++++++++++++++++++++------ 1 file changed, 177 insertions(+), 32 deletions(-)
James, Nathan, are you tried latest main or releng/14.0?
Done, 10x