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;