Module Name:    src
Committed By:   dholland
Date:           Fri Jul 25 08:19:19 UTC 2014

Modified Files:
        src/sys/miscfs/specfs: spec_vnops.c specdev.h

Log Message:
Implement spec_fdiscard() using bdev_discard() and cdev_discard().
Also define spec_fallocate() to genfs_eopnotsupp().


To generate a diff of this commit:
cvs rdiff -u -r1.143 -r1.144 src/sys/miscfs/specfs/spec_vnops.c
cvs rdiff -u -r1.42 -r1.43 src/sys/miscfs/specfs/specdev.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/miscfs/specfs/spec_vnops.c
diff -u src/sys/miscfs/specfs/spec_vnops.c:1.143 src/sys/miscfs/specfs/spec_vnops.c:1.144
--- src/sys/miscfs/specfs/spec_vnops.c:1.143	Mon Mar 24 13:42:40 2014
+++ src/sys/miscfs/specfs/spec_vnops.c	Fri Jul 25 08:19:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: spec_vnops.c,v 1.143 2014/03/24 13:42:40 hannken Exp $	*/
+/*	$NetBSD: spec_vnops.c,v 1.144 2014/07/25 08:19:19 dholland Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.143 2014/03/24 13:42:40 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.144 2014/07/25 08:19:19 dholland Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -838,6 +838,46 @@ spec_write(void *v)
 }
 
 /*
+ * fdiscard, which on disk devices becomes TRIM.
+ */
+int
+spec_fdiscard(void *v)
+{
+	struct vop_fdiscard_args /* {
+		struct vnode *a_vp;
+		off_t a_pos;
+		off_t a_len;
+	} */ *ap = v;
+	struct vnode *vp;
+	dev_t dev;
+
+	vp = ap->a_vp;
+	dev = NODEV;
+
+	mutex_enter(vp->v_interlock);
+	if (vdead_check(vp, VDEAD_NOWAIT) == 0 && vp->v_specnode != NULL) {
+		dev = vp->v_rdev;
+	}
+	mutex_exit(vp->v_interlock);
+
+	if (dev == NODEV) {
+		return ENXIO;
+	}
+
+	switch (vp->v_type) {
+	    case VCHR:
+		// this is not stored for character devices
+		//KASSERT(vp == vp->v_specnode->sn_dev->sd_cdevvp);
+		return cdev_discard(dev, ap->a_pos, ap->a_len);
+	    case VBLK:
+		KASSERT(vp == vp->v_specnode->sn_dev->sd_bdevvp);
+		return bdev_discard(dev, ap->a_pos, ap->a_len);
+	    default:
+		panic("spec_fdiscard: not a device\n");
+	}
+}
+
+/*
  * Device ioctl operation.
  */
 /* ARGSUSED */

Index: src/sys/miscfs/specfs/specdev.h
diff -u src/sys/miscfs/specfs/specdev.h:1.42 src/sys/miscfs/specfs/specdev.h:1.43
--- src/sys/miscfs/specfs/specdev.h:1.42	Mon Sep 30 18:58:00 2013
+++ src/sys/miscfs/specfs/specdev.h	Fri Jul 25 08:19:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: specdev.h,v 1.42 2013/09/30 18:58:00 hannken Exp $	*/
+/*	$NetBSD: specdev.h,v 1.43 2014/07/25 08:19:19 dholland Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -119,6 +119,8 @@ int	spec_close(void *);
 #define	spec_setattr	genfs_ebadf
 int	spec_read(void *);
 int	spec_write(void *);
+#define spec_fallocate	genfs_eopnotsupp
+int	spec_fdiscard(void *);
 #define spec_fcntl	genfs_fcntl
 int	spec_ioctl(void *);
 int	spec_poll(void *);

Reply via email to