do not allow mounted devices to be opened
[unix-history] / usr / src / sys / ufs / lfs / lfs_inode.c
index 01727d3..efd4b8b 100644 (file)
@@ -14,7 +14,7 @@
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  *
- *     @(#)lfs_inode.c 7.26 (Berkeley) %G%
+ *     @(#)lfs_inode.c 7.29 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -121,6 +121,7 @@ loop:
        ip->i_flag = 0;
        ip->i_devvp = 0;
        ip->i_mode = 0;
        ip->i_flag = 0;
        ip->i_devvp = 0;
        ip->i_mode = 0;
+       ip->i_diroff = 0;
 #ifdef QUOTA
        ip->i_dquot = NODQUOT;
 #endif
 #ifdef QUOTA
        ip->i_dquot = NODQUOT;
 #endif
@@ -156,6 +157,16 @@ loop:
         */
        vp = ITOV(ip);
        vp->v_type = IFTOVT(ip->i_mode);
         */
        vp = ITOV(ip);
        vp->v_type = IFTOVT(ip->i_mode);
+       if (vp->v_type == VFIFO) {
+#ifdef FIFO
+               extern struct vnodeops fifo_inodeops;
+               vp->v_op = &fifo_inodeops;
+#else
+               iput(ip);
+               *ipp = 0;
+               return (EOPNOTSUPP);
+#endif /* FIFO */
+       }
        if (vp->v_type == VCHR || vp->v_type == VBLK) {
                vp->v_op = &spec_inodeops;
                if (nvp = checkalias(vp, ip->i_rdev, mntp)) {
        if (vp->v_type == VCHR || vp->v_type == VBLK) {
                vp->v_op = &spec_inodeops;
                if (nvp = checkalias(vp, ip->i_rdev, mntp)) {
@@ -254,20 +265,15 @@ ufs_inactive(vp)
 #endif
        }
        IUPDAT(ip, &time, &time, 0);
 #endif
        }
        IUPDAT(ip, &time, &time, 0);
+       IUNLOCK(ip);
+       ip->i_flag = 0;
        /*
         * If we are done with the inode, reclaim it
         * so that it can be reused immediately.
         */
        /*
         * If we are done with the inode, reclaim it
         * so that it can be reused immediately.
         */
-       if (vp->v_usecount == 0 && ip->i_mode == 0) {
-               vinvalbuf(vp, 0);
-               IUNLOCK(ip);
-               ip->i_flag = 0;
-               if ((vp->v_flag & VXLOCK) == 0)
-                       vgone(vp);
-               return (error);
-       }
-       IUNLOCK(ip);
-       ip->i_flag = 0;
+       if (vp->v_usecount == 0 && ip->i_mode == 0 &&
+           (vp->v_flag & VXLOCK) == 0)
+               vgone(vp);
        return (error);
 }
 
        return (error);
 }
 
@@ -579,8 +585,6 @@ indirtrunc(ip, bn, lastbn, level, countp)
                *countp = 0;
                return (error);
        }
                *countp = 0;
                return (error);
        }
-       if ((bp->b_flags & B_CACHE) == 0)
-               reassignbuf(bp, ITOV(ip));
        bap = bp->b_un.b_daddr;
        MALLOC(copy, daddr_t *, fs->fs_bsize, M_TEMP, M_WAITOK);
        bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->fs_bsize);
        bap = bp->b_un.b_daddr;
        MALLOC(copy, daddr_t *, fs->fs_bsize, M_TEMP, M_WAITOK);
        bcopy((caddr_t)bap, (caddr_t)copy, (u_int)fs->fs_bsize);