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