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;