git: 4231b825ac19 - main - linux(4): Add a dedicated writev syscall wrapper
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 20 Aug 2023 07:37:48 UTC
The branch main has been updated by dchagin:
URL: https://cgit.FreeBSD.org/src/commit/?id=4231b825ac19112b84b4001625e0ef7a80e82f80
commit 4231b825ac19112b84b4001625e0ef7a80e82f80
Author: Dmitry Chagin <dchagin@FreeBSD.org>
AuthorDate: 2023-08-20 07:36:31 +0000
Commit: Dmitry Chagin <dchagin@FreeBSD.org>
CommitDate: 2023-08-20 07:36:31 +0000
linux(4): Add a dedicated writev syscall wrapper
Adding a writev syscall wrapper is needed due to Linux family of write
syscalls doesn't distinguish between in kernel blocking operations
and always returns EAGAIN while FreeBSD can return ENOBUFS.
MFC after: 1 month
---
sys/amd64/linux32/linux32_machdep.c | 14 --------------
sys/compat/linux/linux_file.c | 19 +++++++++++++++++++
2 files changed, 19 insertions(+), 14 deletions(-)
diff --git a/sys/amd64/linux32/linux32_machdep.c b/sys/amd64/linux32/linux32_machdep.c
index 2598384aada5..ac8234503bdd 100644
--- a/sys/amd64/linux32/linux32_machdep.c
+++ b/sys/amd64/linux32/linux32_machdep.c
@@ -196,20 +196,6 @@ linux_readv(struct thread *td, struct linux_readv_args *uap)
return (error);
}
-int
-linux_writev(struct thread *td, struct linux_writev_args *uap)
-{
- struct uio *auio;
- int error;
-
- error = linux32_copyinuio(uap->iovp, uap->iovcnt, &auio);
- if (error)
- return (error);
- error = kern_writev(td, uap->fd, auio);
- free(auio, M_IOV);
- return (error);
-}
-
struct l_ipc_kludge {
l_uintptr_t msgp;
l_long msgtyp;
diff --git a/sys/compat/linux/linux_file.c b/sys/compat/linux/linux_file.c
index 6a1f61984b08..27b6e1a5f77d 100644
--- a/sys/compat/linux/linux_file.c
+++ b/sys/compat/linux/linux_file.c
@@ -47,6 +47,7 @@
#ifdef COMPAT_LINUX32
#include <compat/freebsd32/freebsd32_misc.h>
+#include <compat/freebsd32/freebsd32_util.h>
#include <machine/../linux32/linux.h>
#include <machine/../linux32/linux32_proto.h>
#else
@@ -1855,3 +1856,21 @@ linux_write(struct thread *td, struct linux_write_args *args)
return (linux_enobufs2eagain(td, args->fd, sys_write(td, &bargs)));
}
+
+int
+linux_writev(struct thread *td, struct linux_writev_args *args)
+{
+ struct uio *auio;
+ int error;
+
+#ifdef COMPAT_LINUX32
+ error = freebsd32_copyinuio(PTRIN(args->iovp), args->iovcnt, &auio);
+#else
+ error = copyinuio(args->iovp, args->iovcnt, &auio);
+#endif
+ if (error != 0)
+ return (error);
+ error = kern_writev(td, args->fd, auio);
+ free(auio, M_IOV);
+ return (linux_enobufs2eagain(td, args->fd, error));
+}