Module Name:    src
Committed By:   martin
Date:           Sun Aug 24 08:42:06 UTC 2014

Modified Files:
        src/lib/libperfuse [netbsd-7]: ops.c perfuse.c perfuse_priv.h
        src/lib/libpuffs [netbsd-7]: dispatcher.c puffs.h puffs_ops.3
        src/usr.sbin/perfused [netbsd-7]: msg.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #52):
        lib/libperfuse/perfuse_priv.h: revision 1.33
        lib/libperfuse/ops.c: revision 1.67
        lib/libpuffs/dispatcher.c: revision 1.47
        lib/libperfuse/perfuse_priv.h: revision 1.34
        lib/libperfuse/ops.c: revision 1.68
        lib/libperfuse/ops.c: revision 1.69
        lib/libpuffs/puffs_ops.3: revision 1.37
        lib/libpuffs/puffs_ops.3: revision 1.38
        lib/libperfuse/perfuse.c: revision 1.32
        lib/libperfuse/perfuse.c: revision 1.33
        usr.sbin/perfused/msg.c: revision 1.22
        lib/libpuffs/puffs.h: revision 1.125
Implement FUSE direct I/O.
Remove useless code and warnings


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.66.2.1 src/lib/libperfuse/ops.c
cvs rdiff -u -r1.31 -r1.31.10.1 src/lib/libperfuse/perfuse.c
cvs rdiff -u -r1.32 -r1.32.2.1 src/lib/libperfuse/perfuse_priv.h
cvs rdiff -u -r1.46 -r1.46.4.1 src/lib/libpuffs/dispatcher.c
cvs rdiff -u -r1.124 -r1.124.10.1 src/lib/libpuffs/puffs.h
cvs rdiff -u -r1.36 -r1.36.10.1 src/lib/libpuffs/puffs_ops.3
cvs rdiff -u -r1.21 -r1.21.10.1 src/usr.sbin/perfused/msg.c

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

Modified files:

Index: src/lib/libperfuse/ops.c
diff -u src/lib/libperfuse/ops.c:1.66 src/lib/libperfuse/ops.c:1.66.2.1
--- src/lib/libperfuse/ops.c:1.66	Sun Aug 10 03:22:33 2014
+++ src/lib/libperfuse/ops.c	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: ops.c,v 1.66 2014/08/10 03:22:33 manu Exp $ */
+/*  $NetBSD: ops.c,v 1.66.2.1 2014/08/24 08:42:06 martin Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -1338,6 +1338,13 @@ int
 perfuse_node_open(struct puffs_usermount *pu, puffs_cookie_t opc, int mode,
 	const struct puffs_cred *pcr)
 {
+	return perfuse_node_open2(pu, opc, mode, pcr, NULL);
+}
+
+int
+perfuse_node_open2(struct puffs_usermount *pu, puffs_cookie_t opc, int mode,
+	const struct puffs_cred *pcr, int *oflags)
+{
 	struct perfuse_state *ps;
 	struct perfuse_node_data *pnd;
 	perfuse_msg_t *pm;
@@ -1439,6 +1446,12 @@ perfuse_node_open(struct puffs_usermount
 	 */
 	perfuse_new_fh(opc, foo->fh, mode);
 
+	/*
+	 * Set direct I/O if the filesystems forces it
+	 */
+	if ((foo->open_flags & FUSE_FOPEN_DIRECT_IO) && (oflags != NULL))
+		*oflags |= PUFFS_OPEN_IO_DIRECT;
+
 #ifdef PERFUSE_DEBUG
 	if (perfuse_diagflags & (PDF_FH|PDF_FILENAME))
 		DPRINTF("%s: opc = %p, file = \"%s\", "
@@ -1947,17 +1960,6 @@ out:
 	return error;
 }
 
-/* ARGSUSED0 */
-int
-perfuse_node_mmap(struct puffs_usermount *pu, puffs_cookie_t opc, int flags,
-	const struct puffs_cred *pcr)
-{
-	/* 
-	 * Not implemented anymore in libfuse
-	 */
-	return ENOSYS;
-}
-
 /* ARGSUSED2 */
 int
 perfuse_node_fsync(struct puffs_usermount *pu, puffs_cookie_t opc,
@@ -2072,14 +2074,6 @@ out:
 	return error;
 }
 
-/* ARGSUSED0 */
-int
-perfuse_node_seek(struct puffs_usermount *pu, puffs_cookie_t opc,
-	off_t oldoff, off_t newoff, const struct puffs_cred *pcr)
-{
-	return 0;
-}
-
 int
 perfuse_node_remove(struct puffs_usermount *pu, puffs_cookie_t opc,
 	puffs_cookie_t targ, const struct puffs_cn *pcn)
@@ -3031,11 +3025,6 @@ perfuse_node_read(struct puffs_usermount
 	if (vap->va_type == VDIR)
 		return EISDIR;
 
-	if ((u_quad_t)offset + *resid > vap->va_size)
-		DWARNX("%s %p read %lld@%zu beyond EOF %" PRIu64 "\n",
-		       __func__, (void *)opc, (long long)offset,
-		       *resid, vap->va_size);
-
 	do {
 		size_t max_read;
 
@@ -3150,8 +3139,6 @@ perfuse_node_write2(struct puffs_usermou
 	 * we get the latest value.
 	 */
 	if (ioflag & PUFFS_IO_APPEND) {
-		DWARNX("%s: PUFFS_IO_APPEND set, untested code", __func__);
-
 		if ((error = perfuse_node_getattr(pu, opc, vap, pcr)) != 0)
 			goto out;
 

Index: src/lib/libperfuse/perfuse.c
diff -u src/lib/libperfuse/perfuse.c:1.31 src/lib/libperfuse/perfuse.c:1.31.10.1
--- src/lib/libperfuse/perfuse.c:1.31	Mon Sep 10 13:56:18 2012
+++ src/lib/libperfuse/perfuse.c	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse.c,v 1.31 2012/09/10 13:56:18 manu Exp $ */
+/*  $NetBSD: perfuse.c,v 1.31.10.1 2014/08/24 08:42:06 martin Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -471,11 +471,7 @@ perfuse_init(struct perfuse_callbacks *p
 	PUFFSOP_SET(pops, perfuse, node, getattr);
 	PUFFSOP_SET(pops, perfuse, node, setattr);
 	PUFFSOP_SET(pops, perfuse, node, poll);
-#if 0 
-	PUFFSOP_SET(pops, perfuse, node, mmap);
-#endif
 	PUFFSOP_SET(pops, perfuse, node, fsync);
-	PUFFSOP_SET(pops, perfuse, node, seek);
 	PUFFSOP_SET(pops, perfuse, node, remove);
 	PUFFSOP_SET(pops, perfuse, node, link);
 	PUFFSOP_SET(pops, perfuse, node, rename);
@@ -503,6 +499,9 @@ perfuse_init(struct perfuse_callbacks *p
 #ifdef PUFFS_SETATTR_FAF
 	PUFFSOP_SET(pops, perfuse, node, write2);
 #endif /* PUFFS_SETATTR_FAF */
+#ifdef PUFFS_OPEN_IO_DIRECT 
+	PUFFSOP_SET(pops, perfuse, node, open2);
+#endif /* PUFFS_OPEN_IO_DIRECT */
 
 	/*
 	 * PUFFS_KFLAG_NOCACHE_NAME is required so that we can see changes

Index: src/lib/libperfuse/perfuse_priv.h
diff -u src/lib/libperfuse/perfuse_priv.h:1.32 src/lib/libperfuse/perfuse_priv.h:1.32.2.1
--- src/lib/libperfuse/perfuse_priv.h:1.32	Sun Aug 10 03:22:33 2014
+++ src/lib/libperfuse/perfuse_priv.h	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse_priv.h,v 1.32 2014/08/10 03:22:33 manu Exp $ */
+/*  $NetBSD: perfuse_priv.h,v 1.32.2.1 2014/08/24 08:42:06 martin Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -223,12 +223,8 @@ int perfuse_node_getattr(struct puffs_us
 int perfuse_node_setattr(struct puffs_usermount *,
     puffs_cookie_t, const struct vattr *, const struct puffs_cred *);
 int perfuse_node_poll(struct puffs_usermount *, puffs_cookie_t, int *);
-int perfuse_node_mmap(struct puffs_usermount *,
-    puffs_cookie_t, vm_prot_t, const struct puffs_cred *);
 int perfuse_node_fsync(struct puffs_usermount *,
     puffs_cookie_t, const struct puffs_cred *, int, off_t, off_t);
-int perfuse_node_seek(struct puffs_usermount *,
-    puffs_cookie_t, off_t, off_t, const struct puffs_cred *);
 int perfuse_node_remove(struct puffs_usermount *,
     puffs_cookie_t, puffs_cookie_t, const struct puffs_cn *);
 int perfuse_node_link(struct puffs_usermount *,
@@ -262,6 +258,8 @@ int perfuse_node_write(struct puffs_user
     uint8_t *, off_t, size_t *, const struct puffs_cred *, int);
 int perfuse_node_write2(struct puffs_usermount *, puffs_cookie_t,
     uint8_t *, off_t, size_t *, const struct puffs_cred *, int, int);
+int perfuse_node_open2(struct puffs_usermount *,
+    puffs_cookie_t, int, const struct puffs_cred *, int *);
 void perfuse_cache_write(struct puffs_usermount *,
     puffs_cookie_t, size_t, struct puffs_cacherun *);
 int perfuse_node_getextattr(struct puffs_usermount *, puffs_cookie_t,

Index: src/lib/libpuffs/dispatcher.c
diff -u src/lib/libpuffs/dispatcher.c:1.46 src/lib/libpuffs/dispatcher.c:1.46.4.1
--- src/lib/libpuffs/dispatcher.c:1.46	Wed Nov  6 19:56:38 2013
+++ src/lib/libpuffs/dispatcher.c	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dispatcher.c,v 1.46 2013/11/06 19:56:38 christos Exp $	*/
+/*	$NetBSD: dispatcher.c,v 1.46.4.1 2014/08/24 08:42:06 martin Exp $	*/
 
 /*
  * Copyright (c) 2006, 2007, 2008 Antti Kantee.  All Rights Reserved.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: dispatcher.c,v 1.46 2013/11/06 19:56:38 christos Exp $");
+__RCSID("$NetBSD: dispatcher.c,v 1.46.4.1 2014/08/24 08:42:06 martin Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -412,6 +412,14 @@ dispatch(struct puffs_cc *pcc)
 			struct puffs_vnmsg_open *auxt = auxbuf;
 			PUFFS_MAKECRED(pcr, &auxt->pvnr_cred);
 
+			if (pops->puffs_node_open2 != NULL) {
+				error = pops->puffs_node_open2(pu,
+				    opcookie, auxt->pvnr_mode, pcr, 
+				    &auxt->pvnr_oflags);
+
+				break;
+			}
+
 			if (pops->puffs_node_open == NULL) {
 				error = 0;
 				break;

Index: src/lib/libpuffs/puffs.h
diff -u src/lib/libpuffs/puffs.h:1.124 src/lib/libpuffs/puffs.h:1.124.10.1
--- src/lib/libpuffs/puffs.h:1.124	Thu Aug 16 09:25:44 2012
+++ src/lib/libpuffs/puffs.h	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs.h,v 1.124 2012/08/16 09:25:44 manu Exp $	*/
+/*	$NetBSD: puffs.h,v 1.124.10.1 2014/08/24 08:42:06 martin Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -250,6 +250,8 @@ struct puffs_ops {
 	    uint8_t *, off_t, size_t *, const struct puffs_cred *, int, int);
 	int (*puffs_node_reclaim2)(struct puffs_usermount *,
 	    puffs_cookie_t, int);
+	int (*puffs_node_open2)(struct puffs_usermount *,
+	    puffs_cookie_t, int, const struct puffs_cred *, int *);
 
 	void *puffs_ops_spare[28];
 };
@@ -410,7 +412,9 @@ enum {
 	    puffs_cookie_t, uint8_t *, off_t, size_t *,			\
 	    const struct puffs_cred *, int, int);			\
 	int fsname##_node_reclaim2(struct puffs_usermount *,		\
-	    puffs_cookie_t, int);
+	    puffs_cookie_t, int);					\
+	int fsname##_node_open2(struct puffs_usermount *,		\
+	    puffs_cookie_t, int, const struct puffs_cred *, int *);
 
 
 #define PUFFSOP_INIT(ops)						\

Index: src/lib/libpuffs/puffs_ops.3
diff -u src/lib/libpuffs/puffs_ops.3:1.36 src/lib/libpuffs/puffs_ops.3:1.36.10.1
--- src/lib/libpuffs/puffs_ops.3:1.36	Thu Aug 16 11:28:38 2012
+++ src/lib/libpuffs/puffs_ops.3	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-.\"	$NetBSD: puffs_ops.3,v 1.36 2012/08/16 11:28:38 wiz Exp $
+.\"	$NetBSD: puffs_ops.3,v 1.36.10.1 2014/08/24 08:42:06 martin Exp $
 .\"
 .\" Copyright (c) 2007 Antti Kantee.  All rights reserved.
 .\"
@@ -23,7 +23,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.Dd August 16, 2012
+.Dd August 16, 2014
 .Dt PUFFS_OPS 3
 .Os
 .Sh NAME
@@ -83,6 +83,11 @@
 .Fa "const struct puffs_cred *pcr"
 .Fc
 .Ft int
+.Fo puffs_node_open2
+.Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" "int modep"
+.Fa "const struct puffs_cred *pcr" "int *oflags"
+.Fc
+.Ft int
 .Fo puffs_node_close
 .Fa "struct puffs_usermount *pu" "puffs_cookie_t opc" "int flags"
 .Fa "const struct puffs_cred *pcr"
@@ -481,6 +486,7 @@ file, directory and device special file,
 In case of mknod, the device identifier can be found in
 .Fa va-\*[Gt]va_rdev .
 .It Fn puffs_node_open "pu" "opc" "mode" "pcr"
+.It Fn puffs_node_open2 "pu" "opc" "mode" "pcr" "oflags"
 Open the node denoted by the cookie
 .Fa opc .
 The parameter
@@ -491,6 +497,12 @@ was called with, e.g.
 .Dv O_APPEND
 and
 .Dv O_NONBLOCK .
+.Fn puffs_node_open2
+allows the filesystem to pass back information for the file in
+.Fa oflags .
+The only implemented flag for now is
+.Dv PUFFS_OPEN_IO_DIRECT
+that cause file read/write to bypass the page cache.
 .It Fn puffs_node_close "pu" "opc" "flags" "pcr"
 Close a node.
 The parameter

Index: src/usr.sbin/perfused/msg.c
diff -u src/usr.sbin/perfused/msg.c:1.21 src/usr.sbin/perfused/msg.c:1.21.10.1
--- src/usr.sbin/perfused/msg.c:1.21	Sat Jul 21 05:49:42 2012
+++ src/usr.sbin/perfused/msg.c	Sun Aug 24 08:42:06 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: msg.c,v 1.21 2012/07/21 05:49:42 manu Exp $ */
+/*  $NetBSD: msg.c,v 1.21.10.1 2014/08/24 08:42:06 martin Exp $ */
 
 /*-
  *  Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -493,7 +493,10 @@ perfused_readframe(struct puffs_usermoun
 
 	switch (readen = recv(fd, data, len, MSG_NOSIGNAL|MSG_PEEK)) {
 	case 0:
-		perfused_panic();
+		DPRINTF("Filesystem exit\n");
+		/* NOTREACHED */
+		exit(0);
+		break;
 	case -1:
 		if (errno == EAGAIN)
 			return 0;

Reply via email to