Module Name:    src
Committed By:   jakllsch
Date:           Mon Aug 17 19:47:21 UTC 2015

Modified Files:
        src/sys/dev: ld.c ldvar.h

Log Message:
Add support for implementing discard functionality with ld(4)


To generate a diff of this commit:
cvs rdiff -u -r1.89 -r1.90 src/sys/dev/ld.c
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/ldvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/ld.c
diff -u src/sys/dev/ld.c:1.89 src/sys/dev/ld.c:1.90
--- src/sys/dev/ld.c:1.89	Sun Aug 16 18:00:03 2015
+++ src/sys/dev/ld.c	Mon Aug 17 19:47:21 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ld.c,v 1.89 2015/08/16 18:00:03 mlelstv Exp $	*/
+/*	$NetBSD: ld.c,v 1.90 2015/08/17 19:47:21 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.89 2015/08/16 18:00:03 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ld.c,v 1.90 2015/08/17 19:47:21 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -70,6 +70,7 @@ static void	ld_fake_geometry(struct ld_s
 static void	ld_set_geometry(struct ld_softc *);
 static void	ld_config_interrupts (device_t);
 static int	ld_lastclose(device_t);
+static int	ld_discard(device_t, off_t, off_t);
 
 extern struct	cfdriver ld_cd;
 
@@ -81,6 +82,7 @@ static dev_type_ioctl(ldioctl);
 static dev_type_strategy(ldstrategy);
 static dev_type_dump(lddump);
 static dev_type_size(ldsize);
+static dev_type_discard(lddiscard);
 
 const struct bdevsw ld_bdevsw = {
 	.d_open = ldopen,
@@ -89,7 +91,7 @@ const struct bdevsw ld_bdevsw = {
 	.d_ioctl = ldioctl,
 	.d_dump = lddump,
 	.d_psize = ldsize,
-	.d_discard = nodiscard,
+	.d_discard = lddiscard,
 	.d_flag = D_DISK | D_MPSAFE
 };
 
@@ -104,7 +106,7 @@ const struct cdevsw ld_cdevsw = {
 	.d_poll = nopoll,
 	.d_mmap = nommap,
 	.d_kqfilter = nokqfilter,
-	.d_discard = nodiscard,
+	.d_discard = lddiscard,
 	.d_flag = D_DISK | D_MPSAFE
 };
 
@@ -116,7 +118,8 @@ static struct	dkdriver lddkdriver = {
 	.d_minphys  = ldminphys,
 	.d_diskstart = ld_diskstart,
 	.d_dumpblocks = ld_dumpblocks,
-	.d_lastclose = ld_lastclose
+	.d_lastclose = ld_lastclose,
+	.d_discard = ld_discard
 };
 
 void
@@ -578,3 +581,28 @@ ld_config_interrupts(device_t d)
 
 	dkwedge_discover(&dksc->sc_dkdev);
 }
+
+static int
+ld_discard(device_t dev, off_t pos, off_t len)
+{
+	struct ld_softc *sc = device_private(dev);
+
+	if (sc->sc_discard == NULL)
+		return (ENXIO);
+
+	return (*sc->sc_discard)(sc, pos, len);
+}
+
+static int
+lddiscard(dev_t dev, off_t pos, off_t len)
+{
+	struct ld_softc *sc;
+	struct dk_softc *dksc;
+	int unit;
+
+	unit = DISKUNIT(dev);
+	sc = device_lookup_private(&ld_cd, unit);
+	dksc = &sc->sc_dksc;
+
+	return dk_discard(dksc, dev, pos, len);
+}

Index: src/sys/dev/ldvar.h
diff -u src/sys/dev/ldvar.h:1.25 src/sys/dev/ldvar.h:1.26
--- src/sys/dev/ldvar.h:1.25	Sun Aug 16 14:02:52 2015
+++ src/sys/dev/ldvar.h	Mon Aug 17 19:47:21 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ldvar.h,v 1.25 2015/08/16 14:02:52 mlelstv Exp $	*/
+/*	$NetBSD: ldvar.h,v 1.26 2015/08/17 19:47:21 jakllsch Exp $	*/
 
 /*-
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -62,6 +62,7 @@ struct ld_softc {
 	int		(*sc_dump)(struct ld_softc *, void *, int, int);
 	int		(*sc_flush)(struct ld_softc *, int);
 	int		(*sc_start)(struct ld_softc *, struct buf *);
+	int		(*sc_discard)(struct ld_softc *, off_t, off_t);
 };
 
 /* sc_flags */

Reply via email to