Implement d_discard for dk. diff -r 3b0adad8764c sys/dev/dkwedge/dk.c --- a/sys/dev/dkwedge/dk.c Sun Mar 23 03:05:15 2014 -0400 +++ b/sys/dev/dkwedge/dk.c Sun Mar 23 03:06:16 2014 -0400 @@ -108,6 +108,7 @@ static dev_type_strategy(dkstrategy); static dev_type_dump(dkdump); static dev_type_size(dksize); +static dev_type_discard(dkdiscard); const struct bdevsw dk_bdevsw = { .d_open = dkopen, @@ -116,7 +117,7 @@ .d_ioctl = dkioctl, .d_dump = dkdump, .d_psize = dksize, - .d_discard = nodiscard, + .d_discard = dkdiscard, .d_flag = D_DISK }; @@ -1341,6 +1342,26 @@ } /* + * dkdiscard: [devsw entry point] + * + * Perform a discard-range request on a wedge. + */ +static int +dkdiscard(dev_t dev, off_t pos, off_t len) +{ + struct dkwedge_softc *sc = dkwedge_lookup(dev); + + if (sc == NULL) + return (ENODEV); + if (sc->sc_state != DKW_STATE_RUNNING) + return (ENXIO); + if (sc->sc_parent->dk_rawvp == NULL) + return (ENXIO); + + return VOP_FDISCARD(sc->sc_parent->dk_rawvp, pos, len); +} + +/* * dksize: [devsw entry point] * * Query the size of a wedge for the purpose of performing a dump