Module Name:    src
Committed By:   msaitoh
Date:           Mon Nov  3 19:18:09 UTC 2014

Modified Files:
        src/lib/libperfuse [netbsd-6]: ops.c perfuse.c perfuse_priv.h subr.c
        src/lib/libpuffs [netbsd-6]: creds.c dispatcher.c puffs.h puffs_ops.3
            requests.c
        src/sys/fs/puffs [netbsd-6]: puffs_msgif.h puffs_sys.h puffs_vnops.c
        src/usr.sbin/perfused [netbsd-6]: msg.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #1140):
        lib/libperfuse/ops.c                            1.63-1.69
        lib/libperfuse/perfuse.c                        1.32-1.33
        lib/libperfuse/perfuse_priv.h                   1.32-1.34
        lib/libperfuse/subr.c                           1.20
        lib/libpuffs/creds.c                            1.16
        lib/libpuffs/dispatcher.c                       1.47
        lib/libpuffs/puffs.h                            1.125
        lib/libpuffs/puffs_ops.3                        1.37-1.38
        lib/libpuffs/requests.c                         1.24
        sys/fs/puffs/puffs_msgif.h                      1.81
        sys/fs/puffs/puffs_sys.h                        1.85
        sys/fs/puffs/puffs_vnops.c                      1.183
        usr.sbin/perfused/msg.c                         1.22
Bring libpuffs, libperfuse and perfused on par with -current:
- implement  FUSE direct I/O
- remove useless code and warnings
- fix missing GETATTR bugs
- fix exended attribute get and list operations


To generate a diff of this commit:
cvs rdiff -u -r1.50.2.7 -r1.50.2.8 src/lib/libperfuse/ops.c
cvs rdiff -u -r1.25.2.3 -r1.25.2.4 src/lib/libperfuse/perfuse.c
cvs rdiff -u -r1.25.2.4 -r1.25.2.5 src/lib/libperfuse/perfuse_priv.h
cvs rdiff -u -r1.15.2.3 -r1.15.2.4 src/lib/libperfuse/subr.c
cvs rdiff -u -r1.15 -r1.15.8.1 src/lib/libpuffs/creds.c
cvs rdiff -u -r1.38.2.4 -r1.38.2.5 src/lib/libpuffs/dispatcher.c
cvs rdiff -u -r1.119.4.4 -r1.119.4.5 src/lib/libpuffs/puffs.h
cvs rdiff -u -r1.29.4.4 -r1.29.4.5 src/lib/libpuffs/puffs_ops.3
cvs rdiff -u -r1.23 -r1.23.28.1 src/lib/libpuffs/requests.c
cvs rdiff -u -r1.77.8.2 -r1.77.8.3 src/sys/fs/puffs/puffs_msgif.h
cvs rdiff -u -r1.78.8.2 -r1.78.8.3 src/sys/fs/puffs/puffs_sys.h
cvs rdiff -u -r1.163.2.4 -r1.163.2.5 src/sys/fs/puffs/puffs_vnops.c
cvs rdiff -u -r1.20.2.1 -r1.20.2.2 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.50.2.7 src/lib/libperfuse/ops.c:1.50.2.8
--- src/lib/libperfuse/ops.c:1.50.2.7	Tue Jul 30 04:05:32 2013
+++ src/lib/libperfuse/ops.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: ops.c,v 1.50.2.7 2013/07/30 04:05:32 msaitoh Exp $ */
+/*  $NetBSD: ops.c,v 1.50.2.8 2014/11/03 19:18:09 msaitoh Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -634,13 +634,23 @@ fuse_to_dirent(struct puffs_usermount *p
 		 */
 		if (fd->ino == PERFUSE_UNKNOWN_INO) {
 			struct puffs_node *pn;
+			struct perfuse_node_data *pnd = PERFUSE_NODE_DATA(opc);
 
-			if (node_lookup_common(pu, opc, NULL, fd->name,
-					       NULL, &pn) != 0) {
-				DWARNX("node_lookup_common failed");
+			/* 
+			 * Avoid breaking out of fs 
+			 * by lookup to .. on root
+			 */
+			if ((strcmp(fd->name, "..") == 0) && 
+			    (pnd->pnd_nodeid == FUSE_ROOT_ID)) {
+				fd->ino = FUSE_ROOT_ID;
 			} else {
-				fd->ino = pn->pn_va.va_fileid;
-				(void)perfuse_node_reclaim(pu, pn);
+				if (node_lookup_common(pu, opc, NULL, fd->name,
+						       NULL, &pn) != 0) {
+					DWARNX("node_lookup_common failed");
+				} else {
+					fd->ino = pn->pn_va.va_fileid;
+					(void)perfuse_node_reclaim(pu, pn);
+				}
 			}
 		}
 
@@ -1318,6 +1328,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;
@@ -1419,6 +1436,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\", "
@@ -1534,7 +1557,7 @@ perfuse_node_getattr_ttl(struct puffs_us
 	struct fuse_attr_out *fao;
 	int error = 0;
 	
-	if (pnd->pnd_flags & PND_REMOVED)
+	if ((pnd->pnd_flags & PND_REMOVED) && !(pnd->pnd_flags & PND_OPEN))
 		return ENOENT;
 
 	node_ref(opc);
@@ -1927,17 +1950,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,
@@ -2052,14 +2064,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)
@@ -3011,11 +3015,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;
 
@@ -3130,8 +3129,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;
 
@@ -3303,6 +3300,10 @@ perfuse_node_getextattr(struct puffs_use
 	char *np;
 	int error;
 
+	/* system namespace attrs are not accessible to non root users */
+	if (attrns == EXTATTR_NAMESPACE_SYSTEM && !puffs_cred_isjuggernaut(pcr))
+		return EPERM;
+
 	node_ref(opc);
 	ps = puffs_getspecific(pu);
 	attrname = perfuse_native_ns(attrns, attrname, fuse_attrname);
@@ -3339,9 +3340,18 @@ perfuse_node_getextattr(struct puffs_use
 	 */
 	foh = GET_OUTHDR(ps, pm);
 	np = (char *)(void *)(foh + 1);
+	len = foh->len - sizeof(*foh);
+
+	if (attrsize != NULL)
+		*attrsize = len;
 
 	if (resid != NULL) {
-		len = MAX(foh->len - sizeof(*foh), *resid);
+		if (*resid < len) {
+			error = ERANGE;
+			ps->ps_destroy_msg(pm);
+			goto out;
+		}
+
 		(void)memcpy(attr, np, len);
 		*resid -= len;
 	}
@@ -3368,6 +3378,10 @@ perfuse_node_setextattr(struct puffs_use
 	char *np;
 	int error;
 	
+	/* system namespace attrs are not accessible to non root users */
+	if (attrns == EXTATTR_NAMESPACE_SYSTEM && !puffs_cred_isjuggernaut(pcr))
+		return EPERM;
+
 	node_ref(opc);
 	ps = puffs_getspecific(pu);
 	attrname = perfuse_native_ns(attrns, attrname, fuse_attrname);
@@ -3408,9 +3422,13 @@ perfuse_node_listextattr(struct puffs_us
 	struct fuse_getxattr_out *fgo;
 	struct fuse_out_header *foh;
 	char *np;
-	size_t len, puffs_len;
+	size_t len, puffs_len, i, attrlen, outlen;
 	int error;
 	
+	/* system namespace attrs are not accessible to non root users */
+	if (attrns == EXTATTR_NAMESPACE_SYSTEM && !puffs_cred_isjuggernaut(pcr))
+		return EPERM;
+
 	node_ref(opc);
 
 	ps = puffs_getspecific(pu);
@@ -3450,28 +3468,44 @@ perfuse_node_listextattr(struct puffs_us
 	np = (char *)(void *)(foh + 1);
 	puffs_len = foh->len - sizeof(*foh);
 
-	if (attrs != NULL) {
-#ifdef PUFFS_EXTATTR_LIST_LENPREFIX
-		/* 
-		 * Convert the FUSE reply to length prefixed strings
-		 * if this is what the kernel wants.
-		 */
-		if (flag & PUFFS_EXTATTR_LIST_LENPREFIX) {
-			size_t i, attrlen;
+	if (attrsize != NULL)
+		*attrsize = puffs_len;
 
-			for (i = 0; i < puffs_len; i += attrlen + 1) {
-				attrlen = strlen(np + i);
-				(void)memmove(np + i + 1, np + i, attrlen);
-				*(np + i) = (uint8_t)attrlen;
-			}	
+	if (attrs != NULL) {
+		if (*resid < puffs_len) {
+			error = ERANGE;
+			ps->ps_destroy_msg(pm);
+			goto out;
 		}
+
+		outlen = 0;
+	
+		for (i = 0; i < puffs_len; i += attrlen + 1) {
+			attrlen = strlen(np + i);
+
+			/*
+			 * Filter attributes per namespace
+			 */
+			if (!perfuse_ns_match(attrns, np + i))
+				continue;
+
+#ifdef PUFFS_EXTATTR_LIST_LENPREFIX
+			/* 
+			 * Convert the FUSE reply to length prefixed strings
+			 * if this is what the kernel wants.
+			 */
+			if (flag & PUFFS_EXTATTR_LIST_LENPREFIX) {
+				(void)memcpy(attrs + outlen + 1,
+					     np + i, attrlen);
+				*(attrs + outlen) = (uint8_t)attrlen;
+			} else 
 #endif /* PUFFS_EXTATTR_LIST_LENPREFIX */
-		(void)memcpy(attrs, np, puffs_len);
-		*resid -= puffs_len;
-	}
+			(void)memcpy(attrs + outlen, np + i, attrlen + 1);
+			outlen += attrlen + 1;
+		}	
 
-	if (attrsize != NULL) 
-		*attrsize = puffs_len;
+		*resid -= outlen;
+	}
 
 	ps->ps_destroy_msg(pm);
 	error = 0;
@@ -3492,6 +3526,10 @@ perfuse_node_deleteextattr(struct puffs_
 	char *np;
 	int error;
 	
+	/* system namespace attrs are not accessible to non root users */
+	if (attrns == EXTATTR_NAMESPACE_SYSTEM && !puffs_cred_isjuggernaut(pcr))
+		return EPERM;
+
 	node_ref(opc);
 
 	ps = puffs_getspecific(pu);

Index: src/lib/libperfuse/perfuse.c
diff -u src/lib/libperfuse/perfuse.c:1.25.2.3 src/lib/libperfuse/perfuse.c:1.25.2.4
--- src/lib/libperfuse/perfuse.c:1.25.2.3	Thu Sep 13 22:31:03 2012
+++ src/lib/libperfuse/perfuse.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse.c,v 1.25.2.3 2012/09/13 22:31:03 riz Exp $ */
+/*  $NetBSD: perfuse.c,v 1.25.2.4 2014/11/03 19:18:09 msaitoh 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.25.2.4 src/lib/libperfuse/perfuse_priv.h:1.25.2.5
--- src/lib/libperfuse/perfuse_priv.h:1.25.2.4	Sun Aug 12 13:13:20 2012
+++ src/lib/libperfuse/perfuse_priv.h	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: perfuse_priv.h,v 1.25.2.4 2012/08/12 13:13:20 martin Exp $ */
+/*  $NetBSD: perfuse_priv.h,v 1.25.2.5 2014/11/03 19:18:09 msaitoh Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -186,6 +186,7 @@ uint64_t perfuse_get_fh(puffs_cookie_t, 
 uint64_t perfuse_next_unique(struct puffs_usermount *);
 char *perfuse_node_path(struct perfuse_state *, puffs_cookie_t);
 int perfuse_node_close_common(struct puffs_usermount *, puffs_cookie_t, int);
+int perfuse_ns_match(const int, const char *);
 const char *perfuse_native_ns(const int, const char *, char *);
 
 char *perfuse_fs_mount(int, ssize_t);
@@ -222,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 *,
@@ -261,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/libperfuse/subr.c
diff -u src/lib/libperfuse/subr.c:1.15.2.3 src/lib/libperfuse/subr.c:1.15.2.4
--- src/lib/libperfuse/subr.c:1.15.2.3	Sun Aug 12 13:13:20 2012
+++ src/lib/libperfuse/subr.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: subr.c,v 1.15.2.3 2012/08/12 13:13:20 martin Exp $ */
+/*  $NetBSD: subr.c,v 1.15.2.4 2014/11/03 19:18:09 msaitoh Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -215,6 +215,20 @@ perfuse_node_path(struct perfuse_state *
 	return buf;
 }
 
+int
+perfuse_ns_match(const int attrnamespace, const char *attrname)
+{
+	const char *system_ns[] = { "system.", "trusted.", "security", NULL };
+	int i;
+
+        for (i = 0; system_ns[i]; i++) {
+                if (strncmp(attrname, system_ns[i], strlen(system_ns[i])) == 0)
+			return (attrnamespace == EXTATTR_NAMESPACE_SYSTEM);
+        }
+
+	return (attrnamespace == EXTATTR_NAMESPACE_USER);
+}
+
 const char *
 perfuse_native_ns(const int attrnamespace, const char *attrname,
 	char *fuse_attrname)

Index: src/lib/libpuffs/creds.c
diff -u src/lib/libpuffs/creds.c:1.15 src/lib/libpuffs/creds.c:1.15.8.1
--- src/lib/libpuffs/creds.c:1.15	Fri Nov 20 14:23:54 2009
+++ src/lib/libpuffs/creds.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: creds.c,v 1.15 2009/11/20 14:23:54 pooka Exp $	*/
+/*	$NetBSD: creds.c,v 1.15.8.1 2014/11/03 19:18:09 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 2006  Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: creds.c,v 1.15 2009/11/20 14:23:54 pooka Exp $");
+__RCSID("$NetBSD: creds.c,v 1.15.8.1 2014/11/03 19:18:09 msaitoh Exp $");
 #endif /* !lint */
 
 /*
@@ -250,10 +250,11 @@ puffs_access_times(uid_t uid, gid_t gid,
 	const struct puffs_cred *pcr)
 {
 
-	if (!puffs_cred_isuid(pcr, uid) && !puffs_cred_isjuggernaut(pcr)
-	    && (va_utimes_null == 0
-	      || puffs_access(VNON, mode, uid, gid, PUFFS_VWRITE, pcr) != 0))
+	if (puffs_cred_isuid(pcr, uid) || puffs_cred_isjuggernaut(pcr))
+		return 0;
+
+	if (va_utimes_null == 0)
 		return EPERM;
 
-	return 0;
+	return puffs_access(VNON, mode, uid, gid, PUFFS_VWRITE, pcr);
 }

Index: src/lib/libpuffs/dispatcher.c
diff -u src/lib/libpuffs/dispatcher.c:1.38.2.4 src/lib/libpuffs/dispatcher.c:1.38.2.5
--- src/lib/libpuffs/dispatcher.c:1.38.2.4	Thu Sep 13 20:20:15 2012
+++ src/lib/libpuffs/dispatcher.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dispatcher.c,v 1.38.2.4 2012/09/13 20:20:15 riz Exp $	*/
+/*	$NetBSD: dispatcher.c,v 1.38.2.5 2014/11/03 19:18:09 msaitoh 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.38.2.4 2012/09/13 20:20:15 riz Exp $");
+__RCSID("$NetBSD: dispatcher.c,v 1.38.2.5 2014/11/03 19:18:09 msaitoh 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.119.4.4 src/lib/libpuffs/puffs.h:1.119.4.5
--- src/lib/libpuffs/puffs.h:1.119.4.4	Thu Sep 13 20:20:16 2012
+++ src/lib/libpuffs/puffs.h	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs.h,v 1.119.4.4 2012/09/13 20:20:16 riz Exp $	*/
+/*	$NetBSD: puffs.h,v 1.119.4.5 2014/11/03 19:18:09 msaitoh 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.29.4.4 src/lib/libpuffs/puffs_ops.3:1.29.4.5
--- src/lib/libpuffs/puffs_ops.3:1.29.4.4	Thu Sep 13 20:20:15 2012
+++ src/lib/libpuffs/puffs_ops.3	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-.\"	$NetBSD: puffs_ops.3,v 1.29.4.4 2012/09/13 20:20:15 riz Exp $
+.\"	$NetBSD: puffs_ops.3,v 1.29.4.5 2014/11/03 19:18:09 msaitoh 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 April 18, 2012
+.Dd April 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"
@@ -482,6 +487,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
@@ -492,6 +498,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/lib/libpuffs/requests.c
diff -u src/lib/libpuffs/requests.c:1.23 src/lib/libpuffs/requests.c:1.23.28.1
--- src/lib/libpuffs/requests.c:1.23	Tue Jan 29 14:54:08 2008
+++ src/lib/libpuffs/requests.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: requests.c,v 1.23 2008/01/29 14:54:08 pooka Exp $	*/
+/*	$NetBSD: requests.c,v 1.23.28.1 2014/11/03 19:18:09 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 2007 Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
 
 #include <sys/cdefs.h>
 #if !defined(lint)
-__RCSID("$NetBSD: requests.c,v 1.23 2008/01/29 14:54:08 pooka Exp $");
+__RCSID("$NetBSD: requests.c,v 1.23.28.1 2014/11/03 19:18:09 msaitoh Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -209,7 +209,7 @@ puffs__fsframe_cmp(struct puffs_usermoun
 	winlen = sizeof(struct puffs_req);
 	rv = puffs_framebuf_getwindow(pb1, 0, (void *)&preq1, &winlen);
 	assert(rv == 0); /* frames are always at least puffs_req in size */
-	assert(winlen = sizeof(struct puffs_req));
+	assert(winlen == sizeof(struct puffs_req));
 
 	/*
 	 * Check if this is not a response in this slot.  That's the
@@ -224,7 +224,7 @@ puffs__fsframe_cmp(struct puffs_usermoun
 	winlen = sizeof(struct puffs_req);
 	rv = puffs_framebuf_getwindow(pb2, 0, (void *)&preq2, &winlen);
 	assert(rv == 0); /* frames are always at least puffs_req in size */
-	assert(winlen = sizeof(struct puffs_req));
+	assert(winlen == sizeof(struct puffs_req));
 
 	/* then compare: resid equal? */
 	return preq1->preq_id != preq2->preq_id;

Index: src/sys/fs/puffs/puffs_msgif.h
diff -u src/sys/fs/puffs/puffs_msgif.h:1.77.8.2 src/sys/fs/puffs/puffs_msgif.h:1.77.8.3
--- src/sys/fs/puffs/puffs_msgif.h:1.77.8.2	Sun Aug 12 13:13:20 2012
+++ src/sys/fs/puffs/puffs_msgif.h	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.h,v 1.77.8.2 2012/08/12 13:13:20 martin Exp $	*/
+/*	$NetBSD: puffs_msgif.h,v 1.77.8.3 2014/11/03 19:18:09 msaitoh 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.78.8.2 src/sys/fs/puffs/puffs_sys.h:1.78.8.3
--- src/sys/fs/puffs/puffs_sys.h:1.78.8.2	Sun Aug 12 13:13:20 2012
+++ src/sys/fs/puffs/puffs_sys.h	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_sys.h,v 1.78.8.2 2012/08/12 13:13:20 martin Exp $	*/
+/*	$NetBSD: puffs_sys.h,v 1.78.8.3 2014/11/03 19:18:09 msaitoh Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
@@ -193,6 +193,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.163.2.4 src/sys/fs/puffs/puffs_vnops.c:1.163.2.5
--- src/sys/fs/puffs/puffs_vnops.c:1.163.2.4	Sun Aug 12 13:13:20 2012
+++ src/sys/fs/puffs/puffs_vnops.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.163.2.4 2012/08/12 13:13:20 martin Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.163.2.5 2014/11/03 19:18:09 msaitoh 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.163.2.4 2012/08/12 13:13:20 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.163.2.5 2014/11/03 19:18:09 msaitoh Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -871,6 +871,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;
 
@@ -891,6 +892,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);
@@ -2165,6 +2172,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;
@@ -2180,7 +2188,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) {
@@ -2285,7 +2295,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);
 
 		/*

Index: src/usr.sbin/perfused/msg.c
diff -u src/usr.sbin/perfused/msg.c:1.20.2.1 src/usr.sbin/perfused/msg.c:1.20.2.2
--- src/usr.sbin/perfused/msg.c:1.20.2.1	Sun Aug 12 13:13:21 2012
+++ src/usr.sbin/perfused/msg.c	Mon Nov  3 19:18:09 2014
@@ -1,4 +1,4 @@
-/*  $NetBSD: msg.c,v 1.20.2.1 2012/08/12 13:13:21 martin Exp $ */
+/*  $NetBSD: msg.c,v 1.20.2.2 2014/11/03 19:18:09 msaitoh 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