git: e4b7bbd6ab77 - main - lio_listio(2): add LIO_FOFFSET flag to ignore aiocb aio_offset
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 11 Feb 2024 01:54:36 UTC
The branch main has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=e4b7bbd6ab77e908a60362aa29e518f224a117b0
commit e4b7bbd6ab77e908a60362aa29e518f224a117b0
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2024-01-13 19:46:18 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-02-11 01:53:50 +0000
lio_listio(2): add LIO_FOFFSET flag to ignore aiocb aio_offset
and use the current file offset instead.
Requested by: VinÃcius dos Santos Oliveira <vini.ipsmaker@gmail.com>
Reviewed by: jhb
Discussed with: asomers
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Differential revision: https://reviews.freebsd.org/D43448
---
lib/libsys/lio_listio.2 | 15 ++++++++++++++-
sys/kern/vfs_aio.c | 17 ++++++++++++-----
sys/sys/aio.h | 4 ++++
3 files changed, 30 insertions(+), 6 deletions(-)
diff --git a/lib/libsys/lio_listio.2 b/lib/libsys/lio_listio.2
index 34d2490cca01..bda65c38b1ac 100644
--- 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 @@ Write data as if by a call to
.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
index 1195d92d54ab..e7302f4b7a9e 100644
--- a/sys/kern/vfs_aio.c
+++ b/sys/kern/vfs_aio.c
@@ -229,6 +229,9 @@ typedef struct oaiocb {
#define KAIOCB_CLEARED 0x10
#define KAIOCB_FINISHED 0x20
+/* ioflags */
+#define KAIOCB_IO_FOFFSET 0x01
+
/*
* AIO process info
*/
@@ -789,12 +792,14 @@ aio_process_rw(struct kaiocb *job)
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 @@ aio_aqueue(struct thread *td, struct aiocb *ujob, struct aioliojob *lj,
/* 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
index a1aa96efed09..f987f1e1dbd4 100644
--- a/sys/sys/aio.h
+++ b/sys/sys/aio.h
@@ -51,6 +51,9 @@
#define LIO_DSYNC (0x10 | LIO_SYNC)
#define LIO_MLOCK 0x20
#endif
+#if __BSD_VISIBLE
+#define LIO_FOFFSET 0x40
+#endif
/*
* LIO modes
@@ -129,6 +132,7 @@ struct kaiocb {
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 */