summaryrefslogtreecommitdiffstats
path: root/share/man/man9/VOP_RDWR.9
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>1997-03-03 18:01:01 +0000
committerdfr <dfr@FreeBSD.org>1997-03-03 18:01:01 +0000
commit7e67e1e73230219ea55118f095cc1800faf2c534 (patch)
treee33dd16a7d9cf5ad26d4f75d4b2d3db1b3d2fdd9 /share/man/man9/VOP_RDWR.9
parent6c38eceeb9c3076678e4763e02440823894d2323 (diff)
downloadFreeBSD-src-7e67e1e73230219ea55118f095cc1800faf2c534.zip
FreeBSD-src-7e67e1e73230219ea55118f095cc1800faf2c534.tar.gz
This is the current draft of my filesystem manpages. Some files are
incomplete and some are just placeholders but I wanted to try to get something at least into 2.2 on the grounds that what I have is a lot better than nothing. I also wanted to commit something which documents the interfaces in 2.2 before I start updating the documentation for 3.0. This is a definite 2.2 candidate and is also relavent to 2.1 if people still care about that branch.
Diffstat (limited to 'share/man/man9/VOP_RDWR.9')
-rw-r--r--share/man/man9/VOP_RDWR.9226
1 files changed, 226 insertions, 0 deletions
diff --git a/share/man/man9/VOP_RDWR.9 b/share/man/man9/VOP_RDWR.9
new file mode 100644
index 0000000..61c0635
--- /dev/null
+++ b/share/man/man9/VOP_RDWR.9
@@ -0,0 +1,226 @@
+.\" -*- nroff -*-
+.\"
+.\" Copyright (c) 1996 Doug Rabson
+.\"
+.\" All rights reserved.
+.\"
+.\" This program is free software.
+.\"
+.\" 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.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``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 DEVELOPERS 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.
+.\"
+.\" $Id$
+.\"
+.Dd July 24, 1996
+.Os
+.Dt VOP_RDWR 9
+.Sh NAME
+.Nm VOP_READ ,
+.Nm VOP_WRITE
+.Nd read or write a file
+.Sh SYNOPSIS
+.Fd #include <sys/vnode.h>
+.Fd #include <sys/uio.h>
+.Ft int
+.Fn VOP_READ "struct vnode *vp" "struct uio *uio" "int ioflag" "struct ucred *cred"
+.Ft int
+.Fn VOP_WRITE "struct vnode *vp" "struct uio *uio" "int ioflag" "struct ucred *cred"
+.Sh DESCRIPTION
+These entry points read or write the contents of a file
+.Pp
+The arguments are:
+.Bl -tag -width ioflag
+.It Ar vp
+the vnode of the file
+.It Ar uio
+the location of the data to be read or written
+.It Ar ioflag
+various flags
+.It Ar cnp
+the credentials of the caller
+.El
+.Pp
+The
+.Fa ioflag
+argument is a bit mask which can contain the following flags:
+.Bl -tag -width IO_NODELOCKED
+.It Dv IO_UNIT
+do I/O as atomic unit
+.It Dv IO_APPEND
+append write to end
+.It Dv IO_SYNC
+do I/O syncronously
+.It Dv IO_NODELOCKED
+underlying node already locked
+.It Dv IO_NDELAY
+.Dv FNDELAY
+flag set in file table
+.It Dv IO_VMIO
+data alread in VMIO space
+.El
+.Sh LOCKS
+The file should be locked on entry and will still be locked on exit.
+.Sh RETURN VALUES
+Zero is returned on success, otherwise an error code is returned.
+.Sh PSEUDOCODE
+.Bd -literal
+int
+vop_read(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred)
+{
+ struct buf *bp;
+ off_t bytesinfile;
+ daddr_t lbn, nextlbn;
+ long size, xfersize, blkoffset;
+ int error;
+
+ size = block size of filesystem;
+
+ for (error = 0, bp = NULL; uio->uio_resid > 0; bp = NULL) {
+ bytesinfile = size of file - uio->uio_offset;
+ if (bytesinfile <= 0)
+ break;
+
+ lbn = uio->uio_offset / size;
+ blkoffset = uio->uio_offset - lbn * size;
+
+ xfersize = size - blkoffset;
+ if (uio->uio_resid < xfersize)
+ xfersize = uio->uio_resid;
+ if (bytesinfile < xfersize)
+ xfersize = bytesinfile;
+
+ error = bread(vp, lbn, size, NOCRED, &bp);
+ if (error) {
+ brelse(bp);
+ bp = NULL;
+ break;
+ }
+
+ /*
+ * We should only get non-zero b_resid when an I/O error
+ * has occurred, which should cause us to break above.
+ * However, if the short read did not cause an error,
+ * then we want to ensure that we do not uiomove bad
+ * or uninitialized data.
+ */
+ size -= bp->b_resid;
+ if (size < xfersize) {
+ if (size == 0)
+ break;
+ xfersize = size;
+ }
+
+ error = uiomove((char *)bp->b_data + blkoffset, (int)xfersize, uio);
+ if (error)
+ break;
+
+ bqrelse(bp);
+ }
+ if (bp != NULL)
+ bqrelse(bp);
+
+ return error;
+}
+
+int
+vop_write(struct vnode *vp, struct uio *uio, int ioflag, struct ucred *cred)
+{
+ struct buf *bp;
+ off_t bytesinfile;
+ daddr_t lbn, nextlbn;
+ off_t osize;
+ long size, resid, xfersize, blkoffset;
+ int flags;
+ int error;
+
+ osize = size of file;
+ size = block size of filesystem;
+ resid = uio->uio_resid;
+ if (ioflag & IO_SYNC)
+ flags = B_SYNC;
+ else
+ flags = 0;
+
+ for (error = 0; uio->uio_resid > 0;) {
+ lbn = uio->uio_offset / size;
+ blkoffset = uio->uio_offset - lbn * size;
+
+ xfersize = size - blkoffset;
+ if (uio->uio_resid < xfersize)
+ xfersize = uio->uio_resid;
+
+ if (uio->uio_offset + xfersize > size of file)
+ vnode_pager_setsize(vp, uio->uio_offset + xfersize);
+
+ if (size > xfersize)
+ flags |= B_CLRBUF;
+ else
+ flags &= ~B_CLRBUF;
+
+ error = find_block_in_file(vp, lbn, blkoffset + xfersize,
+ cred, &bp, flags);
+ if (error)
+ break;
+
+ if (uio->uio_offset + xfersize > size of file)
+ set size of file to uio->uio_offset + xfersize;
+
+ error = uiomove((char *)bp->b_data + blkoffset, (int) xfersize, uio);
+ /* XXX ufs does not check the error here. Why? */
+
+ if (ioflag & IO_VMIO)
+ bp->b_flags |= B_RELBUF; /* ??? */
+
+ if (ioflag & IO_SYNC)
+ bwrite(bp);
+ else if (xfersize + blkoffset == size)
+ bawrite(bp);
+ else
+ bdwrite(bp);
+
+ if (error || xfersize == 0)
+ break;
+ }
+
+ if (error) {
+ if (ioflag & IO_UNIT) {
+ VOP_TRUNCATE(vp, osize, ioflag & IO_SYNC, cred, uio->uio_procp);
+ uio->uio_offset -= resid - uio->uio_resid;
+ uio->uio_resid = resid;
+ }
+ } else if (resid > uio->uio_resid && (ioflag & IO_SYNC)) {
+ struct timeval tv;
+ error = VOP_UPDATE(vp, &tv, &tv, 1); /* XXX what does this do? */
+ }
+
+ return error;
+}
+.Ed
+.Sh ERRORS
+.Bl -tag -width ENOSPC
+.It Bq Er ENOSPC
+The filesystem is full.
+.El
+.Sh SEE ALSO
+.Xr vnode 9 ,
+.Xr uiomove 9
+.Sh AUTHORS
+This man page was written by Doug Rabson.
+
OpenPOWER on IntegriCloud