+ vput(vp);
+ return(error);
+}
+
+/*
+ * Check for write permissions on the specified vnode.
+ * The read-only status of the file system is checked.
+ * Also, prototype text segments cannot be written.
+ */
+vn_writechk(vp)
+ register struct vnode *vp;
+{
+
+ /*
+ * Disallow write attempts on read-only file systems;
+ * unless the file is a socket or a block or character
+ * device resident on the file system.
+ */
+ if ((vp->v_mount->m_flag & M_RDONLY) && vp->v_type != VCHR &&
+ vp->v_type != VBLK && vp->v_type != VSOCK)
+ return (EROFS);
+ /*
+ * If there's shared text associated with
+ * the vnode, try to free it up once. If
+ * we fail, we can't allow writing.
+ */
+ if (vp->v_flag & VTEXT)
+ xrele(vp);
+ if (vp->v_flag & VTEXT)
+ return (ETXTBSY);
+ return (0);
+}
+
+/*
+ * Vnode version of rdwri() for calls on file systems.
+ */
+vn_rdwr(rw, vp, base, len, offset, segflg, ioflg, cred, aresid)
+ enum uio_rw rw;
+ struct vnode *vp;
+ caddr_t base;
+ int len;
+ off_t offset;
+ enum uio_seg segflg;
+ int ioflg;
+ struct ucred *cred;
+ int *aresid;
+{
+ struct uio auio;
+ struct iovec aiov;
+ int error;
+
+ auio.uio_iov = &aiov;
+ auio.uio_iovcnt = 1;
+ aiov.iov_base = base;
+ aiov.iov_len = len;
+ auio.uio_resid = len;
+ auio.uio_offset = offset;
+ auio.uio_segflg = segflg;
+ auio.uio_rw = rw;
+ if (rw == UIO_READ)
+ error = VOP_READ(vp, &auio, &offset, ioflg, cred);
+ else
+ error = VOP_WRITE(vp, &auio, &offset, ioflg, cred);
+ if (aresid)
+ *aresid = auio.uio_resid;
+ else
+ if (auio.uio_resid && error == 0)
+ error = EIO;
+ return (error);
+}
+
+vn_read(fp, uio, cred)
+ struct file *fp;
+ struct uio *uio;
+ struct ucred *cred;
+{
+
+ return (VOP_READ((struct vnode *)fp->f_data, uio, &(fp->f_offset),
+ (fp->f_flag & FNDELAY) ? IO_NDELAY : 0, cred));
+}
+
+vn_write(fp, uio, cred)
+ struct file *fp;
+ struct uio *uio;
+ struct ucred *cred;
+{
+ register struct vnode *vp = (struct vnode *)fp->f_data;
+ int ioflag = 0;
+
+ if (vp->v_type == VREG && (fp->f_flag & FAPPEND))
+ ioflag |= IO_APPEND;
+ if (fp->f_flag & FNDELAY)
+ ioflag |= IO_NDELAY;
+ return (VOP_WRITE(vp, uio, &(fp->f_offset), ioflag, cred));