svn commit: r250924 - in projects/nfsv4-packrats/sys: kern sys
Rick Macklem
rmacklem at FreeBSD.org
Thu May 23 00:58:56 UTC 2013
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,
More information about the svn-src-projects
mailing list