[BACK]Return to ufs_lookup.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / ufs / ufs

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

Diff for /src/sys/ufs/ufs/ufs_lookup.c between version 1.6 and 1.7

version 1.6, 1995/05/30 11:41:38 version 1.7, 1996/02/09 22:36:06
Line 41 
Line 41 
  */   */
   
 #include <sys/param.h>  #include <sys/param.h>
   #include <sys/systm.h>
 #include <sys/namei.h>  #include <sys/namei.h>
 #include <sys/buf.h>  #include <sys/buf.h>
 #include <sys/file.h>  #include <sys/file.h>
Line 96  int dirchk = 0;
Line 97  int dirchk = 0;
  *        nor deleting, add name to cache   *        nor deleting, add name to cache
  */   */
 int  int
 ufs_lookup(ap)  ufs_lookup(v)
           void *v;
   {
         struct vop_lookup_args /* {          struct vop_lookup_args /* {
                 struct vnode *a_dvp;                  struct vnode *a_dvp;
                 struct vnode **a_vpp;                  struct vnode **a_vpp;
                 struct componentname *a_cnp;                  struct componentname *a_cnp;
         } */ *ap;          } */ *ap = v;
 {  
         register struct vnode *vdp;     /* vnode for directory being searched */          register struct vnode *vdp;     /* vnode for directory being searched */
         register struct inode *dp;      /* inode for directory being searched */          register struct inode *dp;      /* inode for directory being searched */
         struct buf *bp;                 /* a buffer of directory entries */          struct buf *bp;                 /* a buffer of directory entries */
Line 142  ufs_lookup(ap)
Line 144  ufs_lookup(ap)
          */           */
         if ((dp->i_mode & IFMT) != IFDIR)          if ((dp->i_mode & IFMT) != IFDIR)
                 return (ENOTDIR);                  return (ENOTDIR);
         if (error = VOP_ACCESS(vdp, VEXEC, cred, cnp->cn_proc))          if ((error = VOP_ACCESS(vdp, VEXEC, cred, cnp->cn_proc)) != 0)
                 return (error);                  return (error);
   
         /*          /*
Line 152  ufs_lookup(ap)
Line 154  ufs_lookup(ap)
          * check the name cache to see if the directory/name pair           * check the name cache to see if the directory/name pair
          * we are looking for is known already.           * we are looking for is known already.
          */           */
         if (error = cache_lookup(vdp, vpp, cnp)) {          if ((error = cache_lookup(vdp, vpp, cnp)) != 0) {
                 int vpid;       /* capability number of vnode */                  int vpid;       /* capability number of vnode */
   
                 if (error == ENOENT)                  if (error == ENOENT)
Line 190  ufs_lookup(ap)
Line 192  ufs_lookup(ap)
                         if (lockparent && pdp != vdp && (flags & ISLASTCN))                          if (lockparent && pdp != vdp && (flags & ISLASTCN))
                                 VOP_UNLOCK(pdp);                                  VOP_UNLOCK(pdp);
                 }                  }
                 if (error = VOP_LOCK(pdp))                  if ((error = VOP_LOCK(pdp)) != 0)
                         return (error);                          return (error);
                 vdp = pdp;                  vdp = pdp;
                 dp = VTOI(pdp);                  dp = VTOI(pdp);
Line 249  searchloop:
Line 251  searchloop:
                 if ((dp->i_offset & bmask) == 0) {                  if ((dp->i_offset & bmask) == 0) {
                         if (bp != NULL)                          if (bp != NULL)
                                 brelse(bp);                                  brelse(bp);
                         if (error =                          error = VOP_BLKATOFF(vdp, (off_t)dp->i_offset, NULL,
                             VOP_BLKATOFF(vdp, (off_t)dp->i_offset, NULL, &bp))                                               &bp);
                           if (error)
                                 return (error);                                  return (error);
                         entryoffsetinblock = 0;                          entryoffsetinblock = 0;
                 }                  }
Line 272  searchloop:
Line 275  searchloop:
                  */                   */
                 ep = (struct direct *)((char *)bp->b_data + entryoffsetinblock);                  ep = (struct direct *)((char *)bp->b_data + entryoffsetinblock);
                 if (ep->d_reclen == 0 ||                  if (ep->d_reclen == 0 ||
                     dirchk && ufs_dirbadentry(vdp, ep, entryoffsetinblock)) {                      (dirchk && ufs_dirbadentry(vdp, ep, entryoffsetinblock))) {
                         int i;                          int i;
   
                         ufs_dirbad(dp, dp->i_offset, "mangled entry");                          ufs_dirbad(dp, dp->i_offset, "mangled entry");
Line 397  notfound:
Line 400  notfound:
                  * Access for write is interpreted as allowing                   * Access for write is interpreted as allowing
                  * creation of files in the directory.                   * creation of files in the directory.
                  */                   */
                 if (error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc))                  error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc);
                   if (error)
                         return (error);                          return (error);
                 /*                  /*
                  * Return an indication of where the new directory                   * Return an indication of where the new directory
Line 483  found:
Line 487  found:
                 /*                  /*
                  * Write access to directory required to delete files.                   * Write access to directory required to delete files.
                  */                   */
                 if (error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc))                  error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc);
                   if (error)
                         return (error);                          return (error);
                 /*                  /*
                  * Return pointer to current entry in dp->i_offset,                   * Return pointer to current entry in dp->i_offset,
Line 500  found:
Line 505  found:
                         *vpp = vdp;                          *vpp = vdp;
                         return (0);                          return (0);
                 }                  }
                 if (error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp))                  error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp);
                   if (error)
                         return (error);                          return (error);
                 /*                  /*
                  * If directory is "sticky", then user must own                   * If directory is "sticky", then user must own
Line 529  found:
Line 535  found:
          */           */
         if (nameiop == RENAME && wantparent &&          if (nameiop == RENAME && wantparent &&
             (flags & ISLASTCN)) {              (flags & ISLASTCN)) {
                 if (error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc))                  error = VOP_ACCESS(vdp, VWRITE, cred, cnp->cn_proc);
                   if (error)
                         return (error);                          return (error);
                 /*                  /*
                  * Careful about locking second inode.                   * Careful about locking second inode.
Line 537  found:
Line 544  found:
                  */                   */
                 if (dp->i_number == dp->i_ino)                  if (dp->i_number == dp->i_ino)
                         return (EISDIR);                          return (EISDIR);
                 if (error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp))                  error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp);
                   if (error)
                         return (error);                          return (error);
                 *vpp = tdp;                  *vpp = tdp;
                 cnp->cn_flags |= SAVENAME;                  cnp->cn_flags |= SAVENAME;
Line 568  found:
Line 576  found:
         pdp = vdp;          pdp = vdp;
         if (flags & ISDOTDOT) {          if (flags & ISDOTDOT) {
                 VOP_UNLOCK(pdp);        /* race to get the inode */                  VOP_UNLOCK(pdp);        /* race to get the inode */
                 if (error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp)) {                  error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp);
                   if (error) {
                         VOP_LOCK(pdp);                          VOP_LOCK(pdp);
                         return (error);                          return (error);
                 }                  }
Line 582  found:
Line 591  found:
                 VREF(vdp);      /* we want ourself, ie "." */                  VREF(vdp);      /* we want ourself, ie "." */
                 *vpp = vdp;                  *vpp = vdp;
         } else {          } else {
                 if (error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp))                  error = VFS_VGET(vdp->v_mount, dp->i_ino, &tdp);
                   if (error)
                         return (error);                          return (error);
                 if (!lockparent || !(flags & ISLASTCN))                  if (!lockparent || !(flags & ISLASTCN))
                         VOP_UNLOCK(pdp);                          VOP_UNLOCK(pdp);
Line 701  ufs_direnter(ip, dvp, cnp)
Line 711  ufs_direnter(ip, dvp, cnp)
  * Common entry point for directory entry removal used by ufs_direnter   * Common entry point for directory entry removal used by ufs_direnter
  * and ufs_whiteout   * and ufs_whiteout
  */   */
   int
 ufs_direnter2(dvp, dirp, cr, p)  ufs_direnter2(dvp, dirp, cr, p)
         struct vnode *dvp;          struct vnode *dvp;
         struct direct *dirp;          struct direct *dirp;
Line 772  ufs_direnter2(dvp, dirp, cr, p)
Line 783  ufs_direnter2(dvp, dirp, cr, p)
         /*          /*
          * Get the block containing the space for the new directory entry.           * Get the block containing the space for the new directory entry.
          */           */
         if (error = VOP_BLKATOFF(dvp, (off_t)dp->i_offset, &dirbuf, &bp))          error = VOP_BLKATOFF(dvp, (off_t)dp->i_offset, &dirbuf, &bp);
           if (error)
                 return (error);                  return (error);
         /*          /*
          * Find space for the new entry. In the simple case, the entry at           * Find space for the new entry. In the simple case, the entry at
Line 852  ufs_dirremove(dvp, cnp)
Line 864  ufs_dirremove(dvp, cnp)
                 /*                  /*
                  * Whiteout entry: set d_ino to WINO.                   * Whiteout entry: set d_ino to WINO.
                  */                   */
                 if (error =                  error = VOP_BLKATOFF(dvp, (off_t)dp->i_offset, (char **)&ep,
                     VOP_BLKATOFF(dvp, (off_t)dp->i_offset, (char **)&ep, &bp))                                       &bp);
                   if (error)
                         return (error);                          return (error);
                 ep->d_ino = WINO;                  ep->d_ino = WINO;
                 ep->d_type = DT_WHT;                  ep->d_type = DT_WHT;
Line 866  ufs_dirremove(dvp, cnp)
Line 879  ufs_dirremove(dvp, cnp)
                 /*                  /*
                  * First entry in block: set d_ino to zero.                   * First entry in block: set d_ino to zero.
                  */                   */
                 if (error =                  error = VOP_BLKATOFF(dvp, (off_t)dp->i_offset, (char **)&ep,
                     VOP_BLKATOFF(dvp, (off_t)dp->i_offset, (char **)&ep, &bp))                                       &bp);
                   if (error)
                         return (error);                          return (error);
                 ep->d_ino = 0;                  ep->d_ino = 0;
                 error = VOP_BWRITE(bp);                  error = VOP_BWRITE(bp);
Line 877  ufs_dirremove(dvp, cnp)
Line 891  ufs_dirremove(dvp, cnp)
         /*          /*
          * Collapse new free space into previous entry.           * Collapse new free space into previous entry.
          */           */
         if (error = VOP_BLKATOFF(dvp, (off_t)(dp->i_offset - dp->i_count),          error = VOP_BLKATOFF(dvp, (off_t)(dp->i_offset - dp->i_count),
             (char **)&ep, &bp))                               (char **)&ep, &bp);
           if (error)
                 return (error);                  return (error);
         ep->d_reclen += dp->i_reclen;          ep->d_reclen += dp->i_reclen;
         error = VOP_BWRITE(bp);          error = VOP_BWRITE(bp);
Line 901  ufs_dirrewrite(dp, ip, cnp)
Line 916  ufs_dirrewrite(dp, ip, cnp)
         struct vnode *vdp = ITOV(dp);          struct vnode *vdp = ITOV(dp);
         int error;          int error;
   
         if (error = VOP_BLKATOFF(vdp, (off_t)dp->i_offset, (char **)&ep, &bp))          error = VOP_BLKATOFF(vdp, (off_t)dp->i_offset, (char **)&ep, &bp);
           if (error)
                 return (error);                  return (error);
         ep->d_ino = ip->i_number;          ep->d_ino = ip->i_number;
         if (vdp->v_mount->mnt_maxsymlinklen > 0)          if (vdp->v_mount->mnt_maxsymlinklen > 0)
Line 1029  ufs_checkpath(source, target, cred)
Line 1045  ufs_checkpath(source, target, cred)
                 if (dirbuf.dotdot_ino == rootino)                  if (dirbuf.dotdot_ino == rootino)
                         break;                          break;
                 vput(vp);                  vput(vp);
                 if (error = VFS_VGET(vp->v_mount, dirbuf.dotdot_ino, &vp)) {                  error = VFS_VGET(vp->v_mount, dirbuf.dotdot_ino, &vp);
                   if (error) {
                         vp = NULL;                          vp = NULL;
                         break;                          break;
                 }                  }

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

CVSweb <webmaster@jp.NetBSD.org>