1 /* $OpenBSD: tmpfs_specops.c,v 1.9 2022/06/26 05:20:42 visa Exp $ */
2 /* $NetBSD: tmpfs_specops.c,v 1.10 2011/05/24 20:17:49 rmind Exp $ */
3
4 /*
5 * Copyright (c) 2005 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Julio M. Merino Vidal, developed as part of Google's Summer of Code
10 * 2005 program.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /*
35 * tmpfs vnode interface for special devices.
36 */
37
38 #include <sys/param.h>
39 #include <sys/vnode.h>
40 #include <sys/specdev.h>
41 #include <tmpfs/tmpfs_vnops.h>
42
43 #include <tmpfs/tmpfs.h>
44
45 int tmpfs_spec_read (void *);
46 int tmpfs_spec_write (void *);
47
48 /*
49 * vnode operations vector used for special devices stored in a tmpfs
50 * file system.
51 */
52
53 const struct vops tmpfs_specvops = {
54 .vop_close = spec_close,
55 .vop_access = tmpfs_access,
56 .vop_getattr = tmpfs_getattr,
57 .vop_setattr = tmpfs_setattr,
58 .vop_read = tmpfs_spec_read,
59 .vop_write = tmpfs_spec_write,
60 .vop_fsync = spec_fsync,
61 .vop_inactive = tmpfs_inactive,
62 .vop_reclaim = tmpfs_reclaim,
63 .vop_lock = tmpfs_lock,
64 .vop_unlock = tmpfs_unlock,
65 .vop_print = tmpfs_print,
66 .vop_islocked = tmpfs_islocked,
67
68 /* keep in sync with spec_vops */
69 .vop_lookup = vop_generic_lookup,
70 .vop_create = vop_generic_badop,
71 .vop_mknod = vop_generic_badop,
72 .vop_open = spec_open,
73 .vop_ioctl = spec_ioctl,
74 .vop_kqfilter = spec_kqfilter,
75 .vop_revoke = vop_generic_revoke,
76 .vop_remove = vop_generic_badop,
77 .vop_link = vop_generic_badop,
78 .vop_rename = vop_generic_badop,
79 .vop_mkdir = vop_generic_badop,
80 .vop_rmdir = vop_generic_badop,
81 .vop_symlink = vop_generic_badop,
82 .vop_readdir = vop_generic_badop,
83 .vop_readlink = vop_generic_badop,
84 .vop_abortop = vop_generic_badop,
85 .vop_bmap = vop_generic_bmap,
86 .vop_strategy = spec_strategy,
87 .vop_pathconf = spec_pathconf,
88 .vop_advlock = spec_advlock,
89 .vop_bwrite = vop_generic_bwrite,
90 };
91
92 int
tmpfs_spec_read(void * v)93 tmpfs_spec_read(void *v)
94 {
95 struct vop_read_args /* {
96 struct vnode *a_vp;
97 struct uio *a_uio;
98 int a_ioflag;
99 kauth_cred_t a_cred;
100 } */ *ap = v;
101 struct vnode *vp = ap->a_vp;
102
103 tmpfs_update(VP_TO_TMPFS_NODE(vp), TMPFS_NODE_ACCESSED);
104 return (spec_read(ap));
105 }
106
107 int
tmpfs_spec_write(void * v)108 tmpfs_spec_write(void *v)
109 {
110 struct vop_write_args /* {
111 struct vnode *a_vp;
112 struct uio *a_uio;
113 int a_ioflag;
114 kauth_cred_t a_cred;
115 } */ *ap = v;
116 struct vnode *vp = ap->a_vp;
117
118 tmpfs_update(VP_TO_TMPFS_NODE(vp), TMPFS_NODE_MODIFIED);
119 return (spec_write(ap));
120 }
121