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