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 *);