version 1.33, 2007/06/21 14:11:34 |
version 1.34, 2007/06/21 14:54:49 |
Line 338 puffs_cookie2pnode(struct puffs_mount *p |
|
Line 338 puffs_cookie2pnode(struct puffs_mount *p |
|
/* |
/* |
* Make sure root vnode exists and reference it. Does NOT lock. |
* Make sure root vnode exists and reference it. Does NOT lock. |
*/ |
*/ |
int |
static int |
puffs_makeroot(struct puffs_mount *pmp) |
puffs_makeroot(struct puffs_mount *pmp) |
{ |
{ |
struct vnode *vp; |
struct vnode *vp; |
Line 396 puffs_makeroot(struct puffs_mount *pmp) |
|
Line 396 puffs_makeroot(struct puffs_mount *pmp) |
|
* in situations where we want the vnode but don't care for the |
* in situations where we want the vnode but don't care for the |
* vnode lock, e.g. file server issued putpages. |
* vnode lock, e.g. file server issued putpages. |
*/ |
*/ |
struct vnode * |
int |
puffs_pnode2vnode(struct puffs_mount *pmp, void *cookie, int lock) |
puffs_pnode2vnode(struct puffs_mount *pmp, void *cookie, int lock, |
|
struct vnode **vpp) |
{ |
{ |
struct puffs_node *pnode; |
struct puffs_node *pnode; |
struct vnode *vp; |
struct vnode *vp; |
int vgetflags; |
int vgetflags, rv; |
|
|
/* |
/* |
* Handle root in a special manner, since we want to make sure |
* Handle root in a special manner, since we want to make sure |
* pmp_root is properly set. |
* pmp_root is properly set. |
*/ |
*/ |
if (cookie == pmp->pmp_root_cookie) { |
if (cookie == pmp->pmp_root_cookie) { |
if (puffs_makeroot(pmp)) |
if ((rv = puffs_makeroot(pmp))) |
return NULL; |
return rv; |
if (lock) |
if (lock) |
vn_lock(pmp->pmp_root, LK_EXCLUSIVE | LK_RETRY); |
vn_lock(pmp->pmp_root, LK_EXCLUSIVE | LK_RETRY); |
|
|
return pmp->pmp_root; |
*vpp = pmp->pmp_root; |
|
return 0; |
} |
} |
|
|
vgetflags = LK_INTERLOCK; |
|
if (lock) |
|
vgetflags |= LK_EXCLUSIVE | LK_RETRY; |
|
|
|
mutex_enter(&pmp->pmp_lock); |
mutex_enter(&pmp->pmp_lock); |
pnode = puffs_cookie2pnode(pmp, cookie); |
pnode = puffs_cookie2pnode(pmp, cookie); |
|
|
if (pnode == NULL) { |
if (pnode == NULL) { |
mutex_exit(&pmp->pmp_lock); |
mutex_exit(&pmp->pmp_lock); |
return NULL; |
return ENOENT; |
} |
} |
vp = pnode->pn_vp; |
|
|
|
|
vp = pnode->pn_vp; |
simple_lock(&vp->v_interlock); |
simple_lock(&vp->v_interlock); |
mutex_exit(&pmp->pmp_lock); |
mutex_exit(&pmp->pmp_lock); |
|
|
if (vget(vp, vgetflags)) |
vgetflags = LK_INTERLOCK; |
return NULL; |
if (lock) |
|
vgetflags |= LK_EXCLUSIVE | LK_RETRY; |
|
if ((rv = vget(vp, vgetflags))) |
|
return rv; |
|
|
return vp; |
*vpp = vp; |
|
return 0; |
} |
} |
|
|
void |
void |