Module Name:    src
Committed By:   riz
Date:           Tue Aug 26 23:15:13 UTC 2014

Modified Files:
        src/sys/fs/puffs [netbsd-7]: puffs_msgif.h puffs_sys.h puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #52):
        sys/fs/puffs/puffs_msgif.h: revision 1.81
        sys/fs/puffs/puffs_sys.h: revision 1.85
        sys/fs/puffs/puffs_vnops.c: revision 1.183
Add a oflags input field to open requests so that the filesystem can pass
back information about the file. Implement PUFFS_OPEN_IO_DIRECT, which
will force direct IO (bypassing page cache) for the file.


To generate a diff of this commit:
cvs rdiff -u -r1.80 -r1.80.14.1 src/sys/fs/puffs/puffs_msgif.h
cvs rdiff -u -r1.84 -r1.84.4.1 src/sys/fs/puffs/puffs_sys.h
cvs rdiff -u -r1.182 -r1.182.2.1 src/sys/fs/puffs/puffs_vnops.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/fs/puffs/puffs_msgif.h
diff -u src/sys/fs/puffs/puffs_msgif.h:1.80 src/sys/fs/puffs/puffs_msgif.h:1.80.14.1
--- src/sys/fs/puffs/puffs_msgif.h:1.80	Fri Aug 10 16:49:35 2012
+++ src/sys/fs/puffs/puffs_msgif.h	Tue Aug 26 23:15:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.h,v 1.80 2012/08/10 16:49:35 manu Exp $	*/
+/*	$NetBSD: puffs_msgif.h,v 1.80.14.1 2014/08/26 23:15:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -339,6 +339,9 @@ struct puffs_vfsmsg_suspend {
 
 #define PUFFS_EXTATTRCTL_HASNODE	0x01
 #define PUFFS_EXTATTRCTL_HASATTRNAME	0x02
+
+#define	PUFFS_OPEN_IO_DIRECT	0x01
+
 struct puffs_vfsmsg_extattrctl {
 	struct puffs_req	pvfsr_pr;
 
@@ -399,6 +402,7 @@ struct puffs_vnmsg_open {
 
 	struct puffs_kcred	pvnr_cred;		/* OUT	*/
 	int			pvnr_mode;		/* OUT	*/
+	int			pvnr_oflags;		/* IN	*/
 };
 
 struct puffs_vnmsg_close {

Index: src/sys/fs/puffs/puffs_sys.h
diff -u src/sys/fs/puffs/puffs_sys.h:1.84 src/sys/fs/puffs/puffs_sys.h:1.84.4.1
--- src/sys/fs/puffs/puffs_sys.h:1.84	Thu Oct 17 21:03:27 2013
+++ src/sys/fs/puffs/puffs_sys.h	Tue Aug 26 23:15:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_sys.h,v 1.84 2013/10/17 21:03:27 christos Exp $	*/
+/*	$NetBSD: puffs_sys.h,v 1.84.4.1 2014/08/26 23:15:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
@@ -197,6 +197,8 @@ struct puffs_mount {
 #define PNODE_FAF	0x004	/* issue all operations as FAF		*/
 #define PNODE_DOINACT 	0x008	/* if inactive-on-demand, call inactive */
 #define PNODE_SOPEXP	0x100	/* Node reclaim postponed in sop thread	*/
+#define PNODE_RDIRECT	0x200	/* bypass page cache on read		*/
+#define PNODE_WDIRECT	0x400	/* bypass page cache on write		*/
 
 #define PNODE_METACACHE_ATIME	0x10	/* cache atime metadata */
 #define PNODE_METACACHE_CTIME	0x20	/* cache atime metadata */

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.182 src/sys/fs/puffs/puffs_vnops.c:1.182.2.1
--- src/sys/fs/puffs/puffs_vnops.c:1.182	Fri Jul 25 08:20:52 2014
+++ src/sys/fs/puffs/puffs_vnops.c	Tue Aug 26 23:15:12 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.182 2014/07/25 08:20:52 dholland Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.182.2.1 2014/08/26 23:15:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.182 2014/07/25 08:20:52 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.182.2.1 2014/08/26 23:15:12 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -893,6 +893,7 @@ puffs_vnop_open(void *v)
 	PUFFS_MSG_VARS(vn, open);
 	struct vnode *vp = ap->a_vp;
 	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
+	struct puffs_node *pn = VPTOPP(vp);
 	int mode = ap->a_mode;
 	int error;
 
@@ -913,6 +914,12 @@ puffs_vnop_open(void *v)
 	PUFFS_MSG_ENQUEUEWAIT2(pmp, park_open, vp->v_data, NULL, error);
 	error = checkerr(pmp, error, __func__);
 
+	if (open_msg->pvnr_oflags & PUFFS_OPEN_IO_DIRECT) {
+		if (mode & FREAD)
+			pn->pn_stat |= PNODE_RDIRECT;
+		if (mode & FWRITE)
+			pn->pn_stat |= PNODE_WDIRECT;
+	}
  out:
 	DPRINTF(("puffs_open: returning %d\n", error));
 	PUFFS_MSG_RELEASE(open);
@@ -2181,6 +2188,7 @@ puffs_vnop_read(void *v)
 	} */ *ap = v;
 	PUFFS_MSG_VARS(vn, read);
 	struct vnode *vp = ap->a_vp;
+	struct puffs_node *pn = VPTOPP(vp);
 	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
 	struct uio *uio = ap->a_uio;
 	size_t tomove, argsize;
@@ -2196,7 +2204,9 @@ puffs_vnop_read(void *v)
 	if (uio->uio_offset < 0)
 		return EINVAL;
 
-	if (vp->v_type == VREG && PUFFS_USE_PAGECACHE(pmp)) {
+	if (vp->v_type == VREG &&
+	    PUFFS_USE_PAGECACHE(pmp) &&
+	    !(pn->pn_stat & PNODE_RDIRECT)) {
 		const int advice = IO_ADV_DECODE(ap->a_ioflag);
 
 		while (uio->uio_resid > 0) {
@@ -2301,7 +2311,9 @@ puffs_vnop_write(void *v)
 
 	mutex_enter(&pn->pn_sizemtx);
 
-	if (vp->v_type == VREG && PUFFS_USE_PAGECACHE(pmp)) {
+	if (vp->v_type == VREG && 
+	    PUFFS_USE_PAGECACHE(pmp) &&
+	    !(pn->pn_stat & PNODE_WDIRECT)) {
 		ubcflags = UBC_WRITE | UBC_PARTIALOK | UBC_UNMAP_FLAG(vp);
 
 		/*

Reply via email to