Module Name:    src
Committed By:   manu
Date:           Mon Nov 28 05:33:33 UTC 2011

Modified Files:
        src/lib/libperfuse: ops.c

Log Message:
- Add missing ENOENT or ESTALL when accessing deleted node
- Fix a warning, fix style (80 chars for a line)


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/lib/libperfuse/ops.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.46 src/lib/libperfuse/ops.c:1.47
--- src/lib/libperfuse/ops.c:1.46	Thu Nov 17 02:28:21 2011
+++ src/lib/libperfuse/ops.c	Mon Nov 28 05:33:33 2011
@@ -1,4 +1,4 @@
-/*  $NetBSD: ops.c,v 1.46 2011/11/17 02:28:21 manu Exp $ */
+/*  $NetBSD: ops.c,v 1.47 2011/11/28 05:33:33 manu Exp $ */
 
 /*-
  *  Copyright (c) 2010-2011 Emmanuel Dreyfus. All rights reserved.
@@ -44,6 +44,9 @@
 
 extern int perfuse_diagflags;
 
+#if 0
+static void print_node(const char *, puffs_cookie_t);
+#endif
 static void set_expire(puffs_cookie_t, struct fuse_entry_out *, 
    struct fuse_attr_out *);
 static int attr_expired(puffs_cookie_t);
@@ -102,6 +105,27 @@ const int vttoif_tab[9] = { 
 #define IFTOVT(mode) (iftovt_tab[((mode) & S_IFMT) >> 12])
 #define VTTOIF(indx) (vttoif_tab[(int)(indx)])
 
+#if 0
+static void 
+print_node(func, opc)
+	const char *func;
+	puffs_cookie_t opc;
+{
+	struct puffs_node *pn;
+	struct perfuse_node_data *pnd;
+	struct vattr *vap;
+
+	pn = (struct puffs_node *)opc;
+	pnd = PERFUSE_NODE_DATA(opc);
+	vap = &pn->pn_va;
+
+	printf("%s: \"%s\", opc = %p, nodeid = 0x%"PRIx64" ino = %"PRIu64"\n",
+	       func, pnd->pnd_name, opc, pnd->pnd_nodeid, vap->va_fileid);
+
+	return;
+}
+#endif /* PERFUSE_DEBUG */
+	
 int
 perfuse_node_close_common(pu, opc, mode)
 	struct puffs_usermount *pu;
@@ -432,6 +456,12 @@ node_lookup_common(pu, opc, path, pcr, p
 	size_t len;
 	int error;
 
+	/*
+	 * Prevent further lookups if the parent was removed
+	 */
+	if (PERFUSE_NODE_DATA(opc)->pnd_flags & PND_REMOVED)
+		return ESTALE;
+
 	if (pnp == NULL)
 		DERRX(EX_SOFTWARE, "pnp must be != NULL");
 
@@ -453,8 +483,9 @@ node_lookup_common(pu, opc, path, pcr, p
 #ifdef PERFUSE_DEBUG
 		if (perfuse_diagflags & PDF_FILENAME)
 			DPRINTF("%s: opc = %p, file = \"%s\" found "
-				"cookie = %p, nodeid = 0x%"PRIx64" for \"%s\"\n",
-				__func__, (void *)opc, perfuse_node_path(opc), 
+				"cookie = %p, nodeid = 0x%"PRIx64" "
+				"for \"%s\"\n", __func__, 
+				(void *)opc, perfuse_node_path(opc), 
 				(void *)oldpnd->pnd_pn, oldpnd->pnd_nodeid,	
 				path);
 #endif
@@ -1180,6 +1211,15 @@ perfuse_node_lookup(pu, opc, pni, pcn)
 		return error;
 
 	/*
+	 * Kernel would kill us if the filesystem returned the parent
+	 * itself. If we want to live, hide that!
+	 */
+	if ((opc == (puffs_cookie_t)pn) && (strcmp(pcn->pcn_name, ".") != 0)) {
+		DWARNX("lookup returned parent");
+		return ESTALE;
+	}
+
+	/*
 	 * Removed node
 	 */
 	if (PERFUSE_NODE_DATA(pn)->pnd_flags & PND_REMOVED)
@@ -2337,7 +2377,9 @@ perfuse_node_rmdir(pu, opc, targ, pcn)
 	int error;
 	
 	pnd = PERFUSE_NODE_DATA(opc);
-	if (pnd->pnd_flags & PND_REMOVED)
+
+	if ((pnd->pnd_flags & PND_REMOVED) ||
+	    (PERFUSE_NODE_DATA(targ)->pnd_flags & PND_REMOVED))
 		return ENOENT;
 
 	/*
@@ -2884,7 +2926,7 @@ perfuse_node_advlock(pu, opc, id, op, fl
 	fli->lk.pid = fl->l_pid;
 	fli->lk_flags = (flags & F_FLOCK) ? FUSE_LK_FLOCK : 0;
 
-	owner = (uint64_t)(vaddr_t)id;
+	owner = (uint32_t)(vaddr_t)id;
 
 #ifdef PERFUSE_DEBUG
 	if (perfuse_diagflags & PDF_FH)

Reply via email to