add proc pointers to appropriate vnode operations
[unix-history] / usr / src / sys / ufs / ufs / ufs_inode.c
index c02f473..e1954e4 100644 (file)
@@ -2,37 +2,26 @@
  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
  * All rights reserved.
  *
  * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
  * All rights reserved.
  *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley.  The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * %sccs.include.redist.c%
  *
  *
- *     @(#)ufs_inode.c 7.30 (Berkeley) %G%
+ *     @(#)ufs_inode.c 7.39 (Berkeley) %G%
  */
 
 #include "param.h"
 #include "systm.h"
 #include "mount.h"
  */
 
 #include "param.h"
 #include "systm.h"
 #include "mount.h"
-#include "user.h"
 #include "proc.h"
 #include "file.h"
 #include "buf.h"
 #include "proc.h"
 #include "file.h"
 #include "buf.h"
-#include "cmap.h"
 #include "vnode.h"
 #include "vnode.h"
-#include "../ufs/quota.h"
-#include "../ufs/inode.h"
-#include "../ufs/fs.h"
-#include "../ufs/ufsmount.h"
 #include "kernel.h"
 #include "malloc.h"
 
 #include "kernel.h"
 #include "malloc.h"
 
+#include "quota.h"
+#include "inode.h"
+#include "fs.h"
+#include "ufsmount.h"
+
 #define        INOHSZ  512
 #if    ((INOHSZ&(INOHSZ-1)) == 0)
 #define        INOHASH(dev,ino)        (((dev)+(ino))&(INOHSZ-1))
 #define        INOHSZ  512
 #if    ((INOHSZ&(INOHSZ-1)) == 0)
 #define        INOHASH(dev,ino)        (((dev)+(ino))&(INOHSZ-1))
@@ -123,6 +112,7 @@ loop:
        ip->i_devvp = 0;
        ip->i_mode = 0;
        ip->i_diroff = 0;
        ip->i_devvp = 0;
        ip->i_mode = 0;
        ip->i_diroff = 0;
+       ip->i_lockf = 0;
 #ifdef QUOTA
        for (i = 0; i < MAXQUOTAS; i++)
                ip->i_dquot[i] = NODQUOT;
 #ifdef QUOTA
        for (i = 0; i < MAXQUOTAS; i++)
                ip->i_dquot[i] = NODQUOT;
@@ -142,6 +132,14 @@ loop:
         */
        if (error = bread(VFSTOUFS(mntp)->um_devvp, fsbtodb(fs, itod(fs, ino)),
            (int)fs->fs_bsize, NOCRED, &bp)) {
         */
        if (error = bread(VFSTOUFS(mntp)->um_devvp, fsbtodb(fs, itod(fs, ino)),
            (int)fs->fs_bsize, NOCRED, &bp)) {
+               /*
+                * The inode does not contain anything useful, so it would
+                * be misleading to leave it on its hash chain.
+                * Iput() will take care of putting it back on the free list.
+                */
+               remque(ip);
+               ip->i_forw = ip;
+               ip->i_back = ip;
                /*
                 * Unlock and discard unneeded inode.
                 */
                /*
                 * Unlock and discard unneeded inode.
                 */
@@ -208,7 +206,7 @@ loop:
                if (++nextgennumber < (u_long)time.tv_sec)
                        nextgennumber = time.tv_sec;
                ip->i_gen = nextgennumber;
                if (++nextgennumber < (u_long)time.tv_sec)
                        nextgennumber = time.tv_sec;
                ip->i_gen = nextgennumber;
-               if ((vp->v_mount->m_flag & M_RDONLY) == 0)
+               if ((vp->v_mount->mnt_flag & MNT_RDONLY) == 0)
                        ip->i_flag |= IMOD;
        }
        *ipp = ip;
                        ip->i_flag |= IMOD;
        }
        *ipp = ip;
@@ -232,8 +230,9 @@ iput(ip)
  * Last reference to an inode, write the inode out and if necessary,
  * truncate and deallocate the file.
  */
  * Last reference to an inode, write the inode out and if necessary,
  * truncate and deallocate the file.
  */
-ufs_inactive(vp)
+ufs_inactive(vp, p)
        struct vnode *vp;
        struct vnode *vp;
+       struct proc *p;
 {
        register struct inode *ip = VTOI(vp);
        int mode, error = 0;
 {
        register struct inode *ip = VTOI(vp);
        int mode, error = 0;
@@ -249,7 +248,7 @@ ufs_inactive(vp)
                return (0);
        }
        ILOCK(ip);
                return (0);
        }
        ILOCK(ip);
-       if (ip->i_nlink <= 0 && (vp->v_mount->m_flag & M_RDONLY) == 0) {
+       if (ip->i_nlink <= 0 && (vp->v_mount->mnt_flag & MNT_RDONLY) == 0) {
 #ifdef QUOTA
                if (!getinoquota(ip))
                        (void) chkiq(ip, -1, NOCRED, 0);
 #ifdef QUOTA
                if (!getinoquota(ip))
                        (void) chkiq(ip, -1, NOCRED, 0);
@@ -257,6 +256,7 @@ ufs_inactive(vp)
                error = itrunc(ip, (u_long)0, 0);
                mode = ip->i_mode;
                ip->i_mode = 0;
                error = itrunc(ip, (u_long)0, 0);
                mode = ip->i_mode;
                ip->i_mode = 0;
+               ip->i_rdev = 0;
                ip->i_flag |= IUPD|ICHG;
                ifree(ip, ip->i_number, mode);
        }
                ip->i_flag |= IUPD|ICHG;
                ifree(ip, ip->i_number, mode);
        }
@@ -328,7 +328,7 @@ iupdat(ip, ta, tm, waitfor)
        fs = ip->i_fs;
        if ((ip->i_flag & (IUPD|IACC|ICHG|IMOD)) == 0)
                return (0);
        fs = ip->i_fs;
        if ((ip->i_flag & (IUPD|IACC|ICHG|IMOD)) == 0)
                return (0);
-       if (vp->v_mount->m_flag & M_RDONLY)
+       if (vp->v_mount->mnt_flag & MNT_RDONLY)
                return (0);
        error = bread(ip->i_devvp, fsbtodb(fs, itod(fs, ip->i_number)),
                (int)fs->fs_bsize, NOCRED, &bp);
                return (0);
        error = bread(ip->i_devvp, fsbtodb(fs, itod(fs, ip->i_number)),
                (int)fs->fs_bsize, NOCRED, &bp);
@@ -378,6 +378,7 @@ itrunc(oip, length, flags)
        int aflags, error, allerror;
        struct inode tip;
 
        int aflags, error, allerror;
        struct inode tip;
 
+       vnode_pager_setsize(ITOV(oip), length);
        if (oip->i_size <= length) {
                oip->i_flag |= ICHG|IUPD;
                error = iupdat(oip, &time, &time, 1);
        if (oip->i_size <= length) {
                oip->i_flag |= ICHG|IUPD;
                error = iupdat(oip, &time, &time, 1);
@@ -419,11 +420,9 @@ itrunc(oip, length, flags)
                        return (error);
                oip->i_size = length;
                size = blksize(fs, oip, lbn);
                        return (error);
                oip->i_size = length;
                size = blksize(fs, oip, lbn);
-               bn = bp->b_blkno;
-               count = howmany(size, CLBYTES);
-                       munhash(oip->i_devvp, bn + i * CLBYTES / DEV_BSIZE);
+               (void) vnode_pager_uncache(ITOV(oip));
                bzero(bp->b_un.b_addr + offset, (unsigned)(size - offset));
                bzero(bp->b_un.b_addr + offset, (unsigned)(size - offset));
-               brealloc(bp, size);
+               allocbuf(bp, size);
                if (flags & IO_SYNC)
                        bwrite(bp);
                else
                if (flags & IO_SYNC)
                        bwrite(bp);
                else
@@ -647,14 +646,13 @@ ilock(ip)
 
        while (ip->i_flag & ILOCKED) {
                ip->i_flag |= IWANT;
 
        while (ip->i_flag & ILOCKED) {
                ip->i_flag |= IWANT;
-               if (ip->i_spare0 == u.u_procp->p_pid)
+               if (ip->i_spare0 == curproc->p_pid)
                        panic("locking against myself");
                        panic("locking against myself");
-               ip->i_spare1 = u.u_procp->p_pid;
+               ip->i_spare1 = curproc->p_pid;
                (void) sleep((caddr_t)ip, PINOD);
        }
        ip->i_spare1 = 0;
                (void) sleep((caddr_t)ip, PINOD);
        }
        ip->i_spare1 = 0;
-       ip->i_spare0 = u.u_procp->p_pid;
-       u.u_spare[0]++;
+       ip->i_spare0 = curproc->p_pid;
        ip->i_flag |= ILOCKED;
 }
 
        ip->i_flag |= ILOCKED;
 }
 
@@ -668,7 +666,6 @@ iunlock(ip)
        if ((ip->i_flag & ILOCKED) == 0)
                vprint("iunlock: unlocked inode", ITOV(ip));
        ip->i_spare0 = 0;
        if ((ip->i_flag & ILOCKED) == 0)
                vprint("iunlock: unlocked inode", ITOV(ip));
        ip->i_spare0 = 0;
-       u.u_spare[0]--;
        ip->i_flag &= ~ILOCKED;
        if (ip->i_flag&IWANT) {
                ip->i_flag &= ~IWANT;
        ip->i_flag &= ~ILOCKED;
        if (ip->i_flag&IWANT) {
                ip->i_flag &= ~IWANT;