summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_physio.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>1995-11-28 02:40:38 +0000
committerpeter <peter@FreeBSD.org>1995-11-28 02:40:38 +0000
commit3f38119b9aafc5bf51d0db7f98efbadb7d5e2af2 (patch)
tree8ad484a01d2bc8d52d8c166cad49368403084407 /sys/kern/kern_physio.c
parent17cfbbe7dfdf8533d89b6d58e8530f8869312b78 (diff)
downloadFreeBSD-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.c27
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
OpenPOWER on IntegriCloud