Page MenuHomeFreeBSD

D43448.diff
No OneTemporary

D43448.diff

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,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 @@
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 */

File Metadata

Mime Type
text/plain
Expires
Mon, Jan 26, 12:35 AM (14 h, 36 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27984360
Default Alt Text
D43448.diff (2 KB)

Event Timeline