Cleanup remaining tsleep priority issues.
[dragonfly.git] / share / man / man9 / VOP_FSYNC.9
CommitLineData
984263bc
MD
1.\" -*- nroff -*-
2.\"
3.\" Copyright (c) 1996 Doug Rabson
4.\"
5.\" All rights reserved.
6.\"
7.\" This program is free software.
8.\"
9.\" Redistribution and use in source and binary forms, with or without
10.\" modification, are permitted provided that the following conditions
11.\" are met:
12.\" 1. Redistributions of source code must retain the above copyright
13.\" notice, this list of conditions and the following disclaimer.
14.\" 2. Redistributions in binary form must reproduce the above copyright
15.\" notice, this list of conditions and the following disclaimer in the
16.\" documentation and/or other materials provided with the distribution.
17.\"
18.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
19.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
22.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28.\"
29.\" $FreeBSD: src/share/man/man9/VOP_FSYNC.9,v 1.6.2.2 2001/12/17 11:30:18 ru Exp $
2f65cd66 30.\" $DragonFly: src/share/man/man9/VOP_FSYNC.9,v 1.3 2003/08/01 17:46:25 dillon Exp $
984263bc
MD
31.\"
32.Dd July 24, 1996
33.Os
34.Dt VOP_FSYNC 9
35.Sh NAME
36.Nm VOP_FSYNC
37.Nd flush filesystem buffers for a file
38.Sh SYNOPSIS
39.In sys/param.h
40.In sys/vnode.h
41.Ft int
42.Fn VOP_FSYNC "struct vnode *vp" "struct ucred *cred" "int waitfor" "struct proc *p"
43.Sh DESCRIPTION
44This call flushes any dirty filesystem buffers for the file.
45It is used to implement the
46.Xr sync 2
47and
48.Xr fsync 2
49system calls.
50.Pp
51Its arguments are:
52.Bl -tag -width waitfor
53.It Ar vp
54the vnode of the file
55.It Ar cred
56the caller's credentials
57.It Ar waitfor
58whether the function should wait for I/O to complete
59.It Ar p
60the calling process
61.El
62.Pp
63The argument
64.Fa waitfor
65is either
66.Dv MNT_WAIT
67or
68.Dv MNT_NOWAIT
69and specifies whether or not the function should wait for the writes
70to finish before returning.
71.Sh LOCKS
72The file should be locked on entry.
73.Sh RETURN VALUES
74Zero is returned if the call is successful, otherwise an appropriate
75error code is returned.
76.Sh PSEUDOCODE
77.Bd -literal
78int
79vop_fsync(struct vnode *vp, struct ucred *cred, int waitfor, struct proc *p)
80{
81 struct buf *bp;
82 struct buf *nbp;
83 struct timeval tv;
84 int s;
85
86loop:
87 s = splbio();
88 for (bp = vp->v_dirtyblkhd.lh_first; bp; bp = nbp) {
89 nbp = bp->b_vnbufs.le_next;
90
91 /*
92 * Ignore buffers which are already being written.
93 */
94 if (bp->b_flags & B_BUSY)
95 continue;
96
97 /*
98 * Make sure the buffer is dirty.
99 */
100 if ((bp->b_flags & B_DELWRI) == 0)
101 panic("vop_fsync: not dirty");
102
103 vfs_bio_awrite(bp);
104 splx(s);
105 goto loop;
106 }
107 splx(s);
108
109 if (waitfor == MNT_WAIT) {
110 s = splbio();
111 while (vp->v_numoutput) {
112 vp->v_flag |= VBWAIT;
2f65cd66 113 tsleep((caddr_t)&vp->v_numoutput, 0, "vopfsn");
984263bc
MD
114 }
115 splx(s);
116#ifdef DIAGNOSTIC
117 if (vp->v_dirtyblkhd.lh_first) {
118 vprint("vop_fsync: dirty", vp);
119 goto loop;
120 }
121#endif
122 }
123
124 /*
125 * Write out the on-disc version of the vnode.
126 */
127 tv = time;
128 return VOP_UPDATE(vp, &tv, &tv, waitfor == MNT_WAIT);
129}
130.Ed
131.Sh ERRORS
132.Bl -tag -width Er
133.It Bq Er ENOSPC
134The filesystem is full.
135.It Bq Er EDQUOT
136Quota exceeded.
137.El
138.Sh SEE ALSO
139.Xr vnode 9
140.Sh AUTHORS
141This man page was written by
142.An Doug Rabson .