Index: sys/dev/dkwedge/dk.c
===================================================================
RCS file: /cvsroot/src/sys/dev/dkwedge/dk.c,v
retrieving revision 1.72
diff -p -u -r1.72 dk.c
--- sys/dev/dkwedge/dk.c	25 Jul 2014 08:23:56 -0000	1.72
+++ sys/dev/dkwedge/dk.c	28 Aug 2014 15:38:48 -0000
@@ -1350,6 +1350,8 @@ static int
 dkdiscard(dev_t dev, off_t pos, off_t len)
 {
 	struct dkwedge_softc *sc = dkwedge_lookup(dev);
+	unsigned shift;
+	off_t offset, maxlen;
 
 	if (sc == NULL)
 		return (ENODEV);
@@ -1358,6 +1360,21 @@ dkdiscard(dev_t dev, off_t pos, off_t le
 	if (sc->sc_parent->dk_rawvp == NULL)
 		return (ENXIO);
 
+	shift = (sc->sc_parent->dk_blkshift + DEV_BSHIFT);
+	KASSERT(__type_fit(off_t, sc->sc_size));
+	KASSERT(__type_fit(off_t, sc->sc_offset));
+	KASSERT(0 <= sc->sc_offset);
+	KASSERT(sc->sc_size <= (__type_max(off_t) >> shift));
+	KASSERT(sc->sc_offset <= ((__type_max(off_t) >> shift) - sc->sc_size));
+	offset = ((off_t)sc->sc_offset << shift);
+	maxlen = ((off_t)sc->sc_size << shift);
+
+	if (len > maxlen)
+		return (EINVAL);
+	if (pos > (maxlen - len))
+		return (EINVAL);
+
+	pos += offset;
 	return VOP_FDISCARD(sc->sc_parent->dk_rawvp, pos, len);
 }