Module Name: src Committed By: dholland Date: Fri Jul 25 08:23:57 UTC 2014
Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Implement d_discard for dk. This closes PR 47940. To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/sys/dev/dkwedge/dk.c 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/dkwedge/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.71 src/sys/dev/dkwedge/dk.c:1.72 --- src/sys/dev/dkwedge/dk.c:1.71 Fri Jul 25 08:10:36 2014 +++ src/sys/dev/dkwedge/dk.c Fri Jul 25 08:23:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.71 2014/07/25 08:10:36 dholland Exp $ */ +/* $NetBSD: dk.c,v 1.72 2014/07/25 08:23:56 dholland Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.71 2014/07/25 08:10:36 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.72 2014/07/25 08:23:56 dholland Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -108,6 +108,7 @@ static dev_type_ioctl(dkioctl); 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 @@ const struct bdevsw dk_bdevsw = { .d_ioctl = dkioctl, .d_dump = dkdump, .d_psize = dksize, - .d_discard = nodiscard, + .d_discard = dkdiscard, .d_flag = D_DISK }; @@ -131,7 +132,7 @@ const struct cdevsw dk_cdevsw = { .d_poll = nopoll, .d_mmap = nommap, .d_kqfilter = nokqfilter, - .d_discard = nodiscard, + .d_discard = dkdiscard, .d_flag = D_DISK }; @@ -1341,6 +1342,26 @@ dkioctl(dev_t dev, u_long cmd, void *dat } /* + * 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