xref: /netbsd-src/lib/librumpuser/rumpfiber_bio.c (revision f14316bcbc544b96a93e884bc5c2b15fd60e22ae)
1 /*-
2  * Copyright (c) 2014 Antti Kantee.  All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
14  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
15  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
16  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23  * SUCH DAMAGE.
24  */
25 
26 #include "rumpuser_port.h"
27 
28 #if !defined(lint)
29 __RCSID("$NetBSD: rumpfiber_bio.c,v 1.1 2014/07/11 20:26:31 justin Exp $");
30 #endif /* !lint */
31 
32 #include <sys/types.h>
33 
34 #include <stdint.h>
35 #include <unistd.h>
36 
37 #include <rump/rumpuser.h>
38 
39 #include "rumpuser_int.h"
40 
41 void
42 rumpuser_bio(int fd, int op, void *data, size_t dlen, int64_t doff,
43 	rump_biodone_fn biodone, void *bioarg)
44 {
45 	ssize_t rv;
46 	int error = 0;
47 
48 	if (op & RUMPUSER_BIO_READ) {
49 		if ((rv = pread(fd, data, dlen, doff)) == -1)
50 			error = errno;
51 	} else {
52 		if ((rv = pwrite(fd, data, dlen, doff)) == -1)
53 			error = errno;
54 		if (error == 0 && (op & RUMPUSER_BIO_SYNC)) {
55 #ifdef __NetBSD__
56 			fsync_range(fd, FDATASYNC, doff, dlen);
57 #else
58 			fsync(fd);
59 #endif
60 		}
61 	}
62 	if (rv == -1)
63 		rv = 0;
64 	biodone(bioarg, (size_t)rv, error);
65 }
66