reorganization to move ufsmount ops to be vnode ops;
[unix-history] / usr / src / sys / kern / vfs_syscalls.c
index 8a7d40a..61920f5 100644 (file)
@@ -4,7 +4,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)vfs_syscalls.c      7.70 (Berkeley) %G%
+ *     @(#)vfs_syscalls.c      7.74 (Berkeley) %G%
  */
 
 #include "param.h"
  */
 
 #include "param.h"
@@ -552,9 +552,11 @@ open(p, uap, retval)
        struct nameidata *ndp;
        register struct filedesc *fdp = p->p_fd;
        register struct file *fp;
        struct nameidata *ndp;
        register struct filedesc *fdp = p->p_fd;
        register struct file *fp;
+       register struct vnode *vp;
        int fmode, cmode;
        struct file *nfp;
        int fmode, cmode;
        struct file *nfp;
-       int indx, error;
+       int type, indx, error;
+       struct flock lf;
        struct nameidata nd;
        extern struct fileops vnops;
 
        struct nameidata nd;
        extern struct fileops vnops;
 
@@ -568,8 +570,7 @@ open(p, uap, retval)
        ndp->ni_dirp = uap->fname;
        p->p_dupfd = -indx - 1;                 /* XXX check for fdopen */
        if (error = vn_open(ndp, p, fmode, cmode)) {
        ndp->ni_dirp = uap->fname;
        p->p_dupfd = -indx - 1;                 /* XXX check for fdopen */
        if (error = vn_open(ndp, p, fmode, cmode)) {
-               crfree(fp->f_cred);
-               fp->f_count--;
+               ffree(fp);
                if (error == ENODEV &&          /* XXX from fdopen */
                    p->p_dupfd >= 0 &&
                    (error = dupfdopen(fdp, indx, p->p_dupfd, fmode)) == 0) {
                if (error == ENODEV &&          /* XXX from fdopen */
                    p->p_dupfd >= 0 &&
                    (error = dupfdopen(fdp, indx, p->p_dupfd, fmode)) == 0) {
@@ -581,10 +582,32 @@ open(p, uap, retval)
                fdp->fd_ofiles[indx] = NULL;
                return (error);
        }
                fdp->fd_ofiles[indx] = NULL;
                return (error);
        }
+       vp = ndp->ni_vp;
        fp->f_flag = fmode & FMASK;
        fp->f_flag = fmode & FMASK;
+       if (fmode & (O_EXLOCK | O_SHLOCK)) {
+               lf.l_whence = SEEK_SET;
+               lf.l_start = 0;
+               lf.l_len = 0;
+               if (fmode & O_EXLOCK)
+                       lf.l_type = F_WRLCK;
+               else
+                       lf.l_type = F_RDLCK;
+               type = F_FLOCK;
+               if ((fmode & FNONBLOCK) == 0)
+                       type |= F_WAIT;
+               if (error = VOP_ADVLOCK(vp, (caddr_t)fp, F_SETLK, &lf, type)) {
+                       VOP_UNLOCK(vp);
+                       (void) vn_close(vp, fp->f_flag, fp->f_cred, p);
+                       ffree(fp);
+                       fdp->fd_ofiles[indx] = NULL;
+                       return (error);
+               }
+               fp->f_flag |= FHASLOCK;
+       }
+       VOP_UNLOCK(vp);
        fp->f_type = DTYPE_VNODE;
        fp->f_ops = &vnops;
        fp->f_type = DTYPE_VNODE;
        fp->f_ops = &vnops;
-       fp->f_data = (caddr_t)ndp->ni_vp;
+       fp->f_data = (caddr_t)vp;
        *retval = indx;
        return (0);
 }
        *retval = indx;
        return (0);
 }
@@ -1513,9 +1536,11 @@ out:
                vrele(fromnd.ni_dvp);
                vrele(fvp);
        }
                vrele(fromnd.ni_dvp);
                vrele(fvp);
        }
+       p->p_spare[1]--;
        vrele(tond.ni_startdir);
        FREE(tond.ni_pnbuf, M_NAMEI);
 out1:
        vrele(tond.ni_startdir);
        FREE(tond.ni_pnbuf, M_NAMEI);
 out1:
+       p->p_spare[1]--;
        vrele(fromnd.ni_startdir);
        FREE(fromnd.ni_pnbuf, M_NAMEI);
        if (error == -1)
        vrele(fromnd.ni_startdir);
        FREE(fromnd.ni_pnbuf, M_NAMEI);
        if (error == -1)