CVS commit: [netbsd-5] src/sys/fs/puffs

2012-01-25 Thread Jeff Rizzo
Module Name:src
Committed By:   riz
Date:   Wed Jan 25 20:51:15 UTC 2012

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_node.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #1714):
sys/fs/puffs/puffs_node.c: revision 1.23
Fix a race condition where the filesystem lookups a vnode that is
being recycled, producing ENOENT while the file does exist.
Approved by yamt


To generate a diff of this commit:
cvs rdiff -u -r1.13.10.3 -r1.13.10.4 src/sys/fs/puffs/puffs_node.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_node.c
diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.3 src/sys/fs/puffs/puffs_node.c:1.13.10.4
--- src/sys/fs/puffs/puffs_node.c:1.13.10.3	Wed Nov  2 20:11:12 2011
+++ src/sys/fs/puffs/puffs_node.c	Wed Jan 25 20:51:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $	*/
+/*	$NetBSD: puffs_node.c,v 1.13.10.4 2012/01/25 20:51:15 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.4 2012/01/25 20:51:15 riz Exp $");
 
 #include 
 #include 
@@ -321,8 +321,14 @@ puffs_makeroot(struct puffs_mount *pmp)
 	if (vp) {
 		mutex_enter(&vp->v_interlock);
 		mutex_exit(&pmp->pmp_lock);
-		if (vget(vp, LK_INTERLOCK) == 0)
+		switch (vget(vp, LK_INTERLOCK)) {
+		case ENOENT:
+			goto retry;
+		case 0:
 			return 0;
+		default:
+			break;
+		}
 	} else
 		mutex_exit(&pmp->pmp_lock);
 
@@ -387,6 +393,7 @@ puffs_cookie2vnode(struct puffs_mount *p
 		return 0;
 	}
 
+ retry:
 	mutex_enter(&pmp->pmp_lock);
 	pnode = puffs_cookie2pnode(pmp, ck);
 	if (pnode == NULL) {
@@ -406,8 +413,14 @@ puffs_cookie2vnode(struct puffs_mount *p
 	vgetflags = LK_INTERLOCK;
 	if (lock)
 		vgetflags |= LK_EXCLUSIVE | LK_RETRY;
-	if ((rv = vget(vp, vgetflags)))
+	switch (rv = vget(vp, vgetflags)) {
+	case ENOENT:
+		goto retry;
+	case 0:
+		break;
+	default:
 		return rv;
+	}
 
 	*vpp = vp;
 	return 0;



CVS commit: [netbsd-5] src/sys/fs/puffs

2011-11-02 Thread Jeff Rizzo
Module Name:src
Committed By:   riz
Date:   Wed Nov  2 20:11:12 UTC 2011

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_msgif.c puffs_node.c puffs_vfsops.c
puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #1679):
sys/fs/puffs/puffs_vnops.c: revision 1.157
sys/fs/puffs/puffs_vnops.c: revision 1.158
sys/fs/puffs/puffs_vnops.c: revision 1.159
sys/fs/puffs/puffs_vfsops.c: revision 1.97
sys/fs/puffs/puffs_vfsops.c: revision 1.99
sys/fs/puffs/puffs_vnops.c: revision 1.160
sys/fs/puffs/puffs_vfsops.c: revision 1.100
sys/miscfs/syncfs/sync_subr.c: revision 1.47
sys/fs/puffs/puffs_node.c: revision 1.21
sys/fs/puffs/puffs_node.c: revision 1.22
sys/fs/puffs/puffs_msgif.c: revision 1.88
sys/fs/puffs/puffs_msgif.c: revision 1.89
sys/fs/puffs/puffs_vnops.c: revision 1.156
Make sure ioflush does not sleep in PUFFS code path, waiting for a mutex,
a memory allocation, or a response from the filesystem.
This avoids deadlocks in the following situations:
1) when memory is low: ioflush waits the fileystem, the fielsystem waits
   for memory
2) when the filesystem does not respond (e.g.: network outage ona
   distributed filesystem)
Fix the build that was broken by struct lwp *updateproc reference in
RUMP-visible code. Instead of checking that updateproc (aka ioflush,
aka syncer) will not sleep in PUFFS code, I check for any kernel thread:
after all none of them are designed to hang awaiting for a remote filesystem
operation to complete.
Roll back the change that forced kernel threads to not sleep in PUFFS.
The change does not make consensus, since only pagedaemon should need it.
Other threads will tolerate sleeping, and problems here are only symptoms
that something is going wrong in memory management. The cause, not the
symptoms, need to be fixed.
Make sure pagedaemon does not sleep for memory in puffs_vnop_sleep.
Add KASSERT on any sleeping memory allocation to check it cannot happen again.
Remove #ifdef DIAGNOSTIC guards around KASSERT, as the macro contains them


To generate a diff of this commit:
cvs rdiff -u -r1.72.4.4 -r1.72.4.5 src/sys/fs/puffs/puffs_msgif.c
cvs rdiff -u -r1.13.10.2 -r1.13.10.3 src/sys/fs/puffs/puffs_node.c
cvs rdiff -u -r1.81.8.2 -r1.81.8.3 src/sys/fs/puffs/puffs_vfsops.c
cvs rdiff -u -r1.129.4.10 -r1.129.4.11 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_msgif.c
diff -u src/sys/fs/puffs/puffs_msgif.c:1.72.4.4 src/sys/fs/puffs/puffs_msgif.c:1.72.4.5
--- src/sys/fs/puffs/puffs_msgif.c:1.72.4.4	Fri Jul 15 23:41:13 2011
+++ src/sys/fs/puffs/puffs_msgif.c	Wed Nov  2 20:11:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.c,v 1.72.4.4 2011/07/15 23:41:13 riz Exp $	*/
+/*	$NetBSD: puffs_msgif.c,v 1.72.4.5 2011/11/02 20:11:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.4 2011/07/15 23:41:13 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.5 2011/11/02 20:11:12 riz Exp $");
 
 #include 
 #include 
@@ -45,6 +45,8 @@ __KERNEL_RCSID(0, "$NetBSD: puffs_msgif.
 #include 
 #include 
 
+#include 
+
 #include 
 
 #include 
@@ -132,6 +134,7 @@ puffs_msgpark_alloc(int waitok)
 {
 	struct puffs_msgpark *park;
 
+	KASSERT(curlwp != uvm.pagedaemon_lwp || !waitok);
 	park = pool_cache_get(parkpc, waitok ? PR_WAITOK : PR_NOWAIT);
 	if (park == NULL)
 		return park;
@@ -228,6 +231,7 @@ puffs_msgmem_alloc(size_t len, struct pu
 	struct puffs_msgpark *park;
 	void *m;
 
+	KASSERT(curlwp != uvm.pagedaemon_lwp || !cansleep);
 	m = kmem_zalloc(len, cansleep ? KM_SLEEP : KM_NOSLEEP);
 	if (m == NULL) {
 		KASSERT(cansleep == 0);
@@ -935,6 +939,7 @@ puffsop_flush(struct puffs_mount *pmp, s
 	struct componentname *pf_cn;
 	char *name;
 		/* get comfortab^Wcomponentname */
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
 		pf_cn = kmem_alloc(componentname);
 		memset(pf_cn, 0, sizeof(struct componentname));
 		break;
@@ -1011,6 +1016,7 @@ puffs_msgif_dispatch(void *this, struct 
 		}
 		pf = (struct puffs_flush *)preq;
 
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
 		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
 		memcpy(&psopr->psopr_pf, pf, sizeof(*pf));
 		psopr->psopr_sopreq = PUFFS_SOPREQ_FLUSH;

Index: src/sys/fs/puffs/puffs_node.c
diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.2 src/sys/fs/puffs/puffs_node.c:1.13.10.3
--- src/sys/fs/puffs/puffs_node.c:1.13.10.2	Sat Sep 17 18:53:30 2011
+++ src/sys/fs/puffs/puffs_node.c	Wed Nov  2 20:11:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $	*/
+/*	$NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights

CVS commit: [netbsd-5] src/sys/fs/puffs

2011-09-17 Thread Manuel Bouyer
Module Name:src
Committed By:   bouyer
Date:   Sat Sep 17 18:53:30 UTC 2011

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_node.c puffs_sys.h puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #1666):
sys/fs/puffs/puffs_sys.h: revision 1.78 via patch
sys/fs/puffs/puffs_node.c: revision 1.20 via patch
sys/fs/puffs/puffs_vnops.c: revision 1.155 via patch
Add a mutex for operations that touch size (setattr, getattr, write, fsync).
This is required to avoid data corruption bugs, where a getattr slices
itself within a setattr operation, and sets the size to the stall value
it got from the filesystem. That value is smaller than the one set by
setattr, and the call to uvm_vnp_setsize() trigged a spurious truncate.
The result is a chunk of zeroed data in the file.
Such a situation can easily happen when the ioflush thread issue a
VOP_FSYNC/puffs_vnop_sync/flushvncache/dosetattrn while andother process
do a sys_stat/VOP_GETATTR/puffs_vnop_getattr.
This mutex on size operation can be removed the day we decide VOP_GETATTR
has to operated on a locked vnode, since the other operations that touch
size already require that.


To generate a diff of this commit:
cvs rdiff -u -r1.13.10.1 -r1.13.10.2 src/sys/fs/puffs/puffs_node.c
cvs rdiff -u -r1.70.20.2 -r1.70.20.3 src/sys/fs/puffs/puffs_sys.h
cvs rdiff -u -r1.129.4.9 -r1.129.4.10 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_node.c
diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.1 src/sys/fs/puffs/puffs_node.c:1.13.10.2
--- src/sys/fs/puffs/puffs_node.c:1.13.10.1	Sat Oct  3 23:11:27 2009
+++ src/sys/fs/puffs/puffs_node.c	Sat Sep 17 18:53:30 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $	*/
+/*	$NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $");
 
 #include 
 #include 
@@ -155,6 +155,7 @@
 		}
 		KASSERT(pnc != NULL);
 	}
+	mutex_init(&pnode->pn_sizemtx, MUTEX_DEFAULT, IPL_NONE);
 	mutex_exit(&pmp->pmp_lock);
 
 	vp->v_data = pnode;
@@ -463,6 +464,7 @@
 	if (--pn->pn_refcount == 0) {
 		mutex_exit(&pn->pn_mtx);
 		mutex_destroy(&pn->pn_mtx);
+		mutex_destroy(&pn->pn_sizemtx);
 		seldestroy(&pn->pn_sel);
 		pool_put(&puffs_pnpool, pn);
 	} else {

Index: src/sys/fs/puffs/puffs_sys.h
diff -u src/sys/fs/puffs/puffs_sys.h:1.70.20.2 src/sys/fs/puffs/puffs_sys.h:1.70.20.3
--- src/sys/fs/puffs/puffs_sys.h:1.70.20.2	Sat Jun 18 16:19:39 2011
+++ src/sys/fs/puffs/puffs_sys.h	Sat Sep 17 18:53:29 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_sys.h,v 1.70.20.2 2011/06/18 16:19:39 bouyer Exp $	*/
+/*	$NetBSD: puffs_sys.h,v 1.70.20.3 2011/09/17 18:53:29 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
@@ -205,6 +205,8 @@
 	voff_t		pn_serversize;
 	struct lockf *  pn_lockf;
 
+	kmutex_t	pn_sizemtx;	/* size modification mutex	*/
+
 	LIST_ENTRY(puffs_node) pn_hashent;
 };
 

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.9 src/sys/fs/puffs/puffs_vnops.c:1.129.4.10
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.9	Sun Jul 17 15:36:03 2011
+++ src/sys/fs/puffs/puffs_vnops.c	Sat Sep 17 18:53:30 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.9 2011/07/17 15:36:03 riz Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.10 2011/09/17 18:53:30 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.9 2011/07/17 15:36:03 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.10 2011/09/17 18:53:30 bouyer Exp $");
 
 #include 
 #include 
@@ -856,6 +856,18 @@
 	struct puffs_node *pn = VPTOPP(vp);
 	int error = 0;
 
+	/*
+	 * A lock is required so that we do not race with 
+	 * setattr, write and fsync when changing vp->v_size.
+	 * This is critical, since setting a stall smaler value
+	 * triggers a file truncate in uvm_vnp_setsize(), which
+	 * most of the time means data corruption (a chunk of
+	 * data is replaced by zeroes). This can be removed if
+	 * we decide one day that VOP_GETATTR must operate on
+	 * a locked vnode.
+	 */
+	mutex_enter(&pn->pn_sizemtx);
+
 	REFPN(pn);
 	vap = ap->a_vap;
 
@@ -906,6 +918,9 @@
  out:
 	puffs_releasenode(pn);
 	PUFFS_MSG_RELEASE(getattr);
+	
+	mutex_exit(&pn->pn_sizemtx);
+
 	return error;
 }
 
@@ -919,6 +934,8 @@
 	struct puffs_node *pn = vp->v_data;
 	int error = 0;
 
+	KASSERT(!(flags & SETATTR_CHSIZE) || mutex_owned(&pn->pn_sizemtx));
+
 	if ((vp->v_mount->mnt_flag & MNT_RDONLY) &&
 

CVS commit: [netbsd-5] src/sys/fs/puffs

2011-06-18 Thread Manuel Bouyer
Module Name:src
Committed By:   bouyer
Date:   Sat Jun 18 16:19:39 UTC 2011

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_sys.h

Log Message:
Pull up following revision(s) (requested by manu in ticket #1623):
lib/libpuffs/puffs.c: revision 1.116
sys/fs/puffs/puffs_vnops.c: revision 1.151
Call advlock method if supplied


To generate a diff of this commit:
cvs rdiff -u -r1.70.20.1 -r1.70.20.2 src/sys/fs/puffs/puffs_sys.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_sys.h
diff -u src/sys/fs/puffs/puffs_sys.h:1.70.20.1 src/sys/fs/puffs/puffs_sys.h:1.70.20.2
--- src/sys/fs/puffs/puffs_sys.h:1.70.20.1	Sat Jan  9 01:22:57 2010
+++ src/sys/fs/puffs/puffs_sys.h	Sat Jun 18 16:19:39 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_sys.h,v 1.70.20.1 2010/01/09 01:22:57 snj Exp $	*/
+/*	$NetBSD: puffs_sys.h,v 1.70.20.2 2011/06/18 16:19:39 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
@@ -203,6 +203,7 @@
 	u_quad_t	pn_mc_size;
 
 	voff_t		pn_serversize;
+	struct lockf *  pn_lockf;
 
 	LIST_ENTRY(puffs_node) pn_hashent;
 };



CVS commit: [netbsd-5] src/sys/fs/puffs

2011-05-19 Thread Manuel Bouyer
Module Name:src
Committed By:   bouyer
Date:   Thu May 19 21:00:16 UTC 2011

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_msgif.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #1604):
sys/fs/puffs/puffs_msgif.c: revision 1.84 via patch
Apply patch from PR kern/44093 by yamt:
Interrupt server wait only on certain signals (same set at nfs -i)
instead of all signals.  According to the PR this helps with
"git clone" run on a puffs file system.


To generate a diff of this commit:
cvs rdiff -u -r1.72.4.1 -r1.72.4.2 src/sys/fs/puffs/puffs_msgif.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_msgif.c
diff -u src/sys/fs/puffs/puffs_msgif.c:1.72.4.1 src/sys/fs/puffs/puffs_msgif.c:1.72.4.2
--- src/sys/fs/puffs/puffs_msgif.c:1.72.4.1	Sat Jan  9 01:22:57 2010
+++ src/sys/fs/puffs/puffs_msgif.c	Thu May 19 21:00:16 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $	*/
+/*	$NetBSD: puffs_msgif.c,v 1.72.4.2 2011/05/19 21:00:16 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.2 2011/05/19 21:00:16 bouyer Exp $");
 
 #include 
 #include 
@@ -352,17 +352,30 @@
 	if (__predict_false((park->park_flags & PARKFLAG_WANTREPLY)
 	   && (park->park_flags & PARKFLAG_CALL) == 0
 	   && (l->l_flag & LW_PENDSIG) != 0 && sigispending(l, 0))) {
-		park->park_flags |= PARKFLAG_HASERROR;
-		preq->preq_rv = EINTR;
-		if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN
-		&& (preq->preq_optype == PUFFS_VN_INACTIVE
-		 || preq->preq_optype == PUFFS_VN_RECLAIM)) {
-			park->park_preq->preq_opclass |= PUFFSOPFLAG_FAF;
-			park->park_flags &= ~PARKFLAG_WANTREPLY;
-			DPRINTF(("puffs_msg_enqueue: converted to FAF %p\n",
-			park));
-		} else {
-			return;
+	   sigset_t ss;
+
+	   /*
+		* see the comment about signals in puffs_msg_wait.
+		*/
+	   sigpending1(l, &ss);
+	   if (sigismember(&ss, SIGINT) ||
+		   sigismember(&ss, SIGTERM) ||
+		   sigismember(&ss, SIGKILL) ||
+		   sigismember(&ss, SIGHUP) ||
+		   sigismember(&ss, SIGQUIT)) {
+		   park->park_flags |= PARKFLAG_HASERROR;
+		   preq->preq_rv = EINTR;
+		   if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN
+			   && (preq->preq_optype == PUFFS_VN_INACTIVE
+			|| preq->preq_optype == PUFFS_VN_RECLAIM)) {
+			   park->park_preq->preq_opclass |=
+   PUFFSOPFLAG_FAF;
+			   park->park_flags &= ~PARKFLAG_WANTREPLY;
+			   DPRINTF(("puffs_msg_enqueue: "
+   "converted to FAF %p\n", park));
+		   } else {
+			   return;
+		   }
 		}
 	}
 
@@ -431,11 +444,31 @@
 int
 puffs_msg_wait(struct puffs_mount *pmp, struct puffs_msgpark *park)
 {
-	struct puffs_req *preq = park->park_preq; /* XXX: hmmm */
+	lwp_t *l = curlwp;
+	proc_t *p = l->l_proc;
+struct puffs_req *preq = park->park_preq; /* XXX: hmmm */
+	sigset_t ss;
+	sigset_t oss;
 	struct mount *mp = PMPTOMP(pmp);
 	int error = 0;
 	int rv;
 
+	/*
+	 * block unimportant signals.
+	 *
+	 * The set of "important" signals here was chosen to be same as
+	 * nfs interruptible mount.
+	 */
+	sigfillset(&ss);
+	sigdelset(&ss, SIGINT);
+	sigdelset(&ss, SIGTERM);
+	sigdelset(&ss, SIGKILL);
+	sigdelset(&ss, SIGHUP);
+	sigdelset(&ss, SIGQUIT);
+	mutex_enter(p->p_lock);
+	sigprocmask1(l, SIG_BLOCK, &ss, &oss);
+	mutex_exit(p->p_lock);
+
 	mutex_enter(&pmp->pmp_lock);
 	puffs_mp_reference(pmp);
 	mutex_exit(&pmp->pmp_lock);
@@ -523,6 +556,10 @@
 	puffs_mp_release(pmp);
 	mutex_exit(&pmp->pmp_lock);
 
+	mutex_enter(p->p_lock);
+	sigprocmask1(l, SIG_SETMASK, &oss, NULL);
+	mutex_exit(p->p_lock);
+
 	return rv;
 }
 



CVS commit: [netbsd-5] src/sys/fs/puffs

2010-01-16 Thread Manuel Bouyer
Module Name:src
Committed By:   bouyer
Date:   Sat Jan 16 17:52:13 UTC 2010

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1244):
sys/fs/puffs/puffs_vnops.c: revision 1.142
Since VOP_GETATTR() does not require a locked vnode, resolve and
reference the puffs_node before sending the request to the file
server.  This diminishes the window where the inode can be reclaimed
and be invalidated before it is accessed (but does not completely
eliminate the race, as that is a caller problem which we cannot
fix here).


To generate a diff of this commit:
cvs rdiff -u -r1.129.4.6 -r1.129.4.7 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.6 src/sys/fs/puffs/puffs_vnops.c:1.129.4.7
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.6	Fri Dec 18 05:58:26 2009
+++ src/sys/fs/puffs/puffs_vnops.c	Sat Jan 16 17:52:13 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.7 2010/01/16 17:52:13 bouyer Exp $");
 
 #include 
 #include 
@@ -837,9 +837,10 @@
 	struct mount *mp = vp->v_mount;
 	struct puffs_mount *pmp = MPTOPUFFSMP(mp);
 	struct vattr *vap, *rvap;
-	struct puffs_node *pn;
+	struct puffs_node *pn = VPTOPP(vp);
 	int error = 0;
 
+	REFPN(pn);
 	vap = ap->a_vap;
 
 	PUFFS_MSG_ALLOC(vn, getattr);
@@ -870,7 +871,6 @@
 	(void) memcpy(vap, rvap, sizeof(struct vattr));
 	vap->va_fsid = mp->mnt_stat.f_fsidx.__fsid_val[0];
 
-	pn = VPTOPP(vp);
 	if (pn->pn_stat & PNODE_METACACHE_ATIME)
 		vap->va_atime = pn->pn_mc_atime;
 	if (pn->pn_stat & PNODE_METACACHE_CTIME)
@@ -888,6 +888,7 @@
 	}
 
  out:
+	puffs_releasenode(pn);
 	PUFFS_MSG_RELEASE(getattr);
 	return error;
 }



CVS commit: [netbsd-5] src/sys/fs/puffs

2010-01-08 Thread Soren Jacobsen
Module Name:src
Committed By:   snj
Date:   Sat Jan  9 01:22:58 UTC 2010

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_msgif.c puffs_sys.h puffs_vfsops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1212):
sys/fs/puffs/puffs_msgif.c: revision 1.76 via patch
sys/fs/puffs/puffs_sys.h: revision 1.73 via patch
sys/fs/puffs/puffs_vfsops.c: revision 1.84 via patch
Process flush requests from the file server in a separate thread
context.  This fixes a long-standing but seldomly seen deadlock,
where the kernel was holding pages busy (due to e.g. readahead
request) while waiting for the server to respond, and the server
made a callback into the kernel asking to invalidate those pages.
... or, well, theoretically fixes, since I didn't have any reliable
way of repeating the deadlock and I think I saw it only twice.


To generate a diff of this commit:
cvs rdiff -u -r1.72 -r1.72.4.1 src/sys/fs/puffs/puffs_msgif.c
cvs rdiff -u -r1.70 -r1.70.20.1 src/sys/fs/puffs/puffs_sys.h
cvs rdiff -u -r1.81 -r1.81.8.1 src/sys/fs/puffs/puffs_vfsops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_msgif.c
diff -u src/sys/fs/puffs/puffs_msgif.c:1.72 src/sys/fs/puffs/puffs_msgif.c:1.72.4.1
--- src/sys/fs/puffs/puffs_msgif.c:1.72	Thu Sep 25 14:17:29 2008
+++ src/sys/fs/puffs/puffs_msgif.c	Sat Jan  9 01:22:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.c,v 1.72 2008/09/25 14:17:29 ad Exp $	*/
+/*	$NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72 2008/09/25 14:17:29 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.1 2010/01/09 01:22:57 snj Exp $");
 
 #include 
 #include 
@@ -864,8 +864,8 @@
 	int rv, flags = 0;
 
 	if (pf->pf_req.preq_pth.pth_framelen != sizeof(struct puffs_flush)) {
-		rv = EINVAL;
-		goto out;
+		puffs_msg_sendresp(pmp, &pf->pf_req, EINVAL); /* E2SMALL */
+		return;
 	}
 
 	/* XXX: slurry */
@@ -949,8 +949,8 @@
 {
 	struct puffs_mount *pmp = this;
 	struct puffs_req *preq = (struct puffs_req *)pth;
+	struct puffs_sopreq *psopr;
 
-	/* XXX: need to send error to userspace */
 	if (pth->pth_framelen < sizeof(struct puffs_req)) {
 		puffs_msg_sendresp(pmp, preq, EINVAL); /* E2SMALL */
 		return 0;
@@ -962,10 +962,28 @@
 		DPRINTF(("dispatch: vn/vfs message 0x%x\n", preq->preq_optype));
 		puffsop_msg(pmp, preq);
 		break;
-	case PUFFSOP_FLUSH:
-		DPRINTF(("dispatch: flush 0x%x\n", preq->preq_optype));
-		puffsop_flush(pmp, (struct puffs_flush *)preq);
-		break;
+	case PUFFSOP_FLUSH: /* process in sop thread */
+	{
+		struct puffs_flush *pf;
+
+ 		DPRINTF(("dispatch: flush 0x%x\n", preq->preq_optype));
+
+		if (preq->preq_pth.pth_framelen != sizeof(struct puffs_flush)) {
+			puffs_msg_sendresp(pmp, preq, EINVAL); /* E2SMALL */
+			break;
+		}
+		pf = (struct puffs_flush *)preq;
+
+		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
+		memcpy(&psopr->psopr_pf, pf, sizeof(*pf));
+		psopr->psopr_sopreq = PUFFS_SOPREQ_FLUSH;
+
+		mutex_enter(&pmp->pmp_sopmtx);
+		TAILQ_INSERT_TAIL(&pmp->pmp_sopreqs, psopr, psopr_entries);
+		cv_signal(&pmp->pmp_sopcv);
+		mutex_exit(&pmp->pmp_sopmtx);
+ 		break;
+	}
 	case PUFFSOP_SUSPEND:
 		DPRINTF(("dispatch: suspend\n"));
 		puffsop_suspend(pmp);
@@ -978,6 +996,60 @@
 
 	return 0;
 }
+ 
+/*
+ * Work loop for thread processing all ops from server which
+ * cannot safely be handled in caller context.  This includes
+ * everything which might need a lock currently "held" by the file
+ * server, i.e. a long-term kernel lock which will be released only
+ * once the file server acknowledges a request
+ */
+void
+puffs_sop_thread(void *arg)
+{
+	struct puffs_mount *pmp = arg;
+	struct puffs_sopreq *psopr;
+	struct puffs_req *preq;
+	bool keeprunning = true;
+
+	mutex_enter(&pmp->pmp_sopmtx);
+	while (keeprunning) {
+		while ((psopr = TAILQ_FIRST(&pmp->pmp_sopreqs)) == NULL)
+			cv_wait(&pmp->pmp_sopcv, &pmp->pmp_sopmtx);
+		TAILQ_REMOVE(&pmp->pmp_sopreqs, psopr, psopr_entries);
+		mutex_exit(&pmp->pmp_sopmtx);
+
+		preq = &psopr->psopr_preq;
+		switch (psopr->psopr_sopreq) {
+		case PUFFS_SOPREQ_EXIT:
+			keeprunning = false;
+			break;
+		case PUFFS_SOPREQ_FLUSH:
+			puffsop_flush(pmp, (struct puffs_flush *)preq);
+			break;
+		}
+
+		kmem_free(psopr, sizeof(*psopr));
+		mutex_enter(&pmp->pmp_sopmtx);
+	}
+
+	/*
+	 * Purge remaining ops.  could send error, but that is highly
+	 * unlikely to reach the caller.
+	 */
+	while ((psopr = TAILQ_FIRST(&pmp->pmp_sopreqs)) != NULL) {
+		TAILQ_REMOVE(&pmp->pmp_sopreqs, psopr, psopr_entries);
+		mutex_exit(&pmp->pmp_sopmtx);
+		kmem_free(psopr, sizeof(*psopr));
+		mutex_enter(&pmp->pmp_sopmtx);
+	}
+
+	pmp->pmp_sopthrcount--;
+	cv_signal(&pmp->pmp_sopcv);
+	mutex_exit(&pmp->pmp

CVS commit: [netbsd-5] src/sys/fs/puffs

2009-12-17 Thread Soren Jacobsen
Module Name:src
Committed By:   snj
Date:   Fri Dec 18 05:58:26 UTC 2009

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1184):
sys/fs/puffs/puffs_vnops.c: revision 1.141 via patch
Push all information cached in the vnode to the file server before
issuing INACTIVE.  PR kern/42194.
Also, send setattr in fsync asynchronously if FSYNC_WAIT is not set.


To generate a diff of this commit:
cvs rdiff -u -r1.129.4.5 -r1.129.4.6 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.5 src/sys/fs/puffs/puffs_vnops.c:1.129.4.6
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.5	Sat Nov 28 16:00:16 2009
+++ src/sys/fs/puffs/puffs_vnops.c	Fri Dec 18 05:58:26 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.6 2009/12/18 05:58:26 snj Exp $");
 
 #include 
 #include 
@@ -402,6 +402,8 @@
 			   struct componentname *);
 static void callinactive(struct puffs_mount *, puffs_cookie_t, int);
 static void callreclaim(struct puffs_mount *, puffs_cookie_t);
+static int  flushvncache(struct vnode *, off_t, off_t, bool);
+
 
 #define PUFFS_ABORT_LOOKUP	1
 #define PUFFS_ABORT_CREATE	2
@@ -890,13 +892,15 @@
 	return error;
 }
 
+#define SETATTR_CHSIZE	0x01
+#define SETATTR_ASYNC	0x02
 static int
-dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int chsize)
+dosetattr(struct vnode *vp, struct vattr *vap, kauth_cred_t cred, int flags)
 {
 	PUFFS_MSG_VARS(vn, setattr);
 	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
 	struct puffs_node *pn = vp->v_data;
-	int error;
+	int error = 0;
 
 	if ((vp->v_mount->mnt_flag & MNT_RDONLY) &&
 	(vap->va_uid != (uid_t)VNOVAL || vap->va_gid != (gid_t)VNOVAL
@@ -935,16 +939,24 @@
 	puffs_credcvt(&setattr_msg->pvnr_cred, cred);
 	puffs_msg_setinfo(park_setattr, PUFFSOP_VN,
 	PUFFS_VN_SETATTR, VPTOPNC(vp));
+	if (flags & SETATTR_ASYNC)
+		puffs_msg_setfaf(park_setattr);
 
-	PUFFS_MSG_ENQUEUEWAIT2(pmp, park_setattr, vp->v_data, NULL, error);
+	puffs_msg_enqueue(pmp, park_setattr);
+	if ((flags & SETATTR_ASYNC) == 0)
+		error = puffs_msg_wait2(pmp, park_setattr, vp->v_data, NULL);
 	PUFFS_MSG_RELEASE(setattr);
-	error = checkerr(pmp, error, __func__);
-	if (error)
-		return error;
+	if ((flags & SETATTR_ASYNC) == 0) {
+		error = checkerr(pmp, error, __func__);
+		if (error)
+			return error;
+	} else {
+		error = 0;
+	}
 
 	if (vap->va_size != VNOVAL) {
 		pn->pn_serversize = vap->va_size;
-		if (chsize)
+		if (flags & SETATTR_CHSIZE)
 			uvm_vnp_setsize(vp, vap->va_size);
 	}
 
@@ -961,7 +973,7 @@
 		kauth_cred_t a_cred;
 	} */ *ap = v;
 
-	return dosetattr(ap->a_vp, ap->a_vap, ap->a_cred, 1);
+	return dosetattr(ap->a_vp, ap->a_vap, ap->a_cred, SETATTR_CHSIZE);
 }
 
 static __inline int
@@ -1013,6 +1025,7 @@
 	pnode = vp->v_data;
 
 	if (doinact(pmp, pnode->pn_stat & PNODE_DOINACT)) {
+		flushvncache(vp, 0, 0, false);
 		PUFFS_MSG_ALLOC(vn, inactive);
 		puffs_msg_setinfo(park_inactive, PUFFSOP_VN,
 		PUFFS_VN_INACTIVE, VPTOPNC(vp));
@@ -1273,30 +1286,18 @@
 	}
 }
 
-int
-puffs_vnop_fsync(void *v)
+static int
+flushvncache(struct vnode *vp, off_t offlo, off_t offhi, bool wait)
 {
-	struct vop_fsync_args /* {
-		const struct vnodeop_desc *a_desc;
-		struct vnode *a_vp;
-		kauth_cred_t a_cred;
-		int a_flags;
-		off_t a_offlo;
-		off_t a_offhi;
-	} */ *ap = v;
-	PUFFS_MSG_VARS(vn, fsync);
-	struct vnode *vp = ap->a_vp;
-	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
-	struct puffs_node *pn;
+	struct puffs_node *pn = VPTOPP(vp);
 	struct vattr va;
-	int pflags, error, dofaf;
-
-	pn = VPTOPP(vp);
+	int pflags, error;
 
 	/* flush out information from our metacache, see vop_setattr */
 	if (pn->pn_stat & PNODE_METACACHE_MASK) {
 		vattr_null(&va);
-		error = VOP_SETATTR(vp, &va, FSCRED); 
+		error = dosetattr(vp, &va, FSCRED,
+		SETATTR_CHSIZE | (wait ? 0 : SETATTR_ASYNC));
 		if (error)
 			return error;
 	}
@@ -1305,11 +1306,30 @@
 	 * flush pages to avoid being overly dirty
 	 */
 	pflags = PGO_CLEANIT;
-	if (ap->a_flags & FSYNC_WAIT)
+	if (wait)
 		pflags |= PGO_SYNCIO;
 	mutex_enter(&vp->v_interlock);
-	error = VOP_PUTPAGES(vp, trunc_page(ap->a_offlo),
-	round_page(ap->a_offhi), pflags);
+	return VOP_PUTPAGES(vp, trunc_page(offlo), round_page(offhi), pflags);
+}
+
+int
+puffs_vnop_fsync(void *v)
+{
+	struct vop_fsync_args /* {
+		const struct vnodeop_desc *a_desc;
+		struct vnode *a_vp;
+		kau

CVS commit: [netbsd-5] src/sys/fs/puffs

2009-12-14 Thread Stephen Borrill
Module Name:src
Committed By:   sborrill
Date:   Mon Dec 14 19:36:57 UTC 2009

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_msgif.h

Log Message:
Revert previous version bump which should not have been in the supplied
patch. This maintains compatibility between 5.0 and 5.1 (at the cost of
needing userland libraries recompiled if one's been tracking netbsd-5).


To generate a diff of this commit:
cvs rdiff -u -r1.65.20.1 -r1.65.20.2 src/sys/fs/puffs/puffs_msgif.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_msgif.h
diff -u src/sys/fs/puffs/puffs_msgif.h:1.65.20.1 src/sys/fs/puffs/puffs_msgif.h:1.65.20.2
--- src/sys/fs/puffs/puffs_msgif.h:1.65.20.1	Sun Oct 18 12:46:07 2009
+++ src/sys/fs/puffs/puffs_msgif.h	Mon Dec 14 19:36:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.h,v 1.65.20.1 2009/10/18 12:46:07 sborrill Exp $	*/
+/*	$NetBSD: puffs_msgif.h,v 1.65.20.2 2009/12/14 19:36:57 sborrill Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -102,7 +102,7 @@
 #define PUFFS_ERR_MAX PUFFS_ERR_VPTOFH
 
 #define PUFFSDEVELVERS	0x8000
-#define PUFFSVERSION	28
+#define PUFFSVERSION	26
 #define PUFFSNAMESIZE	32
 
 #define PUFFS_TYPEPREFIX "puffs|"



CVS commit: [netbsd-5] src/sys/fs/puffs

2009-11-28 Thread Manuel Bouyer
Module Name:src
Committed By:   bouyer
Date:   Sat Nov 28 16:00:17 UTC 2009

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1154):
sys/fs/puffs/puffs_vnops.c: revision 1.140
Send VOP_ABORTOP() in case attempting cross-dev rename, part of
PR kern/42210.  Also, fix a memory management error in said case.


To generate a diff of this commit:
cvs rdiff -u -r1.129.4.4 -r1.129.4.5 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.4 src/sys/fs/puffs/puffs_vnops.c:1.129.4.5
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.4	Sat Nov 28 15:56:08 2009
+++ src/sys/fs/puffs/puffs_vnops.c	Sat Nov 28 16:00:16 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.5 2009/11/28 16:00:16 bouyer Exp $");
 
 #include 
 #include 
@@ -1711,19 +1711,23 @@
 		struct componentname *a_tcnp;
 	} */ *ap = v;
 	PUFFS_MSG_VARS(vn, rename);
-	struct vnode *fdvp = ap->a_fdvp;
+	struct vnode *fdvp = ap->a_fdvp, *fvp = ap->a_fvp;
+	struct vnode *tdvp = ap->a_tdvp, *tvp = ap->a_tvp;
 	struct puffs_node *fpn = ap->a_fvp->v_data;
 	struct puffs_mount *pmp = MPTOPUFFSMP(fdvp->v_mount);
 	int error;
+	bool doabort = true;
 
-	if (ap->a_fvp->v_mount != ap->a_tdvp->v_mount)
+	if ((fvp->v_mount != tdvp->v_mount) ||
+	(tvp && (fvp->v_mount != tvp->v_mount))) {
 		ERROUT(EXDEV);
+	}
 
 	PUFFS_MSG_ALLOC(vn, rename);
-	rename_msg->pvnr_cookie_src = VPTOPNC(ap->a_fvp);
-	rename_msg->pvnr_cookie_targdir = VPTOPNC(ap->a_tdvp);
-	if (ap->a_tvp)
-		rename_msg->pvnr_cookie_targ = VPTOPNC(ap->a_tvp);
+	rename_msg->pvnr_cookie_src = VPTOPNC(fvp);
+	rename_msg->pvnr_cookie_targdir = VPTOPNC(tdvp);
+	if (tvp)
+		rename_msg->pvnr_cookie_targ = VPTOPNC(tvp);
 	else
 		rename_msg->pvnr_cookie_targ = NULL;
 	puffs_makecn(&rename_msg->pvnr_cn_src, &rename_msg->pvnr_cn_src_cred,
@@ -1734,6 +1738,8 @@
 	PUFFS_VN_RENAME, VPTOPNC(fdvp));
 
 	PUFFS_MSG_ENQUEUEWAIT2(pmp, park_rename, fdvp->v_data, NULL, error);
+	doabort = false;
+	PUFFS_MSG_RELEASE(rename);
 	error = checkerr(pmp, error, __func__);
 
 	/*
@@ -1744,16 +1750,19 @@
 		puffs_updatenode(fpn, PUFFS_UPDATECTIME, 0);
 
  out:
-	PUFFS_MSG_RELEASE(rename);
-	if (ap->a_tvp != NULL)
-		vput(ap->a_tvp);
-	if (ap->a_tdvp == ap->a_tvp)
-		vrele(ap->a_tdvp);
+	if (doabort)
+		VOP_ABORTOP(tdvp, ap->a_tcnp);
+	if (tvp != NULL)
+		vput(tvp);
+	if (tdvp == tvp)
+		vrele(tdvp);
 	else
-		vput(ap->a_tdvp);
+		vput(tdvp);
 
-	vrele(ap->a_fdvp);
-	vrele(ap->a_fvp);
+	if (doabort)
+		VOP_ABORTOP(fdvp, ap->a_fcnp);
+	vrele(fdvp);
+	vrele(fvp);
 
 	return error;
 }



CVS commit: [netbsd-5] src/sys/fs/puffs

2009-11-28 Thread Manuel Bouyer
Module Name:src
Committed By:   bouyer
Date:   Sat Nov 28 15:56:08 UTC 2009

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1153):
sys/fs/puffs/puffs_vnops.c: revision 1.139
Send VOP_ABORTOP() as a FAF -- we don't care about the return value.


To generate a diff of this commit:
cvs rdiff -u -r1.129.4.3 -r1.129.4.4 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.3 src/sys/fs/puffs/puffs_vnops.c:1.129.4.4
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.3	Sun Oct 18 12:46:07 2009
+++ src/sys/fs/puffs/puffs_vnops.c	Sat Nov 28 15:56:08 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.3 2009/10/18 12:46:07 sborrill Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.3 2009/10/18 12:46:07 sborrill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.4 2009/11/28 15:56:08 bouyer Exp $");
 
 #include 
 #include 
@@ -2126,16 +2126,16 @@
 	struct vnode *dvp = ap->a_dvp;
 	struct puffs_mount *pmp = MPTOPUFFSMP(dvp->v_mount);
 	struct componentname *cnp = ap->a_cnp;
-	int error;
 
 	if (EXISTSOP(pmp, ABORTOP)) {
 		PUFFS_MSG_ALLOC(vn, abortop);
 		puffs_makecn(&abortop_msg->pvnr_cn, &abortop_msg->pvnr_cn_cred,
 		cnp, PUFFS_USE_FULLPNBUF(pmp));
+		puffs_msg_setfaf(park_abortop);
 		puffs_msg_setinfo(park_abortop, PUFFSOP_VN,
 		PUFFS_VN_ABORTOP, VPTOPNC(dvp));
 
-		PUFFS_MSG_ENQUEUEWAIT(pmp, park_abortop, error);
+		puffs_msg_enqueue(pmp, park_abortop);
 		PUFFS_MSG_RELEASE(abortop);
 	}
 



CVS commit: [netbsd-5] src/sys/fs/puffs

2009-10-03 Thread Soren Jacobsen
Module Name:src
Committed By:   snj
Date:   Sat Oct  3 23:11:27 UTC 2009

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_node.c puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1042):
sys/fs/puffs/puffs_node.c: revision 1.14
sys/fs/puffs/puffs_vnops.c: revision 1.134
* fix a race i introduced almost two years ago in rev 1.116:
  operations creating a node cannot be considered outgoing operations,
  since after return from userspace they modify file system state
  by creating a new node.  if we do not protect the file system by
  holding the directory lock, a lookup operation might race us into
  the kernel and create the node earlier.
* remove pnode from hashlish before sending the reclaim faf off to
  userspace.  also, hold pmp_lock while frobbing the list.


To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.13.10.1 src/sys/fs/puffs/puffs_node.c
cvs rdiff -u -r1.129.4.1 -r1.129.4.2 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_node.c
diff -u src/sys/fs/puffs/puffs_node.c:1.13 src/sys/fs/puffs/puffs_node.c:1.13.10.1
--- src/sys/fs/puffs/puffs_node.c:1.13	Tue May  6 12:33:16 2008
+++ src/sys/fs/puffs/puffs_node.c	Sat Oct  3 23:11:27 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_node.c,v 1.13 2008/05/06 12:33:16 ad Exp $	*/
+/*	$NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13 2008/05/06 12:33:16 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.1 2009/10/03 23:11:27 snj Exp $");
 
 #include 
 #include 
@@ -223,7 +223,7 @@
 		if (pnc->pnc_cookie == ck) {
 			mutex_exit(&pmp->pmp_lock);
 			puffs_senderr(pmp, PUFFS_ERR_MAKENODE, EEXIST,
-			"cookie exists", ck);
+			"newcookie exists", ck);
 			return EPROTO;
 		}
 	}
@@ -260,7 +260,6 @@
 		panic("puffs_putvnode: %p not a puffs vnode", vp);
 #endif
 
-	LIST_REMOVE(pnode, pn_hashent);
 	genfs_node_destroy(vp);
 	puffs_releasenode(pnode);
 	vp->v_data = NULL;
@@ -336,6 +335,9 @@
 	 */
 	mutex_enter(&pmp->pmp_lock);
 	if (pmp->pmp_root) {
+		struct puffs_node *pnode = vp->v_data;
+
+		LIST_REMOVE(pnode, pn_hashent);
 		mutex_exit(&pmp->pmp_lock);
 		puffs_putvnode(vp);
 		goto retry;

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.1 src/sys/fs/puffs/puffs_vnops.c:1.129.4.2
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.1	Sat Sep 26 18:53:48 2009
+++ src/sys/fs/puffs/puffs_vnops.c	Sat Oct  3 23:11:27 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.2 2009/10/03 23:11:27 snj Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.2 2009/10/03 23:11:27 snj Exp $");
 
 #include 
 #include 
@@ -644,16 +644,7 @@
 	create_msg->pvnr_va = *ap->a_vap;
 	puffs_msg_setinfo(park_create, PUFFSOP_VN,
 	PUFFS_VN_CREATE, VPTOPNC(dvp));
-
-	/*
-	 * Do the dance:
-	 * + insert into queue ("interlock")
-	 * + unlock vnode
-	 * + wait for response
-	 */
-	puffs_msg_enqueue(pmp, park_create);
-	REFPN_AND_UNLOCKVP(dvp, dpn);
-	error = puffs_msg_wait2(pmp, park_create, dpn, NULL);
+	PUFFS_MSG_ENQUEUEWAIT2(pmp, park_create, dvp->v_data, NULL, error);
 
 	error = checkerr(pmp, error, __func__);
 	if (error)
@@ -666,10 +657,10 @@
 		create_msg->pvnr_newnode, cnp);
 
  out:
+	vput(dvp);
 	if (error || (cnp->cn_flags & SAVESTART) == 0)
 		PNBUF_PUT(cnp->cn_pnbuf);
 
-	RELEPN_AND_VP(dvp, dpn);
 	DPRINTF(("puffs_create: return %d\n", error));
 	PUFFS_MSG_RELEASE(create);
 	return error;
@@ -700,9 +691,7 @@
 	puffs_msg_setinfo(park_mknod, PUFFSOP_VN,
 	PUFFS_VN_MKNOD, VPTOPNC(dvp));
 
-	puffs_msg_enqueue(pmp, park_mknod);
-	REFPN_AND_UNLOCKVP(dvp, dpn);
-	error = puffs_msg_wait2(pmp, park_mknod, dpn, NULL);
+	PUFFS_MSG_ENQUEUEWAIT2(pmp, park_mknod, dvp->v_data, NULL, error);
 
 	error = checkerr(pmp, error, __func__);
 	if (error)
@@ -716,10 +705,10 @@
 		mknod_msg->pvnr_newnode, cnp);
 
  out:
+	vput(dvp);
 	PUFFS_MSG_RELEASE(mknod);
 	if (error || (cnp->cn_flags & SAVESTART) == 0)
 		PNBUF_PUT(cnp->cn_pnbuf);
-	RELEPN_AND_VP(dvp, dpn);
 	return error;
 }
 
@@ -1073,6 +1062,8 @@
 	} */ *ap = v;
 	struct vnode *vp = ap->a_vp;
 	struct puffs_mount *pmp = MPTOPUFFSMP(vp->v_mount);
+	struct puffs_node *pnode = vp->v_data;
+	bool notifyserver = true;
 
 	/*
 	 * first things first: check if someone is trying to reclaim the
@@ -1085,14 +1076,23 @@
 		KASSERT(pmp->pmp_root != NULL);
 		pmp->pmp_root = NULL;
 		mutex_exit(&pmp->pmp_lock);
-		goto

CVS commit: [netbsd-5] src/sys/fs/puffs

2009-09-26 Thread Soren Jacobsen
Module Name:src
Committed By:   snj
Date:   Sat Sep 26 18:53:48 UTC 2009

Modified Files:
src/sys/fs/puffs [netbsd-5]: puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by pooka in ticket #1014):
sys/fs/puffs/puffs_vnops.c: revision 1.133
Set SAVENAME for rmdir and remove.
Addresses an easy part of PR kern/38188


To generate a diff of this commit:
cvs rdiff -u -r1.129 -r1.129.4.1 src/sys/fs/puffs/puffs_vnops.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129 src/sys/fs/puffs/puffs_vnops.c:1.129.4.1
--- src/sys/fs/puffs/puffs_vnops.c:1.129	Wed Sep 10 19:25:33 2008
+++ src/sys/fs/puffs/puffs_vnops.c	Sat Sep 26 18:53:48 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129 2008/09/10 19:25:33 christos Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include 
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129 2008/09/10 19:25:33 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.1 2009/09/26 18:53:48 snj Exp $");
 
 #include 
 #include 
@@ -580,6 +580,13 @@
 		cnp->cn_consume = MIN(lookup_msg->pvnr_cn.pkcn_consume,
 		strlen(cnp->cn_nameptr) - cnp->cn_namelen);
 
+	/*
+	 * We need the name in remove and rmdir (well, rename too, but
+	 * SAVESTART takes care of that)
+	 */
+	if (cnp->cn_nameiop == DELETE)
+		cnp->cn_flags |= SAVENAME;
+
  out:
 	if (cnp->cn_flags & ISDOTDOT)
 		vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY);
@@ -1438,6 +1445,8 @@
 	RELEPN_AND_VP(vp, pn);
 
 	error = checkerr(pmp, error, __func__);
+	if (error || (cnp->cn_flags & SAVESTART) == 0)
+		PNBUF_PUT(cnp->cn_pnbuf);
 	return error;
 }
 
@@ -1543,6 +1552,9 @@
 	RELEPN_AND_VP(dvp, dpn);
 	RELEPN_AND_VP(vp, pn);
 
+	if (error || (cnp->cn_flags & SAVESTART) == 0)
+		PNBUF_PUT(cnp->cn_pnbuf);
+
 	return error;
 }