Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 May 2013 00:58:56 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r250924 - in projects/nfsv4-packrats/sys: kern sys
Message-ID:  <201305230058.r4N0wutE047689@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201305230058.r4N0wutE047689>