* Copyright (c) 1982, 1986, 1989 Regents of the University of California.
* All rights reserved.
*
- * %sccs.include.redist.c%
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
*
- * @(#)vfs_vnops.c 7.29 (Berkeley) %G%
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)vfs_vnops.c 7.33 (Berkeley) 6/27/91
*/
#include "param.h"
#include "tty.h"
struct fileops vnops =
- { vn_read, vn_write, vn_ioctl, vn_select, vn_close };
+ { vn_read, vn_write, vn_ioctl, vn_select, vn_closefile };
/*
* Common code for vnode open operations.
struct vattr *vap = &vat;
int error;
- if (fmode & FCREAT) {
+ if (fmode & O_CREAT) {
ndp->ni_nameiop = CREATE | LOCKPARENT | LOCKLEAF;
- if ((fmode & FEXCL) == 0)
+ if ((fmode & O_EXCL) == 0)
ndp->ni_nameiop |= FOLLOW;
if (error = namei(ndp, p))
return (error);
vap->va_mode = cmode;
if (error = VOP_CREATE(ndp, vap, p))
return (error);
- fmode &= ~FTRUNC;
+ fmode &= ~O_TRUNC;
vp = ndp->ni_vp;
} else {
+ VOP_ABORTOP(ndp);
if (ndp->ni_dvp == ndp->ni_vp)
vrele(ndp->ni_dvp);
else
vput(ndp->ni_dvp);
ndp->ni_dvp = NULL;
vp = ndp->ni_vp;
- if (fmode & FEXCL) {
+ if (fmode & O_EXCL) {
error = EEXIST;
goto bad;
}
- fmode &= ~FCREAT;
+ fmode &= ~O_CREAT;
}
} else {
ndp->ni_nameiop = LOOKUP | FOLLOW | LOCKLEAF;
error = EOPNOTSUPP;
goto bad;
}
- if ((fmode & FCREAT) == 0) {
+ if ((fmode & O_CREAT) == 0) {
if (fmode & FREAD) {
if (error = VOP_ACCESS(vp, VREAD, cred, p))
goto bad;
}
- if (fmode & (FWRITE|FTRUNC)) {
+ if (fmode & (FWRITE | O_TRUNC)) {
if (vp->v_type == VDIR) {
error = EISDIR;
goto bad;
goto bad;
}
}
- if (fmode & FTRUNC) {
+ if (fmode & O_TRUNC) {
VATTR_NULL(vap);
vap->va_size = 0;
if (error = VOP_SETATTR(vp, vap, cred, p))
goto bad;
}
- VOP_UNLOCK(vp);
- error = VOP_OPEN(vp, fmode, cred, p);
- if (error)
- vrele(vp);
- return (error);
-
+ if (error = VOP_OPEN(vp, fmode, cred, p))
+ goto bad;
+ if (fmode & FWRITE)
+ vp->v_writecount++;
+ return (0);
bad:
vput(vp);
return (error);
}
/*
- * Vnode version of rdwri() for calls on file systems.
+ * Vnode close call
+ */
+vn_close(vp, flags, cred, p)
+ register struct vnode *vp;
+ int flags;
+ struct ucred *cred;
+ struct proc *p;
+{
+ int error;
+
+ if (flags & FWRITE)
+ vp->v_writecount--;
+ error = VOP_CLOSE(vp, flags, cred, p);
+ vrele(vp);
+ return (error);
+}
+
+/*
+ * Package up an I/O request on a vnode into a uio and do it.
*/
vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, cred, aresid, p)
enum uio_rw rw;
return (error);
}
+/*
+ * File table vnode read routine.
+ */
vn_read(fp, uio, cred)
struct file *fp;
struct uio *uio;
VOP_LOCK(vp);
uio->uio_offset = fp->f_offset;
count = uio->uio_resid;
- error = VOP_READ(vp, uio, (fp->f_flag & FNDELAY) ? IO_NDELAY : 0, cred);
+ error = VOP_READ(vp, uio, (fp->f_flag & FNONBLOCK) ? IO_NDELAY : 0,
+ cred);
fp->f_offset += count - uio->uio_resid;
VOP_UNLOCK(vp);
return (error);
}
+/*
+ * File table vnode write routine.
+ */
vn_write(fp, uio, cred)
struct file *fp;
struct uio *uio;
register struct vnode *vp = (struct vnode *)fp->f_data;
int count, error, ioflag = 0;
- if (vp->v_type == VREG && (fp->f_flag & FAPPEND))
+ if (vp->v_type == VREG && (fp->f_flag & O_APPEND))
ioflag |= IO_APPEND;
- if (fp->f_flag & FNDELAY)
+ if (fp->f_flag & FNONBLOCK)
ioflag |= IO_NDELAY;
VOP_LOCK(vp);
uio->uio_offset = fp->f_offset;
}
/*
- * Get stat info for a vnode.
+ * File table vnode stat routine.
*/
vn_stat(vp, sb, p)
struct vnode *vp;
}
/*
- * Vnode ioctl call
+ * File table vnode ioctl routine.
*/
vn_ioctl(fp, com, data, p)
struct file *fp;
}
/*
- * Vnode select call
+ * File table vnode select routine.
*/
vn_select(fp, which, p)
struct file *fp;
{
return (VOP_SELECT(((struct vnode *)fp->f_data), which, fp->f_flag,
- p->p_ucred, p));
+ fp->f_cred, p));
}
/*
- * Vnode close call
+ * File table vnode close routine.
*/
-vn_close(fp, p)
- register struct file *fp;
+vn_closefile(fp, p)
+ struct file *fp;
struct proc *p;
{
- struct vnode *vp = ((struct vnode *)fp->f_data);
- int error;
- /*
- * Must delete vnode reference from this file entry
- * before VOP_CLOSE, so that only other references
- * will prevent close.
- */
- fp->f_data = (caddr_t) 0;
- error = VOP_CLOSE(vp, fp->f_flag, fp->f_cred, p);
- vrele(vp);
- return (error);
+ return (vn_close(((struct vnode *)fp->f_data), fp->f_flag,
+ fp->f_cred, p));
}
/*