Module Name:    src
Committed By:   ozaki-r
Date:           Wed Oct 16 09:09:39 UTC 2024

Modified Files:
        src/lib/librumpuser: rumpuser_file.c

Log Message:
librumpuser: use preadv/pwritev if available

Because Calling lseek then readv/writev is racy.


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/lib/librumpuser/rumpuser_file.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/librumpuser/rumpuser_file.c
diff -u src/lib/librumpuser/rumpuser_file.c:1.4 src/lib/librumpuser/rumpuser_file.c:1.5
--- src/lib/librumpuser/rumpuser_file.c:1.4	Tue Nov  4 21:08:12 2014
+++ src/lib/librumpuser/rumpuser_file.c	Wed Oct 16 09:09:39 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpuser_file.c,v 1.4 2014/11/04 21:08:12 pooka Exp $	*/
+/*	$NetBSD: rumpuser_file.c,v 1.5 2024/10/16 09:09:39 ozaki-r Exp $	*/
 
 /*
  * Copyright (c) 2007-2010 Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
 #include "rumpuser_port.h"
 
 #if !defined(lint)
-__RCSID("$NetBSD: rumpuser_file.c,v 1.4 2014/11/04 21:08:12 pooka Exp $");
+__RCSID("$NetBSD: rumpuser_file.c,v 1.5 2024/10/16 09:09:39 ozaki-r Exp $");
 #endif /* !lint */
 
 #include <sys/ioctl.h>
@@ -250,6 +250,9 @@ rumpuser_iovread(int fd, struct rumpuser
 	if (off == RUMPUSER_IOV_NOSEEK) {
 		KLOCK_WRAP(nn = readv(fd, iov, iovlen));
 	} else {
+#ifdef HAVE_PREADV
+		KLOCK_WRAP(nn = preadv(fd, iov, iovlen, off));
+#else
 		int nlocks;
 
 		rumpkern_unsched(&nlocks, NULL);
@@ -259,6 +262,7 @@ rumpuser_iovread(int fd, struct rumpuser
 			nn = -1;
 		}
 		rumpkern_sched(nlocks, NULL);
+#endif
 	}
 
 	if (nn == -1) {
@@ -283,6 +287,9 @@ rumpuser_iovwrite(int fd, const struct r
 	if (off == RUMPUSER_IOV_NOSEEK) {
 		KLOCK_WRAP(nn = writev(fd, iov, iovlen));
 	} else {
+#ifdef HAVE_PWRITEV
+		KLOCK_WRAP(nn = pwritev(fd, iov, iovlen, off));
+#else
 		int nlocks;
 
 		rumpkern_unsched(&nlocks, NULL);
@@ -292,6 +299,7 @@ rumpuser_iovwrite(int fd, const struct r
 			nn = -1;
 		}
 		rumpkern_sched(nlocks, NULL);
+#endif
 	}
 
 	if (nn == -1) {

Reply via email to