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); }