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) {