Index: lib/libc/sys/aio_fsync.2 =================================================================== --- lib/libc/sys/aio_fsync.2 +++ lib/libc/sys/aio_fsync.2 @@ -107,10 +107,10 @@ The asynchronous notification method in .Fa iocb->aio_sigevent.sigev_notify is invalid or not supported. -.It Bq Er ENOSYS -The -.Fn aio_fsync -system call is not supported. +.It Bq Er EOPNOTSUPP +Asynchronous file synchronization operations on the file descriptor +.Fa iocb->aio_fildes +are unsafe and unsafe asynchronous I/O operations are disabled. .It Bq Er EINVAL A value of the .Fa op Index: lib/libc/sys/aio_mlock.2 =================================================================== --- lib/libc/sys/aio_mlock.2 +++ lib/libc/sys/aio_mlock.2 @@ -102,10 +102,6 @@ The asynchronous notification method in .Fa iocb->aio_sigevent.sigev_notify is invalid or not supported. -.It Bq Er ENOSYS -The -.Fn aio_mlock -system call is not supported. .El .Pp If the request is successfully enqueued, but subsequently cancelled Index: lib/libc/sys/aio_read.2 =================================================================== --- lib/libc/sys/aio_read.2 +++ lib/libc/sys/aio_read.2 @@ -125,10 +125,10 @@ The asynchronous notification method in .Fa iocb->aio_sigevent.sigev_notify is invalid or not supported. -.It Bq Er ENOSYS -The -.Fn aio_read -system call is not supported. +.It Bq Er EOPNOTSUPP +Asynchronous read operations on the file descriptor +.Fa iocb->aio_fildes +are unsafe and unsafe asynchronous I/O operations are disabled. .El .Pp The following conditions may be synchronously detected when the Index: lib/libc/sys/aio_write.2 =================================================================== --- lib/libc/sys/aio_write.2 +++ lib/libc/sys/aio_write.2 @@ -129,10 +129,10 @@ The asynchronous notification method in .Fa iocb->aio_sigevent.sigev_notify is invalid or not supported. -.It Bq Er ENOSYS -The -.Fn aio_write -system call is not supported. +.It Bq Er EOPNOTSUPP +Asynchronous write operations on the file descriptor +.Fa iocb->aio_fildes +are unsafe and unsafe asynchronous I/O operations are disabled. .El .Pp The following conditions may be synchronously detected when the Index: share/man/man4/aio.4 =================================================================== --- share/man/man4/aio.4 +++ share/man/man4/aio.4 @@ -37,17 +37,25 @@ The .Nm facility provides system calls for asynchronous I/O. -However, asynchronous I/O operations are only enabled for certain file -types by default. -Asynchronous I/O operations for other file types may block an AIO daemon -indefinitely resulting in process and/or system hangs. -Asynchronous I/O operations can be enabled for all file types by setting +Asynchronous I/O operations are not completed synchronously by the +calling thread. +Instead, the calling thread invokes one system call to request an +asynchronous I/O operation. +The status of a completed request is retrieved later via a separate +system call. +.Pp +Asynchronous I/O operations on some file descriptor types may block an +AIO daemon indefinitely resulting in process and/or system hangs. +Operations on these file descriptor types are considered +.Dq unsafe +and disabled by default. +They can be enabled by setting the .Va vfs.aio.enable_unsafe sysctl node to a non-zero value. .Pp Asynchronous I/O operations on sockets and raw disk devices do not block -indefinitely and are enabled by default. +indefinitely and are always enabled. .Pp The .Nm Index: sys/kern/vfs_aio.c =================================================================== --- sys/kern/vfs_aio.c +++ sys/kern/vfs_aio.c @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -110,6 +111,11 @@ SYSCTL_INT(_vfs_aio, OID_AUTO, enable_unsafe, CTLFLAG_RW, &enable_aio_unsafe, 0, "Permit asynchronous IO on all file types, not just known-safe types"); +static unsigned int unsafe_warningcnt = 1; +SYSCTL_UINT(_vfs_aio, OID_AUTO, unsafe_warningcnt, CTLFLAG_RW, + &unsafe_warningcnt, 0, + "Warnings that will be triggered upon failed IO requests on unsafe files"); + static int max_aio_procs = MAX_AIO_PROCS; SYSCTL_INT(_vfs_aio, OID_AUTO, max_aio_procs, CTLFLAG_RW, &max_aio_procs, 0, "Maximum number of kernel processes to use for handling async IO "); @@ -1685,8 +1691,16 @@ goto done; #endif queueit: - if (!enable_aio_unsafe) + if (!enable_aio_unsafe) { + if (unsafe_warningcnt > 0) { + unsafe_warningcnt--; + log(LOG_INFO, + "pid %d (%s) is attempting to use unsafe AIO requests%s\n", + curproc->p_pid, curproc->p_comm, + unsafe_warningcnt ? "" : " - not logging anymore"); + } return (EOPNOTSUPP); + } if (opcode == LIO_SYNC) { AIO_LOCK(ki);