svn commit: r251942 - in stable/9/sys: geom kern sys
Scott Long
scottl at FreeBSD.org
Tue Jun 18 14:46:43 UTC 2013
Author: scottl
Date: Tue Jun 18 14:46:42 2013
New Revision: 251942
URL: http://svnweb.freebsd.org/changeset/base/251942
Log:
MFC r248712:
Do not pass unmapped buffers to drivers that cannot handle them
Submitted by: kan, mav
Obtained from: Netflix
Modified:
stable/9/sys/geom/geom_dev.c
stable/9/sys/kern/kern_physio.c
stable/9/sys/sys/conf.h
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/sys/ (props changed)
Modified: stable/9/sys/geom/geom_dev.c
==============================================================================
--- stable/9/sys/geom/geom_dev.c Tue Jun 18 14:40:21 2013 (r251941)
+++ stable/9/sys/geom/geom_dev.c Tue Jun 18 14:46:42 2013 (r251942)
@@ -79,7 +79,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_IO,
};
static g_taste_t g_dev_taste;
Modified: stable/9/sys/kern/kern_physio.c
==============================================================================
--- stable/9/sys/kern/kern_physio.c Tue Jun 18 14:40:21 2013 (r251941)
+++ stable/9/sys/kern/kern_physio.c Tue Jun 18 14:46:42 2013 (r251942)
@@ -92,11 +92,19 @@ physio(struct cdev *dev, struct uio *uio
bp->b_blkno = btodb(bp->b_offset);
csw = dev->si_devsw;
if (uio->uio_segflg == UIO_USERSPACE) {
- if (vmapbuf(bp, 0) < 0) {
+ int mapped;
+
+ if (csw != NULL &&
+ (csw->d_flags & D_UNMAPPED_IO) != 0)
+ mapped = 0;
+ else
+ mapped = 1;
+ if (vmapbuf(bp, mapped) < 0) {
error = EFAULT;
goto doerror;
}
}
+
dev_strategy_csw(dev, csw, bp);
if (uio->uio_rw == UIO_READ)
bwait(bp, PRIBIO, "physrd");
Modified: stable/9/sys/sys/conf.h
==============================================================================
--- stable/9/sys/sys/conf.h Tue Jun 18 14:40:21 2013 (r251941)
+++ stable/9/sys/sys/conf.h Tue Jun 18 14:46:42 2013 (r251942)
@@ -171,6 +171,7 @@ typedef int dumper_t(
#define D_PSEUDO 0x00200000 /* make_dev() can return NULL */
#define D_NEEDGIANT 0x00400000 /* driver want Giant */
#define D_NEEDMINOR 0x00800000 /* driver uses clone_create() */
+#define D_UNMAPPED_IO 0x01000000 /* d_strategy can accept unmapped IO */
/*
* Version numbers.
More information about the svn-src-stable-9
mailing list