Module Name: src
Committed By: manu
Date: Mon Oct 11 01:08:27 UTC 2010
Modified Files:
src/lib/libperfuse: ops.c perfuse_priv.h subr.c
Log Message:
- fix access control: pcn->pcn_cred is not user credentials
- Keep track of file generation
- remove size tracking in pnd_size, we have it in pn_va.va_size
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/lib/libperfuse/ops.c
cvs rdiff -u -r1.14 -r1.15 src/lib/libperfuse/perfuse_priv.h
cvs rdiff -u -r1.8 -r1.9 src/lib/libperfuse/subr.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.20 src/lib/libperfuse/ops.c:1.21
--- src/lib/libperfuse/ops.c:1.20 Mon Oct 4 03:56:24 2010
+++ src/lib/libperfuse/ops.c Mon Oct 11 01:08:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: ops.c,v 1.20 2010/10/04 03:56:24 manu Exp $ */
+/* $NetBSD: ops.c,v 1.21 2010/10/11 01:08:26 manu Exp $ */
/*-
* Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -217,9 +217,16 @@
if (pcr == NULL)
return 0;
+ /*
+ * pcr is NULL for self open through fsync or readdir.
+ * In both case, access control is useless, as it was
+ * done before, at open time.
+ */
+ if (pcr == NULL)
+ return 0;
+
pn = (struct puffs_node *)opc;
va = puffs_pn_getvap(pn);
-
return puffs_access(va->va_type, va->va_mode,
va->va_uid, va->va_gid,
mode, pcr);
@@ -252,13 +259,13 @@
vap->va_flags = 0;
vap->va_rdev = fa->rdev;
vap->va_bytes = fa->size;
- vap->va_filerev = 0;
+ vap->va_filerev = (u_quad_t)PUFFS_VNOVAL;
vap->va_vaflags = 0;
if (vap->va_blocksize == 0)
vap->va_blocksize = DEV_BSIZE;
- if (vap->va_size == (size_t)-1) /* XXX */
+ if (vap->va_size == (size_t)PUFFS_VNOVAL) /* XXX */
vap->va_size = 0;
return;
@@ -369,6 +376,7 @@
PERFUSE_NODE_DATA(pn)->pnd_ino = feo->nodeid;
fuse_attr_to_vap(ps, &pn->pn_va, &feo->attr);
+ pn->pn_va.va_gen = (u_long)(feo->generation);
if (pnp != NULL)
*pnp = pn;
@@ -419,6 +427,8 @@
PERFUSE_NODE_DATA(pn)->pnd_ino = feo->nodeid;
fuse_attr_to_vap(ps, &pn->pn_va, &feo->attr);
+ pn->pn_va.va_gen = (u_long)(feo->generation);
+
puffs_newinfo_setcookie(pni, pn);
#ifdef PERFUSE_DEBUG
@@ -927,7 +937,7 @@
{
struct puffs_node *pn;
int error;
-
+
error = 0;
/*
@@ -980,11 +990,14 @@
if (PERFUSE_NODE_DATA(opc)->pnd_flags & PND_REMOVED)
return ENOENT;
+#if notyet
/*
- * Create an object require -WX permission in the parent directory
+ * XXX create needs -WX on the parent directory. No pcr is
+ * given here, we cannot enforce this.
*/
- if (no_access(opc, pcn->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access(opc, pcr, PUFFS_VWRITE|PUFFS_VEXEC))
return EACCES;
+#endif
/*
* If create is unimplemented: Check that it does not
@@ -1004,9 +1017,22 @@
if (error != 0)
return error;
+ /*
+ * FUSE does the open at create time, while
+ * NetBSD will open in a subsequent operation.
+ * We need to open now, in order to retain FUSE
+ * semantics, but we have no credentials to use
+ * since the PUFFS interface gives no pcr here.
+ *
+ * open with NULL pcr will skip permission checks.
+ * There is no security hole, since we know we
+ * can open this file: we just created it. The
+ * calling process will not get a file descriptor
+ * before the kernel sends the open operation,
+ * which will have a pcr, anyway.
+ */
opc = (puffs_cookie_t)pn;
-
- error = perfuse_node_open(pu, opc, FWRITE, pcn->pcn_cred);
+ error = perfuse_node_open(pu, opc, FWRITE, NULL);
if (error != 0)
return error;
@@ -1023,7 +1049,7 @@
*
* mode must contain file type (ie: S_IFREG), use VTTOIF(vap->va_type)
*/
- pm = ps->ps_new_msg(pu, opc, FUSE_CREATE, len, pcn->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_CREATE, len, NULL);
fci = GET_INPAYLOAD(ps, pm, fuse_create_in);
fci->flags = O_CREAT | O_TRUNC | O_RDWR;
fci->mode = vap->va_mode | VTTOIF(vap->va_type);
@@ -1048,6 +1074,8 @@
PERFUSE_NODE_DATA(pn)->pnd_ino = feo->nodeid;
fuse_attr_to_vap(ps, &pn->pn_va, &feo->attr);
+ pn->pn_va.va_gen = (u_long)(feo->generation);
+
puffs_newinfo_setcookie(pni, pn);
/*
@@ -1101,19 +1129,25 @@
* directories, files, socks, fifo and links.
*
* Create an object require -WX permission in the parent directory
+ *
+ * XXX The PUFFS interface gives us no pcr here, we cannot perfom
+ * access control.
*/
switch (vap->va_type) {
case VDIR: /* FALLTHROUGH */
case VREG: /* FALLTHROUGH */
case VFIFO: /* FALLTHROUGH */
case VSOCK: /* FALLTHROUGH */
- case VLNK:
- if (no_access(opc, pcn->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+#if notyet
+ if (no_access(opc, pcr, PUFFS_VWRITE|PUFFS_VEXEC))
return EACCES;
+#endif
break;
default: /* VNON, VBLK, VCHR, VBAD */
- if (!puffs_cred_isjuggernaut(pcn->pcn_cred))
+#if notyet
+ if (!puffs_cred_isjuggernaut(pcr))
return EACCES;
+#endif
break;
}
@@ -1125,7 +1159,7 @@
/*
* mode must contain file type (ie: S_IFREG), use VTTOIF(vap->va_type)
*/
- pm = ps->ps_new_msg(pu, opc, FUSE_MKNOD, len, pcn->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_MKNOD, len, NULL);
fmi = GET_INPAYLOAD(ps, pm, fuse_mknod_in);
fmi->mode = vap->va_mode | VTTOIF(vap->va_type);
fmi->rdev = (uint32_t)vap->va_rdev;
@@ -1165,7 +1199,7 @@
if (puffs_pn_getvap(pn)->va_type == VDIR) {
op = FUSE_OPENDIR;
- pmode = PUFFS_VREAD|PUFFS_VEXEC;
+ pmode = PUFFS_VREAD;
} else {
op = FUSE_OPEN;
if (mode & FWRITE)
@@ -1175,11 +1209,11 @@
}
/*
- * Opening a directory require R-X on the directory
+ * Opening a directory require R-- on the directory
* Opening a file requires R-- for reading, -W- for writing
- * In both cases, --X is required on the parent.
+ * In both cases, R-- is required on the parent.
*/
- if ((no_access((puffs_cookie_t)pnd->pnd_parent, pcr, PUFFS_VEXEC)) ||
+ if ((no_access((puffs_cookie_t)pnd->pnd_parent, pcr, PUFFS_VREAD)) ||
(no_access(opc, pcr, pmode))) {
error = EACCES;
goto out;
@@ -1273,6 +1307,12 @@
return 0;
}
+/*
+ * XXX
+ * This fails as unprivilegied, it should not: touch testa/testx/a
+ * d-wx-wx-wx 2 root wheel 512 Oct 5 04:32 testa/testx
+ * -rwxrwxrwx 1 root wheel 0 Oct 5 04:39 testa/testx/a
+ */
int
perfuse_node_access(pu, opc, mode, pcr)
struct puffs_usermount *pu;
@@ -1340,14 +1380,11 @@
error = puffs_access(VREG, fao->attr.mode, fao->attr.uid,
fao->attr.gid, (mode_t)mode, pcr);
- /*
- * While we are there, grab size if unknown.
- */
- if (!(PERFUSE_NODE_DATA(opc)->pnd_flags & PND_GOTSIZE)) {
- PERFUSE_NODE_DATA(opc)->pnd_size = fao->attr.size;
- PERFUSE_NODE_DATA(opc)->pnd_flags |= PND_GOTSIZE;
- }
+ fuse_attr_to_vap(ps,
+ &((struct puffs_node *)opc)->pn_va,
+ &fao->attr);
+
ps->ps_destroy_msg(pm);
}
@@ -1372,10 +1409,10 @@
return ENOENT;
/*
- * getattr requires --X on the parent directory
+ * getattr requires --X on the parent directory
+ * no right is required on the object.
*/
- if (no_access((puffs_cookie_t)PERFUSE_NODE_DATA(opc)->pnd_parent,
- pcr, PUFFS_VEXEC))
+ if (no_access(PERFUSE_NODE_DATA(opc)->pnd_parent, pcr, PUFFS_VEXEC))
return EACCES;
ps = puffs_getspecific(pu);
@@ -1410,13 +1447,6 @@
*/
fuse_attr_to_vap(ps, vap, &fao->attr);
- /*
- * While we are there, grab size if unknown.
- */
- if (!(PERFUSE_NODE_DATA(opc)->pnd_flags & PND_GOTSIZE)) {
- PERFUSE_NODE_DATA(opc)->pnd_size = fao->attr.size;
- PERFUSE_NODE_DATA(opc)->pnd_flags |= PND_GOTSIZE;
- }
out:
ps->ps_destroy_msg(pm);
@@ -1456,12 +1486,6 @@
goto out;
}
- /*
- * setattr requires --X on the parent directory
- */
- if (no_access((puffs_cookie_t)pnd->pnd_parent, pcr, PUFFS_VEXEC))
- return EACCES;
-
old_va = puffs_pn_getvap((struct puffs_node *)opc);
/*
@@ -1524,18 +1548,32 @@
fsi->valid |= FUSE_FATTR_SIZE;
}
- if (vap->va_atime.tv_sec != (time_t)PUFFS_VNOVAL) {
- fsi->atime = vap->va_atime.tv_sec;
- fsi->atimensec = (uint32_t)vap->va_atime.tv_nsec;;
- fsi->valid |= FUSE_FATTR_ATIME;
- }
+ /*
+ * Setting mtime without atime or vice verse leads to
+ * dates being reset to Epoch on glusterfs. If one
+ * is missing, use the old value.
+ */
+ if ((vap->va_mtime.tv_sec != (time_t)PUFFS_VNOVAL) ||
+ (vap->va_atime.tv_sec != (time_t)PUFFS_VNOVAL)) {
+
+ if (vap->va_atime.tv_sec != (time_t)PUFFS_VNOVAL) {
+ fsi->atime = vap->va_atime.tv_sec;
+ fsi->atimensec = (uint32_t)vap->va_atime.tv_nsec;
+ } else {
+ fsi->atime = old_va->va_atime.tv_sec;
+ fsi->atimensec = (uint32_t)old_va->va_atime.tv_nsec;
+ }
- if (vap->va_mtime.tv_sec != (time_t)PUFFS_VNOVAL) {
- fsi->mtime = vap->va_mtime.tv_sec;;
- fsi->mtimensec = (uint32_t)vap->va_mtime.tv_nsec;;
- fsi->valid |= FUSE_FATTR_MTIME;
+ if (vap->va_mtime.tv_sec != (time_t)PUFFS_VNOVAL) {
+ fsi->mtime = vap->va_mtime.tv_sec;
+ fsi->mtimensec = (uint32_t)vap->va_mtime.tv_nsec;
+ } else {
+ fsi->mtime = old_va->va_mtime.tv_sec;
+ fsi->mtimensec = (uint32_t)old_va->va_mtime.tv_nsec;
+ }
+
+ fsi->valid |= (FUSE_FATTR_MTIME|FUSE_FATTR_ATIME);
}
-
if (vap->va_mode != (mode_t)PUFFS_VNOVAL) {
fsi->mode = vap->va_mode;
@@ -1572,13 +1610,6 @@
error = xchg_msg(pu, opc, pm, sizeof(struct fuse_attr_out), wait_reply);
out:
- /*
- * Keep track of new size
- */
- if ((error == 0) && (vap->va_size != (u_quad_t)PUFFS_VNOVAL)) {
- pnd->pnd_size = (uint64_t)vap->va_size;
- pnd->pnd_flags |= PND_GOTSIZE;
- }
if (pm != NULL)
ps->ps_destroy_msg(pm);
@@ -1764,17 +1795,6 @@
off_t newoff;
const struct puffs_cred *pcr;
{
- struct perfuse_node_data *pnd;
-
- /*
- * seek may modify file size
- */
- pnd = PERFUSE_NODE_DATA(opc);
- if (newoff > pnd->pnd_size) {
- pnd->pnd_size = newoff;
- pnd->pnd_flags |= PND_GOTSIZE;
- }
-
return 0;
}
@@ -1799,13 +1819,17 @@
(PERFUSE_NODE_DATA(targ)->pnd_flags & PND_REMOVED))
return ENOENT;
+#if notyet
/*
* remove requires -WX on the parent directory
* no right required on the object.
+ *
+ * XXX PUFFS interface gives no pcr here
*/
- if (no_access((puffs_cookie_t)pnd->pnd_parent,
- pcn->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access((puffs_cookie_t)pnd->pnd_parent, pcr,
+ PUFFS_VWRITE|PUFFS_VEXEC))
return EACCES;
+#endif
#ifdef PERFUSE_DEBUG
if (targ == NULL)
@@ -1828,7 +1852,7 @@
name = pcn->pcn_name;
len = pcn->pcn_namelen + 1;
- pm = ps->ps_new_msg(pu, opc, FUSE_UNLINK, len, pcn->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_UNLINK, len, NULL);
path = _GET_INPAYLOAD(ps, pm, char *);
(void)strlcpy(path, name, len);
@@ -1874,11 +1898,15 @@
if (PERFUSE_NODE_DATA(opc)->pnd_flags & PND_REMOVED)
return ENOENT;
+#if notyet
/*
- * Create an object require -WX permission in the parent directory
+ * Create an object require -W- permission in the parent directory
+ *
+ * XXX PUFFS interface gives no pcr here
*/
- if (no_access(opc, pcn->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access(opc, pcr, PUFFS_VWRITE))
return EACCES;
+#endif
ps = puffs_getspecific(pu);
@@ -1886,7 +1914,7 @@
name = pcn->pcn_name;
len = sizeof(*fli) + pcn->pcn_namelen + 1;
- pm = ps->ps_new_msg(pu, opc, FUSE_LINK, len, pcn->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_LINK, len, NULL);
fli = GET_INPAYLOAD(ps, pm, fuse_link_in);
fli->oldnodeid = PERFUSE_NODE_DATA(pn)->pnd_ino;
(void)strlcpy((char *)(void *)(fli + 1), name, len - sizeof(*fli));
@@ -1924,12 +1952,16 @@
(PERFUSE_NODE_DATA(targ_dir)->pnd_flags & PND_REMOVED))
return ENOENT;
+#if notyet
/*
* move requires -WX on source and destination directory
+ *
+ * XXX PUFFS interface gives no pcr here
*/
- if (no_access(opc, pcn_src->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC) ||
- no_access(targ_dir, pcn_targ->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access(opc, pcr_src, PUFFS_VWRITE|PUFFS_VEXEC) ||
+ no_access(targ_dir, pcr_targ, PUFFS_VWRITE|PUFFS_VEXEC))
return EACCES;
+#endif
/*
* Await for all operations on the deleted node to drain,
@@ -1951,7 +1983,7 @@
oldname_len = pcn_src->pcn_namelen + 1;
len = sizeof(*fri) + oldname_len + newname_len;
- pm = ps->ps_new_msg(pu, opc, FUSE_RENAME, len, pcn_src->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_RENAME, len, NULL);
fri = GET_INPAYLOAD(ps, pm, fuse_rename_in);
fri->newdir = PERFUSE_NODE_DATA(targ_dir)->pnd_ino;
np = (char *)(void *)(fri + 1);
@@ -2024,17 +2056,21 @@
if (PERFUSE_NODE_DATA(opc)->pnd_flags & PND_REMOVED)
return ENOENT;
+#if notyet
/*
* Create an object require -WX permission in the parent directory
+ *
+ * XXX PUFFS interface gives no pcr here
*/
- if (no_access(opc, pcn->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access(opc, pcrx, PUFFS_VWRITE|PUFFS_VEXEC))
return EACCES;
+#endif
ps = puffs_getspecific(pu);
path = pcn->pcn_name;
len = sizeof(*fmi) + pcn->pcn_namelen + 1;
- pm = ps->ps_new_msg(pu, opc, FUSE_MKDIR, len, pcn->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_MKDIR, len, NULL);
fmi = GET_INPAYLOAD(ps, pm, fuse_mkdir_in);
fmi->mode = vap->va_mode;
fmi->umask = 0; /* Seems unused by libfuse? */
@@ -2064,13 +2100,17 @@
return ENOENT;
+#if notyet
/*
* remove requires -WX on the parent directory
* no right required on the object.
+ *
+ * XXX PUFFS interface gives no pcr here
*/
- if (no_access((puffs_cookie_t)pnd->pnd_parent,
- pcn->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access((puffs_cookie_t)pnd->pnd_parent, pcr,
+ PUFFS_VWRITE|PUFFS_VEXEC))
return EACCES;
+#endif
/*
* Await for all operations on the deleted node to drain,
@@ -2084,7 +2124,7 @@
name = pcn->pcn_name;
len = pcn->pcn_namelen + 1;
- pm = ps->ps_new_msg(pu, opc, FUSE_RMDIR, len, pcn->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_RMDIR, len, NULL);
path = _GET_INPAYLOAD(ps, pm, char *);
(void)strlcpy(path, name, len);
@@ -2134,11 +2174,15 @@
if (PERFUSE_NODE_DATA(opc)->pnd_flags & PND_REMOVED)
return ENOENT;
+#if notyet
/*
- * Create an object require -WX permission in the parent directory
+ * Create an object require -W- permission in the parent directory
+ *
+ * XXX PUFFS interface gives no pcr here
*/
- if (no_access(opc, pcn_src->pcn_cred, PUFFS_VWRITE|PUFFS_VEXEC))
+ if (no_access(opc, pcr_src, PUFFS_VWRITE))
return EACCES;
+#endif
ps = puffs_getspecific(pu);
path = pcn_src->pcn_name;
@@ -2146,7 +2190,7 @@
linkname_len = strlen(link_target) + 1;
len = path_len + linkname_len;
- pm = ps->ps_new_msg(pu, opc, FUSE_SYMLINK, len, pcn_src->pcn_cred);
+ pm = ps->ps_new_msg(pu, opc, FUSE_SYMLINK, len, NULL);
np = _GET_INPAYLOAD(ps, pm, char *);
(void)strlcpy(np, path, path_len);
np += path_len;
@@ -2351,10 +2395,10 @@
return ENOENT;
/*
- * --X required on parent, R-- required on link
+ * R-- required on parent, R-- required on link
*/
if (no_access((puffs_cookie_t)PERFUSE_NODE_DATA(opc)->pnd_parent,
- pcr, PUFFS_VEXEC) ||
+ pcr, PUFFS_VREAD) ||
no_access(opc, pcr, PUFFS_VREAD))
return EACCES;
@@ -2750,31 +2794,8 @@
/*
* append flag: we may have to read file size first.
*/
- if (ioflag & PUFFS_IO_APPEND) {
- if (!(pnd->pnd_flags & PND_GOTSIZE)) {
- struct fuse_getattr_in *fgi;
- struct fuse_attr_out *fao;
-
- pm = ps->ps_new_msg(pu, opc, FUSE_GETATTR,
- sizeof(*fgi), NULL);
- fgi = GET_INPAYLOAD(ps, pm, fuse_getattr_in);
- fgi->getattr_flags = FUSE_GETATTR_FH;
- fgi->dummy = 0;
- fgi->fh = perfuse_get_fh(opc, FWRITE);
-
- if ((error = xchg_msg(pu, opc, pm,
- sizeof(*fao), wait_reply)) != 0)
- goto out;
-
- fao = GET_OUTPAYLOAD(ps, pm, fuse_attr_out);
- pnd->pnd_size = fao->attr.size;
- pnd->pnd_flags |= PND_GOTSIZE;
-
- ps->ps_destroy_msg(pm);
- }
-
- offset = pnd->pnd_size;
- }
+ if (ioflag & PUFFS_IO_APPEND)
+ offset = ((struct puffs_node *)opc)->pn_va.va_size;
pm = NULL;
@@ -2831,8 +2852,6 @@
*resid -= written;
offset += written;
buf += written;
- pnd->pnd_size = offset; /* New file size */
- pnd->pnd_flags |= PND_GOTSIZE;
ps->ps_destroy_msg(pm);
pm = NULL;
Index: src/lib/libperfuse/perfuse_priv.h
diff -u src/lib/libperfuse/perfuse_priv.h:1.14 src/lib/libperfuse/perfuse_priv.h:1.15
--- src/lib/libperfuse/perfuse_priv.h:1.14 Sun Oct 3 05:46:47 2010
+++ src/lib/libperfuse/perfuse_priv.h Mon Oct 11 01:08:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: perfuse_priv.h,v 1.14 2010/10/03 05:46:47 manu Exp $ */
+/* $NetBSD: perfuse_priv.h,v 1.15 2010/10/11 01:08:26 manu Exp $ */
/*-
* Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -92,7 +92,6 @@
uint64_t pnd_wfh;
uint64_t pnd_ino; /* inode */
uint64_t pnd_nlookup; /* vnode refcount */
- uint64_t pnd_size; /* file size */
uint64_t pnd_lock_owner;
struct dirent *pnd_dirent; /* native buffer for readdir */
off_t pnd_dirent_len;
@@ -108,14 +107,12 @@
#define PND_REMOVED 0x020 /* Node was removed */
#define PND_INWRITE 0x040 /* write in progress */
#define PND_INOPEN 0x100 /* open in progress */
-#define PND_GOTSIZE 0x200 /* pnd_size was set */
#define PND_INXCHG 0x400 /* FUSE exchange in progress */
#define PND_OPEN (PND_RFH|PND_WFH) /* File is open */
#define PND_BUSY (PND_INREADDIR|PND_INWRITE|PND_INOPEN)
puffs_cookie_t pnd_parent;
int pnd_childcount;
- time_t pnd_timestamp;
TAILQ_ENTRY(perfuse_node_data) pnd_next;
puffs_cookie_t pnd_pn;
char pnd_name[MAXPATHLEN]; /* node name */
Index: src/lib/libperfuse/subr.c
diff -u src/lib/libperfuse/subr.c:1.8 src/lib/libperfuse/subr.c:1.9
--- src/lib/libperfuse/subr.c:1.8 Sun Oct 3 05:46:47 2010
+++ src/lib/libperfuse/subr.c Mon Oct 11 01:08:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: subr.c,v 1.8 2010/10/03 05:46:47 manu Exp $ */
+/* $NetBSD: subr.c,v 1.9 2010/10/11 01:08:26 manu Exp $ */
/*-
* Copyright (c) 2010 Emmanuel Dreyfus. All rights reserved.
@@ -62,7 +62,6 @@
pnd->pnd_ino = PERFUSE_UNKNOWN_INO;
pnd->pnd_nlookup = 1;
pnd->pnd_parent = parent;
- pnd->pnd_timestamp = time(NULL);
pnd->pnd_pn = (puffs_cookie_t)pn;
(void)strlcpy(pnd->pnd_name, name, MAXPATHLEN);
TAILQ_INIT(&pnd->pnd_pcq);