version 1.13, 2006/12/30 01:29:03 |
version 1.14, 2007/01/09 18:14:31 |
Line 255 puffs_putvnode(struct vnode *vp) |
|
Line 255 puffs_putvnode(struct vnode *vp) |
|
* XXX: lists, although lookup cache mostly shields us from this |
* XXX: lists, although lookup cache mostly shields us from this |
*/ |
*/ |
struct vnode * |
struct vnode * |
puffs_pnode2vnode(struct puffs_mount *pmp, void *cookie) |
puffs_pnode2vnode(struct puffs_mount *pmp, void *cookie, int lock) |
{ |
{ |
struct puffs_node *pnode; |
struct puffs_node *pnode; |
struct vnode *vp; |
struct vnode *vp; |
|
int vgetflags; |
|
|
simple_lock(&pmp->pmp_lock); |
simple_lock(&pmp->pmp_lock); |
LIST_FOREACH(pnode, &pmp->pmp_pnodelist, pn_entries) { |
LIST_FOREACH(pnode, &pmp->pmp_pnodelist, pn_entries) { |
Line 266 puffs_pnode2vnode(struct puffs_mount *pm |
|
Line 267 puffs_pnode2vnode(struct puffs_mount *pm |
|
break; |
break; |
} |
} |
simple_unlock(&pmp->pmp_lock); |
simple_unlock(&pmp->pmp_lock); |
|
|
|
/* XXX: what lock controls this? */ |
if (!pnode) |
if (!pnode) |
return NULL; |
return NULL; |
vp = pnode->pn_vp; |
vp = pnode->pn_vp; |
|
|
if (pnode->pn_stat & PNODE_INACTIVE) { |
if (lock) |
if (vget(vp, LK_EXCLUSIVE | LK_RETRY)) |
vgetflags = LK_EXCLUSIVE | LK_RETRY; |
return NULL; |
else |
} else { |
vgetflags = 0; |
vref(vp); |
|
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); |
if (vget(vp, vgetflags)) |
} |
return NULL; |
|
|
return vp; |
return vp; |
} |
} |
|
|