git: e4b7bbd6ab77 - main - lio_listio(2): add LIO_FOFFSET flag to ignore aiocb aio_offset

From: Konstantin Belousov <kib_at_FreeBSD.org>
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 */