Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/lib - When using PUFFS_KFLAG_CACHE_FS_TTL, do not use puffs_...
details: https://anonhg.NetBSD.org/src/rev/8dc2f721d2b0
branches: trunk
changeset: 778872:8dc2f721d2b0
user: manu <manu%NetBSD.org@localhost>
date: Wed Apr 18 00:57:21 2012 +0000
description:
- When using PUFFS_KFLAG_CACHE_FS_TTL, do not use puffs_node to carry
attribute and TTL fora newly created node. Instead extend puffs_newinfo
and add puffs_newinfo_setva() and puffs_newinfo_setttl()
- Remove node_mk_common_final in libperfuse. It used to set uid/gid for
a newly created vnode but has been made redundant along time ago since
uid and gid are properly set in FUSE header.
- In libperfuse, check for corner case where opc = 0 on INACTIVE and RECLAIM (how is it possible? Check for it to avoid a crash anyway)
- In libperfuse, make sure we unlimit RLIMIT_AS and RLIMIT_DATA so that
we do notrun out of memory because the kernel is lazy at reclaiming vnodes.
- In libperfuse, cleanup style of perfuse_destroy_pn()
diffstat:
lib/libperfuse/ops.c | 235 ++++++++++++++++++++++++-----------------
lib/libperfuse/perfuse.c | 42 ++----
lib/libperfuse/perfuse_priv.h | 8 +-
lib/libperfuse/subr.c | 20 +--
lib/libpuffs/dispatcher.c | 135 +++++++++--------------
lib/libpuffs/pnode.c | 41 ++++--
lib/libpuffs/puffs.3 | 23 ++-
lib/libpuffs/puffs.h | 25 +++-
lib/libpuffs/puffs_ops.3 | 80 ++++++++++++++-
lib/libpuffs/puffs_priv.h | 5 +-
10 files changed, 363 insertions(+), 251 deletions(-)
diffs (truncated from 1157 to 300 lines):
diff -r 3a084e7c378a -r 8dc2f721d2b0 lib/libperfuse/ops.c
--- a/lib/libperfuse/ops.c Wed Apr 18 00:42:50 2012 +0000
+++ b/lib/libperfuse/ops.c Wed Apr 18 00:57:21 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ops.c,v 1.53 2012/04/08 15:13:06 manu Exp $ */
+/* $NetBSD: ops.c,v 1.54 2012/04/18 00:57:21 manu Exp $ */
/*-
* Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -34,7 +34,7 @@
#include <sysexits.h>
#include <syslog.h>
#include <puffs.h>
-#include <sys/socket.h>
+#include <sys/cdefs.h>
#include <sys/socket.h>
#include <sys/extattr.h>
#include <sys/time.h>
@@ -48,9 +48,12 @@
#if 0
static void print_node(const char *, puffs_cookie_t);
#endif
+#ifdef PUFFS_KFLAG_CACHE_FS_TTL
+static void perfuse_newinfo_setttl(struct puffs_newinfo *,
+ struct fuse_entry_out *, struct fuse_attr_out *);
+#else /* PUFFS_KFLAG_CACHE_FS_TTL */
static void set_expire(puffs_cookie_t, struct fuse_entry_out *,
struct fuse_attr_out *);
-#ifndef PUFFS_KFLAG_CACHE_FS_TTL
static int attr_expired(puffs_cookie_t);
static int entry_expired(puffs_cookie_t);
#endif /* PUFFS_KFLAG_CACHE_FS_TTL */
@@ -63,11 +66,10 @@
static int node_lookup_dir_nodot(struct puffs_usermount *,
puffs_cookie_t, char *, size_t, struct puffs_node **);
static int node_lookup_common(struct puffs_usermount *, puffs_cookie_t,
- const char *, const struct puffs_cred *, struct puffs_node **);
+ struct puffs_newinfo *, const char *, const struct puffs_cred *,
+ struct puffs_node **);
static int node_mk_common(struct puffs_usermount *, puffs_cookie_t,
struct puffs_newinfo *, const struct puffs_cn *pcn, perfuse_msg_t *);
-static int node_mk_common_final(struct puffs_usermount *, puffs_cookie_t,
- struct puffs_node *, const struct puffs_cn *pcn);
static uint64_t readdir_last_cookie(struct fuse_dirent *, size_t);
static ssize_t fuse_to_dirent(struct puffs_usermount *, puffs_cookie_t,
struct fuse_dirent *, size_t);
@@ -336,12 +338,48 @@
return;
}
+#ifdef PUFFS_KFLAG_CACHE_FS_TTL
+static void perfuse_newinfo_setttl(struct puffs_newinfo *pni,
+ struct fuse_entry_out *feo, struct fuse_attr_out *fao)
+{
+#ifdef PERFUSE_DEBUG
+ if ((feo == NULL) && (fao == NULL))
+ DERRX(EX_SOFTWARE, "%s: feo and fao NULL", __func__);
+
+ if ((feo != NULL) && (fao != NULL))
+ DERRX(EX_SOFTWARE, "%s: feo and fao != NULL", __func__);
+#endif /* PERFUSE_DEBUG */
+
+ if (fao != NULL) {
+ struct timespec va_ttl;
+
+ va_ttl.tv_sec = fao->attr_valid;
+ va_ttl.tv_nsec = fao->attr_valid_nsec;
+
+ puffs_newinfo_setvattl(pni, &va_ttl);
+ }
+
+ if (feo != NULL) {
+ struct timespec va_ttl;
+ struct timespec cn_ttl;
+
+ va_ttl.tv_sec = feo->attr_valid;
+ va_ttl.tv_nsec = feo->attr_valid_nsec;
+ cn_ttl.tv_sec = feo->entry_valid;
+ cn_ttl.tv_nsec = feo->entry_valid_nsec;
+
+ puffs_newinfo_setvattl(pni, &va_ttl);
+ puffs_newinfo_setcnttl(pni, &cn_ttl);
+ }
+
+ return;
+}
+#else /* PUFFS_KFLAG_CACHE_FS_TTL */
static void
set_expire(puffs_cookie_t opc, struct fuse_entry_out *feo,
struct fuse_attr_out *fao)
{
struct puffs_node *pn = (struct puffs_node *)opc;
-#ifndef PUFFS_KFLAG_CACHE_FS_TTL
struct perfuse_node_data *pnd = PERFUSE_NODE_DATA(opc);
struct timespec entry_ts;
struct timespec attr_ts;
@@ -349,7 +387,6 @@
if (clock_gettime(CLOCK_REALTIME, &now) != 0)
DERR(EX_OSERR, "clock_gettime failed");
-#endif /* PUFFS_KFLAG_CACHE_FS_TTL */
if ((feo == NULL) && (fao == NULL))
DERRX(EX_SOFTWARE, "%s: feo and fao NULL", __func__);
@@ -358,12 +395,6 @@
DERRX(EX_SOFTWARE, "%s: feo and fao != NULL", __func__);
if (feo != NULL) {
-#ifdef PUFFS_KFLAG_CACHE_FS_TTL
- pn->pn_cn_ttl.tv_sec = feo->entry_valid;
- pn->pn_cn_ttl.tv_nsec = feo->entry_valid_nsec;
- pn->pn_va_ttl.tv_sec = feo->attr_valid;
- pn->pn_va_ttl.tv_nsec = feo->attr_valid_nsec;
-#else /* PUFFS_KFLAG_CACHE_FS_TTL */
entry_ts.tv_sec = (time_t)feo->entry_valid;
entry_ts.tv_nsec = (long)feo->entry_valid_nsec;
@@ -373,25 +404,18 @@
attr_ts.tv_nsec = (long)feo->attr_valid_nsec;
timespecadd(&now, &attr_ts, &pnd->pnd_attr_expire);
-#endif /* PUFFS_KFLAG_CACHE_FS_TTL */
}
if (fao != NULL) {
-#ifdef PUFFS_KFLAG_CACHE_FS_TTL
- pn->pn_va_ttl.tv_sec = fao->attr_valid;
- pn->pn_va_ttl.tv_nsec = fao->attr_valid_nsec;
-#else /* PUFFS_KFLAG_CACHE_FS_TTL */
attr_ts.tv_sec = (time_t)fao->attr_valid;
attr_ts.tv_nsec = (long)fao->attr_valid_nsec;
timespecadd(&now, &attr_ts, &pnd->pnd_attr_expire);
-#endif /* PUFFS_KFLAG_CACHE_FS_TTL */
}
return;
}
-#ifndef PUFFS_KFLAG_CACHE_FS_TTL
static int
attr_expired(puffs_cookie_t opc)
{
@@ -451,12 +475,13 @@
return 0;
}
- return node_lookup_common(pu, opc, name, NULL, pnp);
+ return node_lookup_common(pu, opc, NULL, name, NULL, pnp);
}
static int
node_lookup_common(struct puffs_usermount *pu, puffs_cookie_t opc,
- const char *path, const struct puffs_cred *pcr, struct puffs_node **pnp)
+ struct puffs_newinfo *pni, const char *path,
+ const struct puffs_cred *pcr, struct puffs_node **pnp)
{
struct perfuse_state *ps;
struct perfuse_node_data *oldpnd;
@@ -543,14 +568,12 @@
feo = GET_OUTPAYLOAD(ps, pm, fuse_entry_out);
+ pn = NULL;
if (oldpnd != NULL) {
if (oldpnd->pnd_nodeid == feo->nodeid) {
oldpnd->pnd_fuse_nlookup++;
oldpnd->pnd_puffs_nlookup++;
- *pnp = oldpnd->pnd_pn;
-
- ps->ps_destroy_msg(pm);
- return 0;
+ pn = oldpnd->pnd_pn;
} else {
oldpnd->pnd_flags |= PND_REMOVED;
#ifdef PERFUSE_DEBUG
@@ -563,12 +586,16 @@
}
}
- pn = perfuse_new_pn(pu, path, opc);
- PERFUSE_NODE_DATA(pn)->pnd_nodeid = feo->nodeid;
+ if (pn == NULL) {
+ pn = perfuse_new_pn(pu, path, opc);
+ PERFUSE_NODE_DATA(pn)->pnd_nodeid = feo->nodeid;
+ }
fuse_attr_to_vap(ps, &pn->pn_va, &feo->attr);
pn->pn_va.va_gen = (u_long)(feo->generation);
+#ifndef PUFFS_KFLAG_CACHE_FS_TTL
set_expire((puffs_cookie_t)pn, feo, NULL);
+#endif /* PUFFS_KFLAG_CACHE_FS_TTL */
*pnp = pn;
@@ -579,6 +606,17 @@
(void *)opc, pn, feo->nodeid, path);
#endif
+ if (pni != NULL) {
+#ifdef PUFFS_KFLAG_CACHE_FS_TTL
+ puffs_newinfo_setva(pni, &pn->pn_va);
+ perfuse_newinfo_setttl(pni, feo, NULL);
+#endif /* PUFFS_KFLAG_CACHE_FS_TTL */
+ puffs_newinfo_setcookie(pni, pn);
+ puffs_newinfo_setvtype(pni, pn->pn_va.va_type);
+ puffs_newinfo_setsize(pni, (voff_t)pn->pn_va.va_size);
+ puffs_newinfo_setrdev(pni, pn->pn_va.va_rdev);
+ }
+
ps->ps_destroy_msg(pm);
return 0;
@@ -615,9 +653,15 @@
fuse_attr_to_vap(ps, &pn->pn_va, &feo->attr);
pn->pn_va.va_gen = (u_long)(feo->generation);
- set_expire((puffs_cookie_t)pn, feo, NULL);
puffs_newinfo_setcookie(pni, pn);
+#ifdef PUFFS_KFLAG_CACHE_FS_TTL
+ puffs_newinfo_setva(pni, &pn->pn_va);
+ perfuse_newinfo_setttl(pni, feo, NULL);
+#else
+ set_expire((puffs_cookie_t)pn, feo, NULL);
+#endif
+
#ifdef PERFUSE_DEBUG
if (perfuse_diagflags & PDF_FILENAME)
@@ -627,61 +671,11 @@
PERFUSE_NODE_DATA(pn)->pnd_flags, feo->nodeid);
#endif
ps->ps_destroy_msg(pm);
-
- return node_mk_common_final(pu, opc, pn, pcn);
-}
-
-/*
- * Common final code for methods that create objects:
- * perfuse_node_mkdir via node_mk_common
- * perfuse_node_mknod via node_mk_common
- * perfuse_node_symlink via node_mk_common
- * perfuse_node_create
- */
-static int
-node_mk_common_final(struct puffs_usermount *pu, puffs_cookie_t opc,
- struct puffs_node *pn, const struct puffs_cn *pcn)
-{
- struct perfuse_state *ps;
- perfuse_msg_t *pm;
- struct fuse_setattr_in *fsi;
- struct fuse_attr_out *fao;
- int error;
-
- ps = puffs_getspecific(pu);
-
- /*
- * Set owner and group. The kernel cannot create a file
- * on its own (puffs_cred_getuid would return -1), right?
- */
- if (puffs_cred_getuid(pcn->pcn_cred, &pn->pn_va.va_uid) != 0)
- DERRX(EX_SOFTWARE, "puffs_cred_getuid fails in %s", __func__);
- if (puffs_cred_getgid(pcn->pcn_cred, &pn->pn_va.va_gid) != 0)
- DERRX(EX_SOFTWARE, "puffs_cred_getgid fails in %s", __func__);
-
- pm = ps->ps_new_msg(pu, (puffs_cookie_t)pn,
- FUSE_SETATTR, sizeof(*fsi), pcn->pcn_cred);
- fsi = GET_INPAYLOAD(ps, pm, fuse_setattr_in);
- fsi->uid = pn->pn_va.va_uid;
- fsi->gid = pn->pn_va.va_gid;
- fsi->valid = FUSE_FATTR_UID|FUSE_FATTR_GID;
-
- if ((error = xchg_msg(pu, (puffs_cookie_t)pn, pm,
- sizeof(*fao), wait_reply)) != 0)
- return error;
-
- fao = GET_OUTPAYLOAD(ps, pm, fuse_attr_out);
- fuse_attr_to_vap(ps, &pn->pn_va, &fao->attr);
- set_expire((puffs_cookie_t)pn, NULL, fao);
-
- /*
- * The parent directory needs a sync
- */
+
+ /* Parents is now dirty */
PERFUSE_NODE_DATA(opc)->pnd_flags |= PND_DIRTY;
- ps->ps_destroy_msg(pm);
-
- return 0;
+ return 0;
}
static uint64_t
@@ -1168,11 +1162,20 @@
/*
* Special case for ..
*/
- if (strcmp(pcn->pcn_name, "..") == 0)
Home |
Main Index |
Thread Index |
Old Index