Add extra argument to VOP_BMAP.
[unix-history] / usr / src / sys / ufs / ffs / ufs_vnops.c
index ab6fcd2..a1818b5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)ufs_vnops.c 7.100 (Berkeley) %G%
+ *     @(#)ufs_vnops.c 7.109 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
 #include <sys/conf.h>
 #include <sys/mount.h>
 #include <sys/vnode.h>
 #include <sys/conf.h>
 #include <sys/mount.h>
 #include <sys/vnode.h>
-#include <sys/specdev.h>
-#include <sys/fifo.h>
 #include <sys/malloc.h>
 #include <sys/dirent.h>
 
 #include <vm/vm.h>
 
 #include <sys/malloc.h>
 #include <sys/dirent.h>
 
 #include <vm/vm.h>
 
+#include <miscfs/specfs/specdev.h>
+
 #include <ufs/ufs/lockf.h>
 #include <ufs/ufs/quota.h>
 #include <ufs/ufs/inode.h>
 #include <ufs/ufs/lockf.h>
 #include <ufs/ufs/quota.h>
 #include <ufs/ufs/inode.h>
@@ -174,7 +174,6 @@ ufs_access(ap)
                struct proc *a_p;
        } */ *ap;
 {
                struct proc *a_p;
        } */ *ap;
 {
-       USES_VOP_ISLOCKED;
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
        register struct ucred *cred = ap->a_cred;
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
        register struct ucred *cred = ap->a_cred;
@@ -278,8 +277,6 @@ ufs_setattr(ap)
                struct proc *a_p;
        } */ *ap;
 {
                struct proc *a_p;
        } */ *ap;
 {
-       USES_VOP_TRUNCATE;
-       USES_VOP_UPDATE;
        register struct vattr *vap = ap->a_vap;
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
        register struct vattr *vap = ap->a_vap;
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
@@ -317,8 +314,7 @@ ufs_setattr(ap)
                if (vap->va_atime.ts_sec != VNOVAL)
                        ip->i_flag |= IACC;
                if (vap->va_mtime.ts_sec != VNOVAL)
                if (vap->va_atime.ts_sec != VNOVAL)
                        ip->i_flag |= IACC;
                if (vap->va_mtime.ts_sec != VNOVAL)
-                       ip->i_flag |= IUPD;
-               ip->i_flag |= ICHG;
+                       ip->i_flag |= IUPD | ICHG;
                atimeval.tv_sec = vap->va_atime.ts_sec;
                atimeval.tv_usec = vap->va_atime.ts_nsec / 1000;
                mtimeval.tv_sec = vap->va_mtime.ts_sec;
                atimeval.tv_sec = vap->va_atime.ts_sec;
                atimeval.tv_usec = vap->va_atime.ts_nsec / 1000;
                mtimeval.tv_sec = vap->va_mtime.ts_sec;
@@ -596,12 +592,11 @@ ufs_link(ap)
                struct componentname *a_cnp;
        } */ *ap;
 {
                struct componentname *a_cnp;
        } */ *ap;
 {
-       USES_VOP_UPDATE;
-       USES_VOP_ABORTOP;
        register struct vnode *vp = ap->a_vp;
        register struct vnode *tdvp = ap->a_tdvp;
        register struct componentname *cnp = ap->a_cnp;
        register struct inode *ip;
        register struct vnode *vp = ap->a_vp;
        register struct vnode *tdvp = ap->a_tdvp;
        register struct componentname *cnp = ap->a_cnp;
        register struct inode *ip;
+       struct timeval tv;
        int error;
 
        if (vp->v_mount != tdvp->v_mount) {
        int error;
 
        if (vp->v_mount != tdvp->v_mount) {
@@ -626,7 +621,8 @@ ufs_link(ap)
                ILOCK(ip);
        ip->i_nlink++;
        ip->i_flag |= ICHG;
                ILOCK(ip);
        ip->i_nlink++;
        ip->i_flag |= ICHG;
-       error = VOP_UPDATE(tdvp, &time, &time, 1);
+       tv = time;
+       error = VOP_UPDATE(tdvp, &tv, &tv, 1);
        if (!error)
                error = ufs_direnter(ip, vp, cnp);
        if (vp != tdvp)
        if (!error)
                error = ufs_direnter(ip, vp, cnp);
        if (vp != tdvp)
@@ -651,9 +647,6 @@ relookup(dvp, vpp, cnp)
        struct vnode *dvp, **vpp;
        struct componentname *cnp;
 {
        struct vnode *dvp, **vpp;
        struct componentname *cnp;
 {
-       USES_VOP_LOCK;
-       USES_VOP_LOOKUP;
-       USES_VOP_UNLOCK;
        register struct vnode *dp = 0;  /* the directory we are searching */
        struct vnode *tdp;              /* saved dp */
        struct mount *mp;               /* mount table entry */
        register struct vnode *dp = 0;  /* the directory we are searching */
        struct vnode *tdp;              /* saved dp */
        struct mount *mp;               /* mount table entry */
@@ -834,12 +827,6 @@ ufs_rename(ap)
                struct componentname *a_tcnp;
        } */ *ap;
 {
                struct componentname *a_tcnp;
        } */ *ap;
 {
-       USES_VOP_ABORTOP;
-       USES_VOP_ACCESS;
-       USES_VOP_LOCK;
-       USES_VOP_TRUNCATE;
-       USES_VOP_UNLOCK;
-       USES_VOP_UPDATE;
        struct vnode *tvp = ap->a_tvp;
        register struct vnode *tdvp = ap->a_tdvp;
        struct vnode *fvp = ap->a_fvp;
        struct vnode *tvp = ap->a_tvp;
        register struct vnode *tdvp = ap->a_tdvp;
        struct vnode *fvp = ap->a_fvp;
@@ -848,6 +835,7 @@ ufs_rename(ap)
        register struct componentname *fcnp = ap->a_fcnp;
        register struct inode *ip, *xp, *dp;
        struct dirtemplate dirbuf;
        register struct componentname *fcnp = ap->a_fcnp;
        register struct inode *ip, *xp, *dp;
        struct dirtemplate dirbuf;
+       struct timeval tv;
        int doingdirectory = 0, oldparent = 0, newparent = 0;
        int error = 0;
        int fdvpneedsrele = 1, tdvpneedsrele = 1;
        int doingdirectory = 0, oldparent = 0, newparent = 0;
        int error = 0;
        int fdvpneedsrele = 1, tdvpneedsrele = 1;
@@ -923,7 +911,8 @@ ufs_rename(ap)
         */
        ip->i_nlink++;
        ip->i_flag |= ICHG;
         */
        ip->i_nlink++;
        ip->i_flag |= ICHG;
-       error = VOP_UPDATE(fvp, &time, &time, 1);
+       tv = time;
+       error = VOP_UPDATE(fvp, &tv, &tv, 1);
        IUNLOCK(ip);
 
        /*
        IUNLOCK(ip);
 
        /*
@@ -988,14 +977,14 @@ ufs_rename(ap)
                        }
                        dp->i_nlink++;
                        dp->i_flag |= ICHG;
                        }
                        dp->i_nlink++;
                        dp->i_flag |= ICHG;
-                       if (error = VOP_UPDATE(ITOV(dp), &time, &time, 1))
+                       if (error = VOP_UPDATE(ITOV(dp), &tv, &tv, 1))
                                goto bad;
                }
                if (error = ufs_direnter(ip, tdvp, tcnp)) {
                        if (doingdirectory && newparent) {
                                dp->i_nlink--;
                                dp->i_flag |= ICHG;
                                goto bad;
                }
                if (error = ufs_direnter(ip, tdvp, tcnp)) {
                        if (doingdirectory && newparent) {
                                dp->i_nlink--;
                                dp->i_flag |= ICHG;
-                               (void)VOP_UPDATE(ITOV(dp), &time, &time, 1);
+                               (void)VOP_UPDATE(ITOV(dp), &tv, &tv, 1);
                        }
                        goto bad;
                }
                        }
                        goto bad;
                }
@@ -1200,17 +1189,14 @@ ufs_mkdir(ap)
                struct vattr *a_vap;
        } */ *ap;
 {
                struct vattr *a_vap;
        } */ *ap;
 {
-       USES_VOP_UPDATE;
-       USES_VOP_VALLOC;
-       USES_VOP_VFREE;
        register struct vnode *dvp = ap->a_dvp;
        register struct vattr *vap = ap->a_vap;
        register struct componentname *cnp = ap->a_cnp;
        register struct inode *ip, *dp;
        struct vnode *tvp;
        struct dirtemplate dirtemplate, *dtp;
        register struct vnode *dvp = ap->a_dvp;
        register struct vattr *vap = ap->a_vap;
        register struct componentname *cnp = ap->a_cnp;
        register struct inode *ip, *dp;
        struct vnode *tvp;
        struct dirtemplate dirtemplate, *dtp;
-       int error;
-       int dmode;
+       struct timeval tv;
+       int error, dmode;
 
 #ifdef DIAGNOSTIC
        if ((cnp->cn_flags & HASBUF) == 0)
 
 #ifdef DIAGNOSTIC
        if ((cnp->cn_flags & HASBUF) == 0)
@@ -1251,7 +1237,8 @@ ufs_mkdir(ap)
        ip->i_mode = dmode;
        ITOV(ip)->v_type = VDIR;        /* Rest init'd in iget() */
        ip->i_nlink = 2;
        ip->i_mode = dmode;
        ITOV(ip)->v_type = VDIR;        /* Rest init'd in iget() */
        ip->i_nlink = 2;
-       error = VOP_UPDATE(ITOV(ip), &time, &time, 1);
+       tv = time;
+       error = VOP_UPDATE(ITOV(ip), &tv, &tv, 1);
 
        /*
         * Bump link count in parent directory
 
        /*
         * Bump link count in parent directory
@@ -1261,7 +1248,7 @@ ufs_mkdir(ap)
         */
        dp->i_nlink++;
        dp->i_flag |= ICHG;
         */
        dp->i_nlink++;
        dp->i_flag |= ICHG;
-       if (error = VOP_UPDATE(ITOV(dp), &time, &time, 1))
+       if (error = VOP_UPDATE(ITOV(dp), &tv, &tv, 1))
                goto bad;
 
        /* Initialize directory with "." and ".." from static template. */
                goto bad;
 
        /* Initialize directory with "." and ".." from static template. */
@@ -1314,13 +1301,11 @@ bad:
 int
 ufs_rmdir(ap)
        struct vop_rmdir_args /* {
 int
 ufs_rmdir(ap)
        struct vop_rmdir_args /* {
-               struct vnodeop_desc *a_desc;
                struct vnode *a_dvp;
                struct vnode *a_vp;
                struct componentname *a_cnp;
        } */ *ap;
 {
                struct vnode *a_dvp;
                struct vnode *a_vp;
                struct componentname *a_cnp;
        } */ *ap;
 {
-       USES_VOP_TRUNCATE;
        register struct vnode *dvp = ap->a_dvp;
        register struct componentname *cnp = ap->a_cnp;
        register struct inode *ip, *dp;
        register struct vnode *dvp = ap->a_dvp;
        register struct componentname *cnp = ap->a_cnp;
        register struct inode *ip, *dp;
@@ -1435,7 +1420,6 @@ ufs_readdir(ap)
                struct ucred *a_cred;
        } */ *ap;
 {
                struct ucred *a_cred;
        } */ *ap;
 {
-       USES_VOP_READ;
        register struct uio *uio = ap->a_uio;
        int count, lost, error;
 
        register struct uio *uio = ap->a_uio;
        int count, lost, error;
 
@@ -1464,7 +1448,7 @@ ufs_readdir(ap)
                        aiov.iov_len = count;
                        MALLOC(dirbuf, caddr_t, count, M_TEMP, M_WAITOK);
                        aiov.iov_base = dirbuf;
                        aiov.iov_len = count;
                        MALLOC(dirbuf, caddr_t, count, M_TEMP, M_WAITOK);
                        aiov.iov_base = dirbuf;
-                       error = VOP_READ(ap->a_vp, uio, 0, ap->a_cred);
+                       error = VOP_READ(ap->a_vp, &auio, 0, ap->a_cred);
                        if (error == 0) {
                                readcnt = count - auio.uio_resid;
                                edp = (struct dirent *)&dirbuf[readcnt];
                        if (error == 0) {
                                readcnt = count - auio.uio_resid;
                                edp = (struct dirent *)&dirbuf[readcnt];
@@ -1505,10 +1489,11 @@ ufs_readlink(ap)
 {
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
 {
        register struct vnode *vp = ap->a_vp;
        register struct inode *ip = VTOI(vp);
-       USES_VOP_READ;
+       int isize;
 
 
-       if (ip->i_size < vp->v_mount->mnt_maxsymlinklen) {
-               uiomove((char *)ip->i_shortlink, (int)ip->i_size, ap->a_uio);
+       isize = ip->i_size;
+       if (isize < vp->v_mount->mnt_maxsymlinklen) {
+               uiomove((char *)ip->i_shortlink, isize, ap->a_uio);
                return (0);
        }
        return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred));
                return (0);
        }
        return (VOP_READ(vp, ap->a_uio, 0, ap->a_cred));
@@ -1588,7 +1573,6 @@ ufs_strategy(ap)
                struct buf *a_bp;
        } */ *ap;
 {
                struct buf *a_bp;
        } */ *ap;
 {
-       USES_VOP_BMAP;
        register struct buf *bp = ap->a_bp;
        register struct vnode *vp = bp->b_vp;
        register struct inode *ip;
        register struct buf *bp = ap->a_bp;
        register struct vnode *vp = bp->b_vp;
        register struct inode *ip;
@@ -1599,7 +1583,7 @@ ufs_strategy(ap)
                panic("ufs_strategy: spec");
        if (bp->b_blkno == bp->b_lblkno) {
                if (error =
                panic("ufs_strategy: spec");
        if (bp->b_blkno == bp->b_lblkno) {
                if (error =
-                   VOP_BMAP(vp, bp->b_lblkno, NULL, &bp->b_blkno)) {
+                   VOP_BMAP(vp, bp->b_lblkno, NULL, &bp->b_blkno, NULL)) {
                        bp->b_error = error;
                        bp->b_flags |= B_ERROR;
                        biodone(bp);
                        bp->b_error = error;
                        bp->b_flags |= B_ERROR;
                        biodone(bp);
@@ -1658,7 +1642,6 @@ ufsspec_read(ap)
                struct ucred *a_cred;
        } */ *ap;
 {
                struct ucred *a_cred;
        } */ *ap;
 {
-       extern int (**spec_vnodeop_p)();
 
        /*
         * Set access flag.
 
        /*
         * Set access flag.
@@ -1679,7 +1662,6 @@ ufsspec_write(ap)
                struct ucred *a_cred;
        } */ *ap;
 {
                struct ucred *a_cred;
        } */ *ap;
 {
-       extern int (**spec_vnodeop_p)();
 
        /*
         * Set update and change flags.
 
        /*
         * Set update and change flags.
@@ -1702,7 +1684,6 @@ ufsspec_close(ap)
                struct proc *a_p;
        } */ *ap;
 {
                struct proc *a_p;
        } */ *ap;
 {
-       extern int (**spec_vnodeop_p)();
        register struct inode *ip = VTOI(ap->a_vp);
 
        if (ap->a_vp->v_usecount > 1 && !(ip->i_flag & ILOCKED))
        register struct inode *ip = VTOI(ap->a_vp);
 
        if (ap->a_vp->v_usecount > 1 && !(ip->i_flag & ILOCKED))
@@ -1877,9 +1858,8 @@ ufs_vinit(mntp, specops, fifoops, vpp)
        int (**fifoops)();
        struct vnode **vpp;
 {
        int (**fifoops)();
        struct vnode **vpp;
 {
-       struct inode *ip, *nip;
+       struct inode *ip;
        struct vnode *vp, *nvp;
        struct vnode *vp, *nvp;
-       extern int (**spec_vnodeop_p)();
 
        vp = *vpp;
        ip = VTOI(vp);
 
        vp = *vpp;
        ip = VTOI(vp);
@@ -1891,7 +1871,7 @@ ufs_vinit(mntp, specops, fifoops, vpp)
                        /*
                         * Discard unneeded vnode, but save its inode.
                         */
                        /*
                         * Discard unneeded vnode, but save its inode.
                         */
-                       remque(ip);
+                       ufs_ihashrem(ip);
                        IUNLOCK(ip);
                        nvp->v_data = vp->v_data;
                        vp->v_data = NULL;
                        IUNLOCK(ip);
                        nvp->v_data = vp->v_data;
                        vp->v_data = NULL;
@@ -1935,10 +1915,8 @@ ufs_makeinode(mode, dvp, vpp, cnp)
        struct vnode **vpp;
        struct componentname *cnp;
 {
        struct vnode **vpp;
        struct componentname *cnp;
 {
-       USES_VOP_UPDATE;
-       USES_VOP_VALLOC;
-       USES_VOP_VFREE;
        register struct inode *ip, *pdir;
        register struct inode *ip, *pdir;
+       struct timeval tv;
        struct vnode *tvp;
        int error;
 
        struct vnode *tvp;
        int error;
 
@@ -1980,7 +1958,8 @@ ufs_makeinode(mode, dvp, vpp, cnp)
        /*
         * Make sure inode goes to disk before directory entry.
         */
        /*
         * Make sure inode goes to disk before directory entry.
         */
-       if (error = VOP_UPDATE(tvp, &time, &time, 1))
+       tv = time;
+       if (error = VOP_UPDATE(tvp, &tv, &tv, 1))
                goto bad;
        if (error = ufs_direnter(ip, dvp, cnp))
                goto bad;
                goto bad;
        if (error = ufs_direnter(ip, dvp, cnp))
                goto bad;