xref: /freebsd/lib/libc/gen/aio_write2.c (revision 8dfc788b8480a13f1f945f0a94d8b1e327af5c6f)
106cb1c3fSKonstantin Belousov /*-
206cb1c3fSKonstantin Belousov  * SPDX-License-Identifier: BSD-2-Clause
306cb1c3fSKonstantin Belousov  *
406cb1c3fSKonstantin Belousov  * Copyright (c) 2024 The FreeBSD Foundation
506cb1c3fSKonstantin Belousov  *
606cb1c3fSKonstantin Belousov  * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
706cb1c3fSKonstantin Belousov  * under sponsorship from the FreeBSD Foundation.
806cb1c3fSKonstantin Belousov  *
906cb1c3fSKonstantin Belousov  * Redistribution and use in source and binary forms, with or without
1006cb1c3fSKonstantin Belousov  * modification, are permitted provided that the following conditions
1106cb1c3fSKonstantin Belousov  * are met:
1206cb1c3fSKonstantin Belousov  * 1. Redistributions of source code must retain the above copyright
1306cb1c3fSKonstantin Belousov  *    notice, this list of conditions and the following disclaimer.
1406cb1c3fSKonstantin Belousov  * 2. Redistributions in binary form must reproduce the above copyright
1506cb1c3fSKonstantin Belousov  *    notice, this list of conditions and the following disclaimer in the
1606cb1c3fSKonstantin Belousov  *    documentation and/or other materials provided with the distribution.
1706cb1c3fSKonstantin Belousov  *
1806cb1c3fSKonstantin Belousov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1906cb1c3fSKonstantin Belousov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2006cb1c3fSKonstantin Belousov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2106cb1c3fSKonstantin Belousov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2206cb1c3fSKonstantin Belousov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2306cb1c3fSKonstantin Belousov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2406cb1c3fSKonstantin Belousov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2506cb1c3fSKonstantin Belousov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2606cb1c3fSKonstantin Belousov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2706cb1c3fSKonstantin Belousov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2806cb1c3fSKonstantin Belousov  * SUCH DAMAGE.
2906cb1c3fSKonstantin Belousov  */
3006cb1c3fSKonstantin Belousov 
3106cb1c3fSKonstantin Belousov #include <sys/aio.h>
3206cb1c3fSKonstantin Belousov #include <errno.h>
3306cb1c3fSKonstantin Belousov #include <stddef.h>
3406cb1c3fSKonstantin Belousov 
3506cb1c3fSKonstantin Belousov int
aio_write2(struct aiocb * iocb,int flags)3606cb1c3fSKonstantin Belousov aio_write2(struct aiocb *iocb, int flags)
3706cb1c3fSKonstantin Belousov {
3806cb1c3fSKonstantin Belousov 	int error;
3906cb1c3fSKonstantin Belousov 
40*8dfc788bSKonstantin Belousov 	if ((flags & ~(AIO_OP2_FOFFSET | AIO_OP2_VECTORED)) != 0) {
4106cb1c3fSKonstantin Belousov 		errno = EINVAL;
4206cb1c3fSKonstantin Belousov 		return (-1);
4306cb1c3fSKonstantin Belousov 	}
4406cb1c3fSKonstantin Belousov 	iocb->aio_lio_opcode = LIO_WRITE;
4506cb1c3fSKonstantin Belousov 	if ((flags & AIO_OP2_FOFFSET) != 0)
4606cb1c3fSKonstantin Belousov 		iocb->aio_lio_opcode |= LIO_FOFFSET;
47*8dfc788bSKonstantin Belousov 	if ((flags & AIO_OP2_VECTORED) != 0)
48*8dfc788bSKonstantin Belousov 		iocb->aio_lio_opcode |= LIO_VECTORED;
4906cb1c3fSKonstantin Belousov 
5006cb1c3fSKonstantin Belousov 	error = lio_listio(LIO_NOWAIT, &iocb, 1, NULL);
5106cb1c3fSKonstantin Belousov 	if (error == -1 && errno == EIO) {
5206cb1c3fSKonstantin Belousov 		error = aio_error(iocb);
5306cb1c3fSKonstantin Belousov 		if (error != -1 && error != 0)
5406cb1c3fSKonstantin Belousov 			errno = error;
5506cb1c3fSKonstantin Belousov 		error = -1;
5606cb1c3fSKonstantin Belousov 	}
5706cb1c3fSKonstantin Belousov 	return (error);
5806cb1c3fSKonstantin Belousov }
59