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