rumpfiber_bio.c revision 1.1.6.2       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.6.2 2014/08/20 00:02:21 tls 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