YAMAMOTO Takashi <y...@mwd.biglobe.ne.jp> wrote: > it should retry from puffs_cookie2pnode in that case.
Here is a patch that works around the problem (I initially had printf to check it did go through the ENOENT case and it does). I am about to commit that and pullup to netbsd-5, except if there are comments. Index: sys/fs/puffs/puffs_node.c =================================================================== RCS file: /cvsroot/src/sys/fs/puffs/puffs_node.c,v retrieving revision 1.13.10.3 diff -U 4 -r1.13.10.3 puffs_node.c --- sys/fs/puffs/puffs_node.c 2 Nov 2011 20:11:12 -0000 1.13.10.3 +++ sys/fs/puffs/puffs_node.c 18 Jan 2012 03:03:25 -0000 @@ -320,10 +320,18 @@ vp = pmp->pmp_root; 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; + break; + case 0: return 0; + break; + default: + break; + } } else mutex_exit(&pmp->pmp_lock); /* @@ -386,8 +394,9 @@ *vpp = pmp->pmp_root; return 0; } +retry_vget: mutex_enter(&pmp->pmp_lock); pnode = puffs_cookie2pnode(pmp, ck); if (pnode == NULL) { if (willcreate) { @@ -405,10 +414,18 @@ vgetflags = LK_INTERLOCK; if (lock) vgetflags |= LK_EXCLUSIVE | LK_RETRY; - if ((rv = vget(vp, vgetflags))) + switch (rv = vget(vp, vgetflags)) { + case ENOENT: + goto retry_vget; + break; + case 0: + break; + default: return rv; + break; + } *vpp = vp; return 0; } -- Emmanuel Dreyfus http://hcpnet.free.fr/pubz m...@netbsd.org