From owner-svn-src-projects@FreeBSD.ORG Thu May 23 00:58:56 2013 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by hub.freebsd.org (Postfix) with ESMTP id E1F4BD73; Thu, 23 May 2013 00:58:56 +0000 (UTC) (envelope-from rmacklem@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id C398D5E8; Thu, 23 May 2013 00:58:56 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r4N0wuDr047691; Thu, 23 May 2013 00:58:56 GMT (envelope-from rmacklem@svn.freebsd.org) Received: (from rmacklem@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r4N0wutE047689; Thu, 23 May 2013 00:58:56 GMT (envelope-from rmacklem@svn.freebsd.org) Message-Id: <201305230058.r4N0wutE047689@svn.freebsd.org> From: Rick Macklem Date: Thu, 23 May 2013 00:58:56 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r250924 - in projects/nfsv4-packrats/sys: kern sys X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 23 May 2013 00:58:56 -0000 Author: rmacklem Date: Thu May 23 00:58:56 2013 New Revision: 250924 URL: http://svnweb.freebsd.org/changeset/base/250924 Log: Add two generic i/o calls to vfs_subr.c that are required by the new packrats code. Modified: projects/nfsv4-packrats/sys/kern/vfs_vnops.c projects/nfsv4-packrats/sys/sys/vnode.h Modified: projects/nfsv4-packrats/sys/kern/vfs_vnops.c ============================================================================== --- projects/nfsv4-packrats/sys/kern/vfs_vnops.c Thu May 23 00:52:48 2013 (r250923) +++ projects/nfsv4-packrats/sys/kern/vfs_vnops.c Thu May 23 00:58:56 2013 (r250924) @@ -428,10 +428,7 @@ vn_rdwr(enum uio_rw rw, struct vnode *vp { struct uio auio; struct iovec aiov; - struct mount *mp; - struct ucred *cred; - void *rl_cookie; - int error, lock_flags; + int error; auio.uio_iov = &aiov; auio.uio_iovcnt = 1; @@ -442,18 +439,34 @@ vn_rdwr(enum uio_rw rw, struct vnode *vp auio.uio_segflg = segflg; auio.uio_rw = rw; auio.uio_td = td; + error = vn_rdwr_uio(&auio, vp, ioflg, active_cred, file_cred, aresid); + return (error); +} + +/* + * Do an I/O request on a vnode specified in a uio. + */ +int +vn_rdwr_uio(struct uio *uiop, struct vnode *vp, int ioflg, + struct ucred *active_cred, struct ucred *file_cred, ssize_t *aresid) +{ + struct mount *mp; + struct ucred *cred; + void *rl_cookie; + int error, lock_flags; + error = 0; if ((ioflg & IO_NODELOCKED) == 0) { - if (rw == UIO_READ) { - rl_cookie = vn_rangelock_rlock(vp, offset, - offset + len); + if (uiop->uio_rw == UIO_READ) { + rl_cookie = vn_rangelock_rlock(vp, uiop->uio_offset, + uiop->uio_offset + uiop->uio_resid); } else { - rl_cookie = vn_rangelock_wlock(vp, offset, - offset + len); + rl_cookie = vn_rangelock_wlock(vp, uiop->uio_offset, + uiop->uio_offset + uiop->uio_resid); } mp = NULL; - if (rw == UIO_WRITE) { + if (uiop->uio_rw == UIO_WRITE) { if (vp->v_type != VCHR && (error = vn_start_write(vp, &mp, V_WAIT | PCATCH)) != 0) @@ -472,7 +485,7 @@ vn_rdwr(enum uio_rw rw, struct vnode *vp ASSERT_VOP_LOCKED(vp, "IO_NODELOCKED with no vp lock held"); #ifdef MAC if ((ioflg & IO_NOMACCHECK) == 0) { - if (rw == UIO_READ) + if (uiop->uio_rw == UIO_READ) error = mac_vnode_check_read(active_cred, file_cred, vp); else @@ -485,15 +498,15 @@ vn_rdwr(enum uio_rw rw, struct vnode *vp cred = file_cred; else cred = active_cred; - if (rw == UIO_READ) - error = VOP_READ(vp, &auio, ioflg, cred); + if (uiop->uio_rw == UIO_READ) + error = VOP_READ(vp, uiop, ioflg, cred); else - error = VOP_WRITE(vp, &auio, ioflg, cred); + error = VOP_WRITE(vp, uiop, ioflg, cred); } if (aresid) - *aresid = auio.uio_resid; + *aresid = uiop->uio_resid; else - if (auio.uio_resid && error == 0) + if (uiop->uio_resid && error == 0) error = EIO; if ((ioflg & IO_NODELOCKED) == 0) { VOP_UNLOCK(vp, 0); @@ -1168,20 +1181,18 @@ vn_io_fault_pgmove(vm_page_t ma[], vm_of /* - * File table truncate routine. + * Vnode truncate routine. */ -static int -vn_truncate(struct file *fp, off_t length, struct ucred *active_cred, - struct thread *td) +int +vn_truncate_vnode(struct vnode *vp, off_t length, struct ucred *active_cred, + struct ucred *file_cred, struct thread *td) { struct vattr vattr; struct mount *mp; - struct vnode *vp; + struct ucred *cred; void *rl_cookie; int error; - vp = fp->f_vnode; - /* * Lock the whole range for truncation. Otherwise split i/o * might happen partly before and partly after the truncation. @@ -1196,7 +1207,7 @@ vn_truncate(struct file *fp, off_t lengt goto out; } #ifdef MAC - error = mac_vnode_check_write(active_cred, fp->f_cred, vp); + error = mac_vnode_check_write(active_cred, file_cred, vp); if (error) goto out; #endif @@ -1204,7 +1215,11 @@ vn_truncate(struct file *fp, off_t lengt if (error == 0) { VATTR_NULL(&vattr); vattr.va_size = length; - error = VOP_SETATTR(vp, &vattr, fp->f_cred); + if (file_cred != NULL) + cred = file_cred; + else + cred = active_cred; + error = VOP_SETATTR(vp, &vattr, cred); } out: VOP_UNLOCK(vp, 0); @@ -1215,6 +1230,21 @@ out1: } /* + * File table truncate routine. + */ +static int +vn_truncate(struct file *fp, off_t length, struct ucred *active_cred, + struct thread *td) +{ + struct vnode *vp; + int error; + + vp = fp->f_vnode; + error = vn_truncate_vnode(vp, length, active_cred, fp->f_cred, td); + return (error); +} + +/* * File table vnode stat routine. */ static int Modified: projects/nfsv4-packrats/sys/sys/vnode.h ============================================================================== --- projects/nfsv4-packrats/sys/sys/vnode.h Thu May 23 00:52:48 2013 (r250923) +++ projects/nfsv4-packrats/sys/sys/vnode.h Thu May 23 00:58:56 2013 (r250924) @@ -677,6 +677,9 @@ int vn_rdwr_inchunks(enum uio_rw rw, str size_t len, off_t offset, enum uio_seg segflg, int ioflg, struct ucred *active_cred, struct ucred *file_cred, size_t *aresid, struct thread *td); +int vn_rdwr_uio(struct uio *uiop, struct vnode *vp, int ioflg, + struct ucred *active_cred, struct ucred *file_cred, + ssize_t *aresid); int vn_rlimit_fsize(const struct vnode *vn, const struct uio *uio, const struct thread *td); int vn_stat(struct vnode *vp, struct stat *sb, struct ucred *active_cred, @@ -693,6 +696,9 @@ int vn_extattr_rm(struct vnode *vp, int const char *attrname, struct thread *td); int vn_vget_ino(struct vnode *vp, ino_t ino, int lkflags, struct vnode **rvp); +int vn_truncate_vnode(struct vnode *vp, off_t length, + struct ucred *active_cred, struct ucred *file_cred, + struct thread *td); int vn_io_fault_uiomove(char *data, int xfersize, struct uio *uio); int vn_io_fault_pgmove(vm_page_t ma[], vm_offset_t offset, int xfersize,