diff options
author | peter <peter@FreeBSD.org> | 1995-11-28 02:40:38 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 1995-11-28 02:40:38 +0000 |
commit | 3f38119b9aafc5bf51d0db7f98efbadb7d5e2af2 (patch) | |
tree | 8ad484a01d2bc8d52d8c166cad49368403084407 /sys/kern/kern_physio.c | |
parent | 17cfbbe7dfdf8533d89b6d58e8530f8869312b78 (diff) | |
download | FreeBSD-src-3f38119b9aafc5bf51d0db7f98efbadb7d5e2af2.zip FreeBSD-src-3f38119b9aafc5bf51d0db7f98efbadb7d5e2af2.tar.gz |
Implement read/write to kernel space - I use this for a self-loading/
self-decompressing ram disk that I'm fiddling with..
(Note, this depends on the various syscalls having correctly set uio_segflag
before calling physio - I've checked and they look correct.)
Diffstat (limited to 'sys/kern/kern_physio.c')
-rw-r--r-- | sys/kern/kern_physio.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c index c9d141d..1880b17 100644 --- a/sys/kern/kern_physio.c +++ b/sys/kern/kern_physio.c @@ -16,7 +16,7 @@ * 4. Modifications may be freely made to this file if the above conditions * are met. * - * $Id: kern_physio.c,v 1.11 1995/05/30 08:05:36 rgrimes Exp $ + * $Id: kern_physio.c,v 1.12 1995/09/08 11:08:36 bde Exp $ */ #include <sys/param.h> @@ -91,16 +91,19 @@ physio(strategy, bp, dev, rw, minp, uio) bp->b_blkno = btodb(uio->uio_offset); - if (rw && !useracc(bp->b_data, bp->b_bufsize, B_WRITE)) { - error = EFAULT; - goto doerror; - } - if (!rw && !useracc(bp->b_data, bp->b_bufsize, B_READ)) { - error = EFAULT; - goto doerror; - } + if (uio->uio_segflg == UIO_USERSPACE) { + if (rw && !useracc(bp->b_data, bp->b_bufsize, B_WRITE)) { + error = EFAULT; + goto doerror; + } + if (!rw && !useracc(bp->b_data, bp->b_bufsize, B_READ)) { + error = EFAULT; + goto doerror; + } - vmapbuf(bp); + /* bring buffer into kernel space */ + vmapbuf(bp); + } /* perform transfer */ (*strategy)(bp); @@ -110,7 +113,9 @@ physio(strategy, bp, dev, rw, minp, uio) tsleep((caddr_t)bp, PRIBIO, "physstr", 0); splx(spl); - vunmapbuf(bp); + /* release mapping into kernel space */ + if (uio->uio_segflg == UIO_USERSPACE) + vunmapbuf(bp); /* * update the uio data |