[BACK]Return to puffs_subr.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / fs / puffs

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

Diff for /src/sys/fs/puffs/puffs_subr.c between version 1.33 and 1.34

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

Legend:
Removed from v.1.33  
changed lines
  Added in v.1.34

CVSweb <webmaster@jp.NetBSD.org>