]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - share/man/man9/make_dev.9
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / share / man / man9 / make_dev.9
1 .\" Copyright (c) 1999 Chris Costello
2 .\" All rights reserved.
3 .\"
4 .\" Redistribution and use in source and binary forms, with or without
5 .\" modification, are permitted provided that the following conditions
6 .\" are met:
7 .\" 1. Redistributions of source code must retain the above copyright
8 .\"    notice, this list of conditions and the following disclaimer.
9 .\" 2. Redistributions in binary form must reproduce the above copyright
10 .\"    notice, this list of conditions and the following disclaimer in the
11 .\"    documentation and/or other materials provided with the distribution.
12 .\"
13 .\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 .\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 .\" SUCH DAMAGE.
24 .\"
25 .\" $FreeBSD$
26 .\"
27 .Dd May 3, 2011
28 .Dt MAKE_DEV 9
29 .Os
30 .Sh NAME
31 .Nm make_dev ,
32 .Nm make_dev_cred ,
33 .Nm make_dev_credf ,
34 .Nm make_dev_p ,
35 .Nm make_dev_alias ,
36 .Nm make_dev_alias_p ,
37 .Nm destroy_dev ,
38 .Nm destroy_dev_sched ,
39 .Nm destroy_dev_sched_cb ,
40 .Nm destroy_dev_drain ,
41 .Nm dev_depends
42 .Nd manage
43 .Vt cdev Ns 's
44 and DEVFS registration for devices
45 .Sh SYNOPSIS
46 .In sys/param.h
47 .In sys/conf.h
48 .Ft struct cdev *
49 .Fn make_dev "struct cdevsw *cdevsw" "int unit" "uid_t uid" "gid_t gid" "int perms" "const char *fmt" ...
50 .Ft struct cdev *
51 .Fn make_dev_cred "struct cdevsw *cdevsw" "int unit" "struct ucred *cr" "uid_t uid" "gid_t gid" "int perms" "const char *fmt" ...
52 .Ft struct cdev *
53 .Fn make_dev_credf "int flags" "struct cdevsw *cdevsw" "int unit" "struct ucred *cr" "uid_t uid" "gid_t gid" "int perms" "const char *fmt" ...
54 .Ft int
55 .Fn make_dev_p "int flags" "struct cdev **cdev" "struct cdevsw *devsw" "struct ucred *cr" "uid_t uid" "gid_t gid" "int mode" "const char *fmt" ...
56 .Ft struct cdev *
57 .Fn make_dev_alias "struct cdev *pdev" "const char *fmt" ...
58 .Ft int
59 .Fn make_dev_alias_p "int flags" "struct cdev **cdev" "struct cdev *pdev" "const char *fmt" ...
60 .Ft void
61 .Fn destroy_dev "struct cdev *dev"
62 .Ft void
63 .Fn destroy_dev_sched "struct cdev *dev"
64 .Ft void
65 .Fn destroy_dev_sched_cb "struct cdev *dev" "void (*cb)(void *)" "void *arg"
66 .Ft void
67 .Fn destroy_dev_drain "struct cdevsw *csw"
68 .Ft void
69 .Fn dev_depends "struct cdev *pdev" "struct cdev *cdev"
70 .Sh DESCRIPTION
71 The
72 .Fn make_dev_credf
73 function creates a
74 .Fa cdev
75 structure for a new device.
76 It also notifies
77 .Xr devfs 5
78 of the presence of the new device, that causes corresponding nodes
79 to be created.
80 Besides this, a
81 .Xr devctl 4
82 notification is sent.
83 The device will be owned by
84 .Va uid ,
85 with the group ownership as
86 .Va gid .
87 The name is the expansion of
88 .Va fmt
89 and following arguments as
90 .Xr printf 9
91 would print it.
92 The name determines its path under
93 .Pa /dev
94 or other
95 .Xr devfs 5
96 mount point and may contain slash
97 .Ql /
98 characters to denote subdirectories.
99 The permissions of the file specified in
100 .Va perms
101 are defined in
102 .In sys/stat.h :
103 .Pp
104 .Bd -literal -offset indent -compact
105 #define S_IRWXU 0000700    /* RWX mask for owner */
106 #define S_IRUSR 0000400    /* R for owner */
107 #define S_IWUSR 0000200    /* W for owner */
108 #define S_IXUSR 0000100    /* X for owner */
109
110 #define S_IRWXG 0000070    /* RWX mask for group */
111 #define S_IRGRP 0000040    /* R for group */
112 #define S_IWGRP 0000020    /* W for group */
113 #define S_IXGRP 0000010    /* X for group */
114
115 #define S_IRWXO 0000007    /* RWX mask for other */
116 #define S_IROTH 0000004    /* R for other */
117 #define S_IWOTH 0000002    /* W for other */
118 #define S_IXOTH 0000001    /* X for other */
119
120 #define S_ISUID 0004000    /* set user id on execution */
121 #define S_ISGID 0002000    /* set group id on execution */
122 #define S_ISVTX 0001000    /* sticky bit */
123 #ifndef _POSIX_SOURCE
124 #define S_ISTXT 0001000
125 #endif
126 .Ed
127 .Pp
128 The
129 .Va cr
130 argument specifies credentials that will be stored in the
131 .Fa si_cred
132 member of the initialized
133 .Fa struct cdev .
134 The
135 .Va flags
136 argument alters the operation of
137 .Fn make_dev_credf
138 or
139 .Fn make_dev_p .
140 The following values are currently accepted:
141 .Pp
142 .Bl -tag -width "MAKEDEV_CHECKNAME" -compact -offset indent
143 .It MAKEDEV_REF
144 reference the created device
145 .It MAKEDEV_NOWAIT
146 do not sleep, the call may fail
147 .It MAKEDEV_WAITOK
148 allow the function to sleep to satisfy malloc
149 .It MAKEDEV_ETERNAL
150 created device will be never destroyed
151 .It MAKEDEV_CHECKNAME
152 return an error if the device name is invalid or already exists
153 .El
154 .Pp
155 Only
156 .Dv MAKEDEV_NOWAIT ,
157 .Dv MAKEDEV_WAITOK
158 and
159 .Dv MAKEDEV_CHECKNAME
160 values are accepted for the
161 .Fn make_dev_alias_p
162 function.
163 .Pp
164 The
165 .Dv MAKEDEV_WAITOK
166 flag is assumed if none of
167 .Dv MAKEDEV_WAITOK ,
168 .Dv MAKEDEV_NOWAIT
169 is specified.
170 .Pp
171 The
172 .Xr dev_clone 9
173 event handler shall specify
174 .Dv MAKEDEV_REF
175 flag when creating a device in response to lookup, to avoid race where
176 the device created is destroyed immediately after
177 .Xr devfs_lookup 9
178 drops his reference to cdev.
179 .Pp
180 The
181 .Dv MAKEDEV_ETERNAL
182 flag allows the kernel to not acquire some locks when translating system
183 calls into the cdevsw methods calls.
184 It is responsibility of the driver author to make sure that
185 .Fn destroy_dev
186 is never called on the returned cdev.
187 For the convenience, use the
188 .Dv MAKEDEV_ETERNAL_KLD
189 flag for the code that can be compiled into kernel or loaded
190 (and unloaded) as loadable module.
191 .Pp
192 A panic will occur if the MAKEDEV_CHECKNAME flag is not specified
193 and the device name is invalid or already exists.
194 .Pp
195 The
196 .Fn make_dev_cred
197 function is equivalent to the call
198 .Bd -literal -offset indent
199 make_dev_credf(0, cdevsw, unit, cr, uid, gid, perms, fmt, ...);
200 .Ed
201 .Pp
202 The
203 .Fn make_dev
204 function call is the same as
205 .Bd -literal -offset indent
206 make_dev_credf(0, cdevsw, unit, NULL, uid, gid, perms, fmt, ...);
207 .Ed
208 .Pp
209 The
210 .Fn make_dev_p
211 function is similar to
212 .Fn make_dev_credf
213 but it may return an error number and takes a pointer to the resulting
214 .Ft *cdev
215 as an argument.
216 .Pp
217 The
218 .Fn make_dev_alias
219 function takes the returned
220 .Ft cdev
221 from
222 .Fn make_dev
223 and makes another (aliased) name for this device.
224 It is an error to call
225 .Fn make_dev_alias
226 prior to calling
227 .Fn make_dev .
228 .Pp
229 .Fn make_dev_alias_p
230 function is similar to
231 .Fn make_dev_alias
232 but it takes a pointer to the resulting
233 .Ft *cdev
234 as an argument and may return an error.
235 .Pp
236 The
237 .Fa cdev
238 returned by
239 .Fn make_dev
240 and
241 .Fn make_dev_alias
242 has two fields,
243 .Fa si_drv1
244 and
245 .Fa si_drv2 ,
246 that are available to store state.
247 Both fields are of type
248 .Ft void * .
249 These are designed to replace the
250 .Fa unit
251 argument to
252 .Fn make_dev ,
253 which can be obtained with
254 .Fn dev2unit .
255 .Pp
256 The
257 .Fn destroy_dev
258 function takes the returned
259 .Fa cdev
260 from
261 .Fn make_dev
262 and destroys the registration for that device.
263 The notification is sent to
264 .Xr devctl 4
265 about the destruction event.
266 Do not call
267 .Fn destroy_dev
268 on devices that were created with
269 .Fn make_dev_alias .
270 .Pp
271 The
272 .Fn dev_depends
273 function establishes a parent-child relationship between two devices.
274 The net effect is that a
275 .Fn destroy_dev
276 of the parent device will also result in the destruction of the
277 child device(s),
278 if any exist.
279 A device may simultaneously be a parent and a child,
280 so it is possible to build a complete hierarchy.
281 .Pp
282 The
283 .Fn destroy_dev_sched_cb
284 function schedules execution of the
285 .Fn destroy_dev
286 for the specified
287 .Fa cdev
288 in the safe context.
289 After
290 .Fn destroy_dev
291 is finished, and if the supplied
292 .Fa cb
293 is not
294 .Dv NULL ,
295 the callback
296 .Fa cb
297 is called, with argument
298 .Fa arg .
299 The
300 .Fn destroy_dev_sched
301 function is the same as
302 .Bd -literal -offset indent
303 destroy_dev_sched_cb(cdev, NULL, NULL);
304 .Ed
305 .Pp
306 The
307 .Fn d_close
308 driver method cannot call
309 .Fn destroy_dev
310 directly.
311 Doing so causes deadlock when
312 .Fn destroy_dev
313 waits for all threads to leave the driver methods.
314 Also, because
315 .Fn destroy_dev
316 sleeps, no non-sleepable locks may be held over the call.
317 The
318 .Fn destroy_dev_sched
319 family of functions overcome these issues.
320 .Pp
321 The device driver may call the
322 .Fn destroy_dev_drain
323 function to wait until all devices that have supplied
324 .Fa csw
325 as cdevsw, are destroyed.
326 This is useful when driver knows that
327 .Fn destroy_dev_sched
328 is called for all instantiated devices, but need to postpone module
329 unload until
330 .Fn destroy_dev
331 is actually finished for all of them.
332 .Sh RETURN VALUES
333 If successful,
334 .Fn make_dev_p
335 will return 0, otherwise it will return an error.
336 If successful,
337 .Fn make_dev_credf
338 will return a valid
339 .Fa cdev
340 pointer, otherwise it will return
341 .Dv NULL .
342 .Sh ERRORS
343 The
344 .Fn make_dev_p
345 and
346 .Fn make_dev_alias_p
347 call will fail and the device will be not registered if:
348 .Bl -tag -width Er
349 .It Bq Er ENOMEM
350 The
351 .Dv MAKEDEV_NOWAIT
352 flag was specified and a memory allocation request could not be satisfied.
353 .It Bq Er ENAMETOOLONG
354 The
355 .Dv MAKEDEV_CHECKNAME
356 flag was specified and the provided device name is longer than
357 .Dv SPECNAMELEN .
358 .It Bq Er EINVAL
359 The
360 .Dv MAKEDEV_CHECKNAME
361 flag was specified and the provided device name is empty, contains a
362 .Qq \&.
363 or
364 .Qq ..
365 path component or ends with
366 .Ql / .
367 .It Bq Er EEXIST
368 The
369 .Dv MAKEDEV_CHECKNAME
370 flag was specified and the provided device name already exists.
371 .El
372 .Pp
373 .Sh SEE ALSO
374 .Xr devctl 4 ,
375 .Xr devfs 5 ,
376 .Xr destroy_dev_drain 9 ,
377 .Xr dev_clone 9
378 .Sh HISTORY
379 The
380 .Fn make_dev
381 and
382 .Fn destroy_dev
383 functions first appeared in
384 .Fx 4.0 .
385 The function
386 .Fn make_dev_alias
387 first appeared in
388 .Fx 4.1 .
389 The function
390 .Fn dev_depends
391 first appeared in
392 .Fx 5.0 .
393 The functions
394 .Fn make_dev_credf ,
395 .Fn destroy_dev_sched ,
396 .Fn destroy_dev_sched_cb
397 first appeared in
398 .Fx 7.0 .
399 The function
400 .Fn make_dev_p
401 first appeared in
402 .Fx 8.2 .