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;