libc: add aio_read2() and aio_write2() functions

as wrappers around lio_listio(LIO_READ/WRITE | LIO_FOFFSET, &iocb, 1);

Suggested and reviewed by:	jhb
Discussed with:	asomers
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differrential revision:	https://reviews.freebsd.org/D43448
This commit is contained in:
Konstantin Belousov 2024-02-01 04:39:00 +02:00
parent e4b7bbd6ab
commit 06cb1c3f95
5 changed files with 123 additions and 0 deletions

View file

@ -13,6 +13,8 @@ SRCS+= \
_rand48.c \
_spinlock_stub.c \
_thread_init.c \
aio_read2.c \
aio_write2.c \
alarm.c \
arc4random.c \
arc4random-compat.c \

View file

@ -455,6 +455,8 @@ FBSD_1.7 {
};
FBSD_1.8 {
aio_read2;
aio_write2;
execvpe;
};

56
lib/libc/gen/aio_read2.c Normal file
View file

@ -0,0 +1,56 @@
/*-
* 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)) != 0) {
errno = EINVAL;
return (-1);
}
iocb->aio_lio_opcode = LIO_READ;
if ((flags & AIO_OP2_FOFFSET) != 0)
iocb->aio_lio_opcode |= LIO_FOFFSET;
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);
}

56
lib/libc/gen/aio_write2.c Normal file
View file

@ -0,0 +1,56 @@
/*-
* 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)) != 0) {
errno = EINVAL;
return (-1);
}
iocb->aio_lio_opcode = LIO_WRITE;
if ((flags & AIO_OP2_FOFFSET) != 0)
iocb->aio_lio_opcode |= LIO_FOFFSET;
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);
}

View file

@ -55,6 +55,11 @@
#define LIO_FOFFSET 0x40
#endif
/* aio_read2/aio_write2 flags */
#if __BSD_VISIBLE
#define AIO_OP2_FOFFSET 0x00000001
#endif
/*
* LIO modes
*/
@ -275,6 +280,8 @@ int aio_mlock(struct aiocb *);
#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);