Page MenuHomeFreeBSD

D43448.id133903.diff
No OneTemporary

D43448.id133903.diff

diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -13,6 +13,8 @@
_rand48.c \
_spinlock_stub.c \
_thread_init.c \
+ aio_read2.c \
+ aio_write2.c \
alarm.c \
arc4random.c \
arc4random-compat.c \
diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map
--- a/lib/libc/gen/Symbol.map
+++ b/lib/libc/gen/Symbol.map
@@ -455,6 +455,8 @@
};
FBSD_1.8 {
+ aio_read2;
+ aio_write2;
execvpe;
};
diff --git a/lib/libc/gen/aio_read2.c b/lib/libc/gen/aio_read2.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/gen/aio_read2.c
@@ -0,0 +1,58 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 The FreeBSD Foundation
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/aio.h>
+#include <errno.h>
+#include <stddef.h>
+
+int
+aio_read2(struct aiocb *iocb, int flags)
+{
+ int error;
+
+ if ((flags & ~(AIO_OP2_FOFFSET | AIO_OP2_VECTORED)) != 0) {
+ errno = EINVAL;
+ return (-1);
+ }
+ iocb->aio_lio_opcode = LIO_READ;
+ if ((flags & AIO_OP2_FOFFSET) != 0)
+ iocb->aio_lio_opcode |= LIO_FOFFSET;
+ if ((flags & AIO_OP2_VECTORED) != 0)
+ iocb->aio_lio_opcode |= LIO_VECTORED;
+
+ error = lio_listio(LIO_NOWAIT, &iocb, 1, NULL);
+ if (error == -1 && errno == EIO) {
+ error = aio_error(iocb);
+ if (error != -1 && error != 0)
+ errno = error;
+ error = -1;
+ }
+ return (error);
+}
diff --git a/lib/libc/gen/aio_write2.c b/lib/libc/gen/aio_write2.c
new file mode 100644
--- /dev/null
+++ b/lib/libc/gen/aio_write2.c
@@ -0,0 +1,58 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2024 The FreeBSD Foundation
+ *
+ * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/aio.h>
+#include <errno.h>
+#include <stddef.h>
+
+int
+aio_write2(struct aiocb *iocb, int flags)
+{
+ int error;
+
+ if ((flags & ~(AIO_OP2_FOFFSET | AIO_OP2_VECTORED)) != 0) {
+ errno = EINVAL;
+ return (-1);
+ }
+ iocb->aio_lio_opcode = LIO_WRITE;
+ if ((flags & AIO_OP2_FOFFSET) != 0)
+ iocb->aio_lio_opcode |= LIO_FOFFSET;
+ if ((flags & AIO_OP2_VECTORED) != 0)
+ iocb->aio_lio_opcode |= LIO_VECTORED;
+
+ error = lio_listio(LIO_NOWAIT, &iocb, 1, NULL);
+ if (error == -1 && errno == EIO) {
+ error = aio_error(iocb);
+ if (error != -1 && error != 0)
+ errno = error;
+ error = -1;
+ }
+ return (error);
+}
diff --git a/lib/libsys/Makefile.sys b/lib/libsys/Makefile.sys
--- a/lib/libsys/Makefile.sys
+++ b/lib/libsys/Makefile.sys
@@ -383,8 +383,10 @@
sleep.3 \
usleep.3
-MLINKS+=aio_read.2 aio_readv.2
-MLINKS+=aio_write.2 aio_writev.2
+MLINKS+=aio_read.2 aio_readv.2 \
+ aio_read.2 aio_read2.2
+MLINKS+=aio_write.2 aio_writev.2 \
+ aio_write.2 aio_write2.2
MLINKS+=accept.2 accept4.2
MLINKS+=access.2 eaccess.2 \
access.2 faccessat.2
diff --git a/lib/libsys/aio_read.2 b/lib/libsys/aio_read.2
--- a/lib/libsys/aio_read.2
+++ b/lib/libsys/aio_read.2
@@ -22,11 +22,12 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd November 15, 2023
+.Dd February 1, 2024
.Dt AIO_READ 2
.Os
.Sh NAME
.Nm aio_read ,
+.Nm aio_read2 ,
.Nm aio_readv
.Nd asynchronous read from a file (REALTIME)
.Sh LIBRARY
@@ -35,21 +36,34 @@
.In aio.h
.Ft int
.Fn aio_read "struct aiocb *iocb"
+.Ft int
+.Fn aio_read2 "struct aiocb *iocb" "int flags"
.In sys/uio.h
.Ft int
.Fn aio_readv "struct aiocb *iocb"
.Sh DESCRIPTION
The
-.Fn aio_read
+.Fn aio_read ,
+.Fn aio_read2
and
.Fn aio_readv
system calls allow the calling process to read
from the descriptor
-.Fa iocb->aio_fildes
-beginning at the offset
+.Fa iocb->aio_fildes .
+The syscalls return immediately after the read request has
+been enqueued to the descriptor; the read may or may not have
+completed at the time the call returns.
+.Pp
+For the
+.Fn aio_read
+and
+.Fn aio_readv
+calls, the read begins at the offset
.Fa iocb->aio_offset .
+.Pp
+The
.Fn aio_read
-will read
+call will read
.Fa iocb->aio_nbytes
into the buffer pointed to by
.Fa iocb->aio_buf ,
@@ -60,10 +74,6 @@
buffers specified by the members of the
.Fa iocb->aio_iov
array.
-Both syscalls return immediately after the read request has
-been enqueued to the descriptor; the read may or may not have
-completed at the time the call returns.
-.Pp
For
.Fn aio_readv
the
@@ -72,6 +82,33 @@
.Xr readv 2 .
.Pp
The
+.Fn aio_read2
+call takes the
+.Fa flags
+argument.
+If
+.Fa flags
+is passed as zero, the call behaves identically to
+.Fn aio_read .
+The following flags can be specified by logical or:
+.Bl -tag -width AIO_OP2_VECTORED
+.It AIO_OP2_FOFFSET
+The read occurs at the file descriptor offset,
+which is advanced by the operation as done by the
+.Xr read 2
+syscall.
+The
+.Fa iocb->aio_offset
+field is ignored.
+.It AIO_OP2_VECTORED
+Similar to
+.Fn aio_readv ,
+the read buffers are specified by the
+.Fa aiocb->aio_iov
+array.
+.El
+.Pp
+The
.Fa iocb
pointer may be subsequently used as an argument to
.Fn aio_return
@@ -103,9 +140,8 @@
.Pp
The asynchronous I/O control buffer
.Fa iocb
-should be zeroed before the
-.Fn aio_read
-call to avoid passing bogus context information to the kernel.
+should be zeroed before the system
+calls to avoid passing bogus context information to the kernel.
.Pp
Modifications of the Asynchronous I/O Control Block structure or the
buffer contents are not allowed while the request is queued.
@@ -116,12 +152,13 @@
.Fa iocb->aio_fildes ,
no I/O will occur.
.Sh RETURN VALUES
-.Rv -std aio_read aio_readv
+.Rv -std aio_read aio_read2 aio_readv
.Sh DIAGNOSTICS
None.
.Sh ERRORS
The
-.Fn aio_read
+.Fn aio_read ,
+.Fn aio_read2 ,
and
.Fn aio_readv
system calls will fail if:
@@ -149,10 +186,7 @@
system call is made, or asynchronously, at any time thereafter.
If they
are detected at call time,
-.Fn aio_read
-or
-.Fn aio_readv
-returns -1 and sets
+The calls return -1 and set
.Va errno
appropriately; otherwise the
.Fn aio_return
@@ -226,8 +260,11 @@
.St -p1003.1
standard.
The
+.Fn aio_read2
+and
.Fn aio_readv
-system call is a FreeBSD extension, and should not be used in portable code.
+system calls are FreeBSD extensions,
+and should not be used in portable code.
.Sh HISTORY
The
.Fn aio_read
@@ -237,6 +274,10 @@
.Fn aio_readv
system call first appeared in
.Fx 13.0 .
+The
+.Fn aio_read2
+system call first appeared in
+.Fx 14.1 .
.Sh AUTHORS
This
manual page was written by
diff --git a/lib/libsys/aio_write.2 b/lib/libsys/aio_write.2
--- a/lib/libsys/aio_write.2
+++ b/lib/libsys/aio_write.2
@@ -22,11 +22,12 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd November 15, 2023
+.Dd February 1, 2024
.Dt AIO_WRITE 2
.Os
.Sh NAME
.Nm aio_write ,
+.Nm aio_write2 ,
.Nm aio_writev
.Nd asynchronous write to a file (REALTIME)
.Sh LIBRARY
@@ -35,19 +36,27 @@
.In aio.h
.Ft int
.Fn aio_write "struct aiocb *iocb"
+.Ft int
+.Fn aio_write2 "struct aiocb *iocb" "int flags"
.In sys/uio.h
.Ft int
.Fn aio_writev "struct aiocb *iocb"
.Sh DESCRIPTION
The
-.Fn aio_write
+.Fn aio_write ,
+.Fn aio_write2 ,
and
.Fn aio_writev
system calls allow the calling process to write
to the descriptor
.Fa iocb->aio_fildes .
+The syscalls return immediately after the write request has been enqueued
+to the descriptor; the write may or may not have completed at the time
+the call returns.
+.Pp
+The
.Fn aio_write
-will write
+call will write
.Fa iocb->aio_nbytes
from the buffer pointed to by
.Fa iocb->aio_buf ,
@@ -58,9 +67,7 @@
buffers specified by the members of the
.Fa iocb->aio_iov
array.
-Both syscalls return immediately after the write request has been enqueued
-to the descriptor; the write may or may not have completed at the time
-the call returns.
+.Pp
If the request could not be enqueued, generally due
to invalid arguments, the call returns without having enqueued the
request.
@@ -80,11 +87,42 @@
made.
If
.Dv O_APPEND
-is not set for the file descriptor, the write operation will occur at
+is not set for the file descriptor, the write operation for
+.Fn aio_write
+will occur at
the absolute position from the beginning of the file plus
.Fa iocb->aio_offset .
.Pp
The
+.Fn aio_write2
+call takes the
+.Fa flags
+argument.
+If
+.Fa flags
+is passed as zero, the call behaves identically to
+.Fn aio_write .
+The following flags can be specified by logical or:
+.Bl -tag -width AIO_OP2_VECTORED
+.It AIO_OP2_FOFFSET
+The write for non
+.Dv O_APPEND
+file descriptors occurs at the file descriptor offset,
+which is advanced by the operation as done by the
+.Xr write 2
+syscall.
+The
+.Fa iocb->aio_offset
+field is ignored.
+.It AIO_OP2_VECTORED
+Similar to
+.Fn aio_writev ,
+the write buffers are specified by the
+.Fa aiocb->aio_iov
+array.
+.El
+.Pp
+The
.Fa iocb
pointer may be subsequently used as an argument to
.Fn aio_return
@@ -114,10 +152,7 @@
The asynchronous I/O control buffer
.Fa iocb
should be zeroed before the
-.Fn aio_write
-or
-.Fn aio_writev
-system call to avoid passing bogus context information to the kernel.
+system calls to avoid passing bogus context information to the kernel.
.Pp
Modifications of the Asynchronous I/O Control Block structure or the
buffer contents are not allowed while the request is queued.
@@ -131,7 +166,8 @@
.Rv -std aio_write aio_writev
.Sh ERRORS
The
-.Fn aio_write
+.Fn aio_write ,
+.Fn aio_write2 ,
and
.Fn aio_writev
system calls will fail if:
@@ -153,16 +189,13 @@
.El
.Pp
The following conditions may be synchronously detected when the
-.Fn aio_write
+.Fn aio_write ,
+.Fn aio_write2 ,
or
.Fn aio_writev
system call is made, or asynchronously, at any time thereafter.
If they
-are detected at call time,
-.Fn aio_write
-or
-.Fn aio_writev
-returns -1 and sets
+are detected at call time, the calls return -1 and set
.Va errno
appropriately; otherwise the
.Fn aio_return
@@ -229,8 +262,11 @@
standard.
.Pp
The
+.Fn aio_write2
+and
.Fn aio_writev
-system call is a FreeBSD extension, and should not be used in portable code.
+system calls are FreeBSD extensions,
+and should not be used in portable code.
.Sh HISTORY
The
.Fn aio_write
@@ -240,6 +276,10 @@
.Fn aio_writev
system call first appeared in
.Fx 13.0 .
+The
+.Fn aio_write2
+system call first appeared in
+.Fx 14.1 .
.Sh AUTHORS
This manual page was written by
.An Wes Peters Aq Mt wes@softweyr.com .
diff --git a/lib/libsys/lio_listio.2 b/lib/libsys/lio_listio.2
--- a/lib/libsys/lio_listio.2
+++ b/lib/libsys/lio_listio.2
@@ -22,7 +22,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
-.Dd August 22, 2021
+.Dd January 13, 2024
.Dt LIO_LISTIO 2
.Os
.Sh NAME
@@ -78,6 +78,19 @@
.El
.Pp
If the
+.Dv LIO_READ ,
+.Dv LIO_READV ,
+.Dv LIO_WRITE ,
+.Dv LIO_WRITEV
+opcodes are or-ed with the
+.Dv LIO_FOFFSET
+flag, the corresponding read or write operation uses the current file
+descriptor offset instead of
+.Va aio_offset
+from
+.Vt aiocb .
+.Pp
+If the
.Fa mode
argument is
.Dv LIO_WAIT ,
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -229,6 +229,9 @@
#define KAIOCB_CLEARED 0x10
#define KAIOCB_FINISHED 0x20
+/* ioflags */
+#define KAIOCB_IO_FOFFSET 0x01
+
/*
* AIO process info
*/
@@ -789,12 +792,14 @@
if (job->uiop->uio_resid == 0)
error = 0;
else
- error = fo_read(fp, job->uiop, fp->f_cred, FOF_OFFSET,
- td);
+ error = fo_read(fp, job->uiop, fp->f_cred,
+ (job->ioflags & KAIOCB_IO_FOFFSET) != 0 ? 0 :
+ FOF_OFFSET, td);
} else {
if (fp->f_type == DTYPE_VNODE)
bwillwrite();
- error = fo_write(fp, job->uiop, fp->f_cred, FOF_OFFSET, td);
+ error = fo_write(fp, job->uiop, fp->f_cred, (job->ioflags &
+ KAIOCB_IO_FOFFSET) != 0 ? 0 : FOF_OFFSET, td);
}
msgrcv_end = td->td_ru.ru_msgrcv;
msgsnd_end = td->td_ru.ru_msgsnd;
@@ -1549,13 +1554,15 @@
/* Get the opcode. */
if (type == LIO_NOP) {
- switch (job->uaiocb.aio_lio_opcode) {
+ switch (job->uaiocb.aio_lio_opcode & ~LIO_FOFFSET) {
case LIO_WRITE:
case LIO_WRITEV:
case LIO_NOP:
case LIO_READ:
case LIO_READV:
- opcode = job->uaiocb.aio_lio_opcode;
+ opcode = job->uaiocb.aio_lio_opcode & ~LIO_FOFFSET;
+ if ((job->uaiocb.aio_lio_opcode & LIO_FOFFSET) != 0)
+ job->ioflags |= KAIOCB_IO_FOFFSET;
break;
default:
error = EINVAL;
diff --git a/sys/sys/aio.h b/sys/sys/aio.h
--- a/sys/sys/aio.h
+++ b/sys/sys/aio.h
@@ -51,6 +51,15 @@
#define LIO_DSYNC (0x10 | LIO_SYNC)
#define LIO_MLOCK 0x20
#endif
+#if __BSD_VISIBLE
+#define LIO_FOFFSET 0x40
+#endif
+
+/* aio_read2/aio_write2 flags */
+#if __BSD_VISIBLE
+#define AIO_OP2_FOFFSET 0x00000001
+#define AIO_OP2_VECTORED 0x00000002
+#endif
/*
* LIO modes
@@ -129,6 +138,7 @@
TAILQ_ENTRY(kaiocb) plist; /* (a) lists of pending / done jobs */
TAILQ_ENTRY(kaiocb) allist; /* (a) list of all jobs in proc */
int jobflags; /* (a) job flags */
+ int ioflags; /* (*) io flags */
int inblock; /* (*) input blocks */
int outblock; /* (*) output blocks */
int msgsnd; /* (*) messages sent */
@@ -271,6 +281,8 @@
#if __BSD_VISIBLE
ssize_t aio_waitcomplete(struct aiocb **, struct timespec *);
+int aio_read2(struct aiocb *, int);
+int aio_write2(struct aiocb *, int);
#endif
int aio_fsync(int op, struct aiocb *aiocbp);

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 6, 4:09 AM (13 h, 14 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16486590
Default Alt Text
D43448.id133903.diff (15 KB)

Event Timeline