Update physio(9) for physread()/physwrite() separation.
[dragonfly.git] / share / man / man9 / VOP_LOCK.9
1 .\" Copyright (c) 1996 Doug Rabson
2 .\"
3 .\" All rights reserved.
4 .\"
5 .\" This program is free software.
6 .\"
7 .\" Redistribution and use in source and binary forms, with or without
8 .\" modification, are permitted provided that the following conditions
9 .\" are met:
10 .\" 1. Redistributions of source code must retain the above copyright
11 .\"    notice, this list of conditions and the following disclaimer.
12 .\" 2. Redistributions in binary form must reproduce the above copyright
13 .\"    notice, this list of conditions and the following disclaimer in the
14 .\"    documentation and/or other materials provided with the distribution.
15 .\"
16 .\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
17 .\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 .\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 .\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
20 .\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 .\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 .\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 .\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 .\"
27 .\" $FreeBSD: src/share/man/man9/VOP_LOCK.9,v 1.8.2.3 2001/12/17 11:30:18 ru Exp $
28 .\" $DragonFly: src/share/man/man9/VOP_LOCK.9,v 1.7 2007/12/02 22:39:56 swildner Exp $
29 .\"
30 .Dd April 23, 2006
31 .Os
32 .Dt VOP_LOCK 9
33 .Sh NAME
34 .Nm VOP_LOCK ,
35 .Nm VOP_UNLOCK ,
36 .Nm VOP_ISLOCKED ,
37 .Nm vn_lock
38 .Nd serialize access to a vnode
39 .Sh SYNOPSIS
40 .In sys/param.h
41 .In sys/lock.h
42 .In sys/vnode.h
43 .Ft int
44 .Fn VOP_LOCK "struct vnode *vp" "int flags" "struct proc *p"
45 .Ft int
46 .Fn VOP_UNLOCK "struct vnode *vp" "int flags" "struct proc *p"
47 .Ft int
48 .Fn VOP_ISLOCKED "struct vnode *vp" "struct proc *p"
49 .Ft int
50 .Fn vn_lock "struct vnode *vp" "int flags" "struct proc *p"
51 .Sh DESCRIPTION
52 These calls are used to serialize access to the filesystem, such as
53 to prevent two writes to the same file from happening at the
54 same time.
55 .Pp
56 The arguments are:
57 .Bl -tag -width flags
58 .It Fa vp
59 the vnode being locked or unlocked
60 .It Fa flags
61 One of the lock request types:
62 .Bl -column LK_EXCLUPGRADE -offset indent
63 .It Dv LK_SHARED Ta "Shared lock"
64 .It Dv LK_EXCLUSIVE Ta "Exclusive lock"
65 .It Dv LK_UPGRADE Ta "Shared-to-exclusive upgrade"
66 .It Dv LK_EXCLUPGRADE Ta "First shared-to-exclusive upgrade"
67 .It Dv LK_DOWNGRADE Ta "Exclusive-to-shared downgrade"
68 .It Dv LK_RELEASE Ta "Release any type of lock"
69 .El
70 .Pp
71 The lock type may be
72 .Em or Ns 'ed
73 with these lock flags:
74 .Bl -column LK_CANRECURSE -offset indent
75 .It Dv LK_NOWAIT Ta "Do not sleep to wait for lock"
76 .It Dv LK_SLEEPFAIL Ta "Sleep, then return failure"
77 .It Dv LK_CANRECURSE Ta "Allow recursive exclusive lock"
78 .El
79 .Pp
80 The lock type may be
81 .Em or Ns 'ed
82 with these control flags:
83 .Bl -column LK_RETRY -offset indent
84 .It Dv LK_RETRY Ta "Retry until locked"
85 .It Dv LK_NOOBJ Ta "Don't create object"
86 .El
87 .It Ar p
88 process context to use for the locks
89 .El
90 .Pp
91 Kernel code should use
92 .Fn vn_lock
93 to lock a vnode rather than calling
94 .Fn VOP_LOCK
95 directly.
96 .Sh RETURN VALUES
97 Zero is returned on success, otherwise an error is returned.
98 .Sh PSEUDOCODE
99 .Bd -literal
100 struct vopnode {
101     int von_flag;
102     /*
103      * Other filesystem specific data.
104      */
105     ...;
106 };
107 #define VON_LOCKED      1
108 #define VON_WANTED      2
109 #define VTOVON(vp)      ((struct vopnode *) (vp)->v_data)
110
111 int
112 vop_lock(struct vnode *vp)
113 {
114     struct vopnode* vop;
115
116 start:
117     while (vp->v_flag & VXLOCK) {
118         vp->v_flag |= VXWANT;
119         tsleep((caddr_t)vp, 0, "voplk1", 0);
120     }
121     if (vp->v_tag == VT_NON)
122         return ENOENT;
123
124     vop = VTOVON(vp);
125     if (vop->von_flag & VON_LOCKED) {
126         vop->von_flag |= VON_WANTED;
127         tsleep((caddr_t) vop, 0, "voplk2", 0);
128         goto start;
129     }
130
131     vop->von_flag |= VON_LOCKED;
132
133     return 0;
134 }
135
136 int
137 vop_unlock(struct vnode *vp)
138 {
139     struct vopnode *vop = VTOVON(vp);
140
141     if ((vop->von_flag & VON_LOCKED) == 0) {
142         panic("vop_unlock not locked");
143     }
144     vop->von_flag &= ~VON_LOCKED;
145     if (vop->von_flag & VON_WANTED) {
146         vop->von_flag &= ~VON_WANTED;
147         wakeup((caddr_t) vop);
148     }
149
150     return 0;
151 }
152
153 int
154 vop_islocked(struct vnode *vp)
155 {
156     struct vopnode *vop = VTOVON(vp);
157
158     if (vop->von_flag & VON_LOCKED)
159         return 1;
160     else
161         return 0;
162 }
163 .Ed
164 .Sh SEE ALSO
165 .Xr vnode 9
166 .Sh AUTHORS
167 This man page was written by
168 .An Doug Rabson .