summaryrefslogtreecommitdiff
path: root/sys/nfsclient
diff options
context:
space:
mode:
authorRick Macklem <rmacklem@FreeBSD.org>2012-03-01 03:53:07 +0000
committerRick Macklem <rmacklem@FreeBSD.org>2012-03-01 03:53:07 +0000
commit4cf7d128405078d7e4b72b93913d3b6f4f47a6b4 (patch)
treefe54465a7586f88b20815ce4611bbe757bbdc610 /sys/nfsclient
parent4d051adb0f4a2b342cfb9baa664a6d1cf55356f3 (diff)
downloadsrc-test2-4cf7d128405078d7e4b72b93913d3b6f4f47a6b4.tar.gz
src-test2-4cf7d128405078d7e4b72b93913d3b6f4f47a6b4.zip
Notes
Diffstat (limited to 'sys/nfsclient')
-rw-r--r--sys/nfsclient/nfs_bio.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c
index 4a90ad72960b..e005fc88b261 100644
--- a/sys/nfsclient/nfs_bio.c
+++ b/sys/nfsclient/nfs_bio.c
@@ -814,7 +814,21 @@ do_sync:
t_uio->uio_segflg = UIO_SYSSPACE;
t_uio->uio_rw = UIO_WRITE;
t_uio->uio_td = td;
- bcopy(uiop->uio_iov->iov_base, t_iov->iov_base, size);
+ KASSERT(uiop->uio_segflg == UIO_USERSPACE ||
+ uiop->uio_segflg == UIO_SYSSPACE,
+ ("nfs_directio_write: Bad uio_segflg"));
+ if (uiop->uio_segflg == UIO_USERSPACE) {
+ error = copyin(uiop->uio_iov->iov_base,
+ t_iov->iov_base, size);
+ if (error != 0)
+ goto err_free;
+ } else
+ /*
+ * UIO_SYSSPACE may never happen, but handle
+ * it just in case it does.
+ */
+ bcopy(uiop->uio_iov->iov_base, t_iov->iov_base,
+ size);
bp->b_flags |= B_DIRECT;
bp->b_iocmd = BIO_WRITE;
if (cred != NOCRED) {
@@ -825,6 +839,7 @@ do_sync:
bp->b_caller1 = (void *)t_uio;
bp->b_vp = vp;
error = nfs_asyncio(nmp, bp, NOCRED, td);
+err_free:
if (error) {
free(t_iov->iov_base, M_NFSDIRECTIO);
free(t_iov, M_NFSDIRECTIO);