diff --git a/sys/geom/geom_dev.c b/sys/geom/geom_dev.c index 224b5d6..9eac4b4 100644 --- a/sys/geom/geom_dev.c +++ b/sys/geom/geom_dev.c @@ -75,7 +75,7 @@ static struct cdevsw g_dev_cdevsw = { .d_ioctl = g_dev_ioctl, .d_strategy = g_dev_strategy, .d_name = "g_dev", - .d_flags = D_DISK | D_TRACKCLOSE, + .d_flags = D_DISK | D_TRACKCLOSE | D_UNMAPPED_BIO, }; static g_taste_t g_dev_taste; diff --git a/sys/kern/kern_conf.c b/sys/kern/kern_conf.c index c04d1da..878593c 100644 --- a/sys/kern/kern_conf.c +++ b/sys/kern/kern_conf.c @@ -580,6 +580,8 @@ newdev(struct cdevsw *csw, int unit, struct cdev *si) } } } + if (csw->d_flags & D_UNMAPPED_BIO) + si->si_flags |= SI_UNMAPPED_BIO; si->si_drv0 = unit; si->si_devsw = csw; LIST_INSERT_HEAD(&csw->d_devs, si, si_list); diff --git a/sys/kern/kern_physio.c b/sys/kern/kern_physio.c index 922ebb6..499e524 100644 --- a/sys/kern/kern_physio.c +++ b/sys/kern/kern_physio.c @@ -91,11 +91,15 @@ physio(struct cdev *dev, struct uio *uio, int ioflag) bp->b_blkno = btodb(bp->b_offset); - if (uio->uio_segflg == UIO_USERSPACE) - if (vmapbuf(bp, 0) < 0) { + if (uio->uio_segflg == UIO_USERSPACE) { + int unmapped; + + unmapped = dev->si_flags & D_UNMAPPED_BIO; + if (vmapbuf(bp, unmapped == 0) < 0) { error = EFAULT; goto doerror; } + } dev_strategy(dev, bp); if (uio->uio_rw == UIO_READ) diff --git a/sys/sys/conf.h b/sys/sys/conf.h index e818722..5c0dbec 100644 --- a/sys/sys/conf.h +++ b/sys/sys/conf.h @@ -61,6 +61,7 @@ struct cdev { #define SI_CHILD 0x0010 /* child of another struct cdev **/ #define SI_DUMPDEV 0x0080 /* is kernel dumpdev */ #define SI_CLONELIST 0x0200 /* on a clone list */ +#define SI_UNMAPPED_BIO 0x0400 /* device can handle unmapped IO */ struct timespec si_atime; struct timespec si_ctime; struct timespec si_mtime; @@ -167,6 +168,7 @@ typedef int dumper_t( #define D_MMAP_ANON 0x00100000 /* special treatment in vm_mmap.c */ #define D_NEEDGIANT 0x00400000 /* driver want Giant */ #define D_NEEDMINOR 0x00800000 /* driver uses clone_create() */ +#define D_UNMAPPED_BIO 0x01000000 /* d_strategy can accept unmapped IO */ /* * Version numbers.