| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: kernfs_vnops.c,v 1.171 2021/07/18 23:56:13 dholland Exp $ */ | | 1 | /* $NetBSD: kernfs_vnops.c,v 1.172 2021/07/19 01:33:53 dholland Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 1992, 1993 | | 4 | * Copyright (c) 1992, 1993 |
5 | * The Regents of the University of California. All rights reserved. | | 5 | * The Regents of the University of California. All rights reserved. |
6 | * | | 6 | * |
7 | * This code is derived from software donated to Berkeley by | | 7 | * This code is derived from software donated to Berkeley by |
8 | * Jan-Simon Pendry. | | 8 | * Jan-Simon Pendry. |
9 | * | | 9 | * |
10 | * Redistribution and use in source and binary forms, with or without | | 10 | * Redistribution and use in source and binary forms, with or without |
11 | * modification, are permitted provided that the following conditions | | 11 | * modification, are permitted provided that the following conditions |
12 | * are met: | | 12 | * are met: |
13 | * 1. Redistributions of source code must retain the above copyright | | 13 | * 1. Redistributions of source code must retain the above copyright |
14 | * notice, this list of conditions and the following disclaimer. | | 14 | * notice, this list of conditions and the following disclaimer. |
| @@ -29,27 +29,27 @@ | | | @@ -29,27 +29,27 @@ |
29 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | | 29 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | | 30 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
31 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | | 31 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
32 | * SUCH DAMAGE. | | 32 | * SUCH DAMAGE. |
33 | * | | 33 | * |
34 | * @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95 | | 34 | * @(#)kernfs_vnops.c 8.15 (Berkeley) 5/21/95 |
35 | */ | | 35 | */ |
36 | | | 36 | |
37 | /* | | 37 | /* |
38 | * Kernel parameter filesystem (/kern) | | 38 | * Kernel parameter filesystem (/kern) |
39 | */ | | 39 | */ |
40 | | | 40 | |
41 | #include <sys/cdefs.h> | | 41 | #include <sys/cdefs.h> |
42 | __KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.171 2021/07/18 23:56:13 dholland Exp $"); | | 42 | __KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.172 2021/07/19 01:33:53 dholland Exp $"); |
43 | | | 43 | |
44 | #include <sys/param.h> | | 44 | #include <sys/param.h> |
45 | #include <sys/systm.h> | | 45 | #include <sys/systm.h> |
46 | #include <sys/kernel.h> | | 46 | #include <sys/kernel.h> |
47 | #include <sys/vmmeter.h> | | 47 | #include <sys/vmmeter.h> |
48 | #include <sys/time.h> | | 48 | #include <sys/time.h> |
49 | #include <sys/proc.h> | | 49 | #include <sys/proc.h> |
50 | #include <sys/vnode.h> | | 50 | #include <sys/vnode.h> |
51 | #include <sys/malloc.h> | | 51 | #include <sys/malloc.h> |
52 | #include <sys/file.h> | | 52 | #include <sys/file.h> |
53 | #include <sys/stat.h> | | 53 | #include <sys/stat.h> |
54 | #include <sys/mount.h> | | 54 | #include <sys/mount.h> |
55 | #include <sys/namei.h> | | 55 | #include <sys/namei.h> |
| @@ -127,139 +127,118 @@ const struct kernfs_fileop kernfs_defaul | | | @@ -127,139 +127,118 @@ const struct kernfs_fileop kernfs_defaul |
127 | { .kf_fileop = KERNFS_XWRITE }, | | 127 | { .kf_fileop = KERNFS_XWRITE }, |
128 | { .kf_fileop = KERNFS_FILEOP_OPEN }, | | 128 | { .kf_fileop = KERNFS_FILEOP_OPEN }, |
129 | { .kf_fileop = KERNFS_FILEOP_GETATTR, | | 129 | { .kf_fileop = KERNFS_FILEOP_GETATTR, |
130 | .kf_vop = kernfs_default_fileop_getattr }, | | 130 | .kf_vop = kernfs_default_fileop_getattr }, |
131 | { .kf_fileop = KERNFS_FILEOP_IOCTL }, | | 131 | { .kf_fileop = KERNFS_FILEOP_IOCTL }, |
132 | { .kf_fileop = KERNFS_FILEOP_CLOSE }, | | 132 | { .kf_fileop = KERNFS_FILEOP_CLOSE }, |
133 | { .kf_fileop = KERNFS_FILEOP_READ, | | 133 | { .kf_fileop = KERNFS_FILEOP_READ, |
134 | .kf_vop = kernfs_default_xread }, | | 134 | .kf_vop = kernfs_default_xread }, |
135 | { .kf_fileop = KERNFS_FILEOP_WRITE, | | 135 | { .kf_fileop = KERNFS_FILEOP_WRITE, |
136 | .kf_vop = kernfs_default_xwrite }, | | 136 | .kf_vop = kernfs_default_xwrite }, |
137 | }; | | 137 | }; |
138 | | | 138 | |
139 | int kernfs_lookup(void *); | | 139 | int kernfs_lookup(void *); |
140 | #define kernfs_create genfs_eopnotsupp | | | |
141 | #define kernfs_mknod genfs_eopnotsupp | | | |
142 | int kernfs_open(void *); | | 140 | int kernfs_open(void *); |
143 | int kernfs_close(void *); | | 141 | int kernfs_close(void *); |
144 | int kernfs_access(void *); | | 142 | int kernfs_access(void *); |
145 | int kernfs_getattr(void *); | | 143 | int kernfs_getattr(void *); |
146 | int kernfs_setattr(void *); | | 144 | int kernfs_setattr(void *); |
147 | int kernfs_read(void *); | | 145 | int kernfs_read(void *); |
148 | int kernfs_write(void *); | | 146 | int kernfs_write(void *); |
149 | #define kernfs_fcntl genfs_fcntl | | | |
150 | int kernfs_ioctl(void *); | | 147 | int kernfs_ioctl(void *); |
151 | #define kernfs_poll genfs_poll | | | |
152 | #define kernfs_revoke genfs_revoke | | | |
153 | #define kernfs_fsync genfs_nullop | | | |
154 | #define kernfs_seek genfs_nullop | | | |
155 | #define kernfs_remove genfs_eopnotsupp | | | |
156 | int kernfs_link(void *); | | 148 | int kernfs_link(void *); |
157 | #define kernfs_rename genfs_eopnotsupp | | | |
158 | #define kernfs_mkdir genfs_eopnotsupp | | | |
159 | #define kernfs_rmdir genfs_eopnotsupp | | | |
160 | int kernfs_symlink(void *); | | 149 | int kernfs_symlink(void *); |
161 | int kernfs_readdir(void *); | | 150 | int kernfs_readdir(void *); |
162 | #define kernfs_readlink genfs_eopnotsupp | | | |
163 | #define kernfs_abortop genfs_abortop | | | |
164 | int kernfs_inactive(void *); | | 151 | int kernfs_inactive(void *); |
165 | int kernfs_reclaim(void *); | | 152 | int kernfs_reclaim(void *); |
166 | #define kernfs_lock genfs_lock | | | |
167 | #define kernfs_unlock genfs_unlock | | | |
168 | #define kernfs_bmap genfs_badop | | | |
169 | #define kernfs_strategy genfs_eopnotsupp | | | |
170 | int kernfs_print(void *); | | 153 | int kernfs_print(void *); |
171 | #define kernfs_islocked genfs_islocked | | | |
172 | int kernfs_pathconf(void *); | | 154 | int kernfs_pathconf(void *); |
173 | #define kernfs_advlock genfs_einval | | | |
174 | #define kernfs_bwrite genfs_eopnotsupp | | | |
175 | int kernfs_getpages(void *); | | 155 | int kernfs_getpages(void *); |
176 | #define kernfs_putpages genfs_putpages | | | |
177 | | | 156 | |
178 | static int kernfs_xread(struct kernfs_node *, int, char **, | | 157 | static int kernfs_xread(struct kernfs_node *, int, char **, |
179 | size_t, size_t *); | | 158 | size_t, size_t *); |
180 | static int kernfs_xwrite(const struct kernfs_node *, char *, size_t); | | 159 | static int kernfs_xwrite(const struct kernfs_node *, char *, size_t); |
181 | | | 160 | |
182 | int (**kernfs_vnodeop_p)(void *); | | 161 | int (**kernfs_vnodeop_p)(void *); |
183 | const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { | | 162 | const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { |
184 | { &vop_default_desc, vn_default_error }, | | 163 | { &vop_default_desc, vn_default_error }, |
185 | { &vop_parsepath_desc, genfs_parsepath }, /* parsepath */ | | 164 | { &vop_parsepath_desc, genfs_parsepath }, /* parsepath */ |
186 | { &vop_lookup_desc, kernfs_lookup }, /* lookup */ | | 165 | { &vop_lookup_desc, kernfs_lookup }, /* lookup */ |
187 | { &vop_create_desc, kernfs_create }, /* create */ | | 166 | { &vop_create_desc, genfs_eopnotsupp }, /* create */ |
188 | { &vop_mknod_desc, kernfs_mknod }, /* mknod */ | | 167 | { &vop_mknod_desc, genfs_eopnotsupp }, /* mknod */ |
189 | { &vop_open_desc, kernfs_open }, /* open */ | | 168 | { &vop_open_desc, kernfs_open }, /* open */ |
190 | { &vop_close_desc, kernfs_close }, /* close */ | | 169 | { &vop_close_desc, kernfs_close }, /* close */ |
191 | { &vop_access_desc, kernfs_access }, /* access */ | | 170 | { &vop_access_desc, kernfs_access }, /* access */ |
192 | { &vop_accessx_desc, genfs_accessx }, /* accessx */ | | 171 | { &vop_accessx_desc, genfs_accessx }, /* accessx */ |
193 | { &vop_getattr_desc, kernfs_getattr }, /* getattr */ | | 172 | { &vop_getattr_desc, kernfs_getattr }, /* getattr */ |
194 | { &vop_setattr_desc, kernfs_setattr }, /* setattr */ | | 173 | { &vop_setattr_desc, kernfs_setattr }, /* setattr */ |
195 | { &vop_read_desc, kernfs_read }, /* read */ | | 174 | { &vop_read_desc, kernfs_read }, /* read */ |
196 | { &vop_write_desc, kernfs_write }, /* write */ | | 175 | { &vop_write_desc, kernfs_write }, /* write */ |
197 | { &vop_fallocate_desc, genfs_eopnotsupp }, /* fallocate */ | | 176 | { &vop_fallocate_desc, genfs_eopnotsupp }, /* fallocate */ |
198 | { &vop_fdiscard_desc, genfs_eopnotsupp }, /* fdiscard */ | | 177 | { &vop_fdiscard_desc, genfs_eopnotsupp }, /* fdiscard */ |
199 | { &vop_fcntl_desc, kernfs_fcntl }, /* fcntl */ | | 178 | { &vop_fcntl_desc, genfs_fcntl }, /* fcntl */ |
200 | { &vop_ioctl_desc, kernfs_ioctl }, /* ioctl */ | | 179 | { &vop_ioctl_desc, kernfs_ioctl }, /* ioctl */ |
201 | { &vop_poll_desc, kernfs_poll }, /* poll */ | | 180 | { &vop_poll_desc, genfs_poll }, /* poll */ |
202 | { &vop_kqfilter_desc, genfs_kqfilter }, /* kqfilter */ | | 181 | { &vop_kqfilter_desc, genfs_kqfilter }, /* kqfilter */ |
203 | { &vop_revoke_desc, kernfs_revoke }, /* revoke */ | | 182 | { &vop_revoke_desc, genfs_revoke }, /* revoke */ |
204 | { &vop_fsync_desc, kernfs_fsync }, /* fsync */ | | 183 | { &vop_fsync_desc, genfs_nullop }, /* fsync */ |
205 | { &vop_seek_desc, kernfs_seek }, /* seek */ | | 184 | { &vop_seek_desc, genfs_nullop }, /* seek */ |
206 | { &vop_remove_desc, kernfs_remove }, /* remove */ | | 185 | { &vop_remove_desc, genfs_eopnotsupp }, /* remove */ |
207 | { &vop_link_desc, kernfs_link }, /* link */ | | 186 | { &vop_link_desc, kernfs_link }, /* link */ |
208 | { &vop_rename_desc, kernfs_rename }, /* rename */ | | 187 | { &vop_rename_desc, genfs_eopnotsupp }, /* rename */ |
209 | { &vop_mkdir_desc, kernfs_mkdir }, /* mkdir */ | | 188 | { &vop_mkdir_desc, genfs_eopnotsupp }, /* mkdir */ |
210 | { &vop_rmdir_desc, kernfs_rmdir }, /* rmdir */ | | 189 | { &vop_rmdir_desc, genfs_eopnotsupp }, /* rmdir */ |
211 | { &vop_symlink_desc, kernfs_symlink }, /* symlink */ | | 190 | { &vop_symlink_desc, kernfs_symlink }, /* symlink */ |
212 | { &vop_readdir_desc, kernfs_readdir }, /* readdir */ | | 191 | { &vop_readdir_desc, kernfs_readdir }, /* readdir */ |
213 | { &vop_readlink_desc, kernfs_readlink }, /* readlink */ | | 192 | { &vop_readlink_desc, genfs_eopnotsupp }, /* readlink */ |
214 | { &vop_abortop_desc, kernfs_abortop }, /* abortop */ | | 193 | { &vop_abortop_desc, genfs_abortop }, /* abortop */ |
215 | { &vop_inactive_desc, kernfs_inactive }, /* inactive */ | | 194 | { &vop_inactive_desc, kernfs_inactive }, /* inactive */ |
216 | { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */ | | 195 | { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */ |
217 | { &vop_lock_desc, kernfs_lock }, /* lock */ | | 196 | { &vop_lock_desc, genfs_lock }, /* lock */ |
218 | { &vop_unlock_desc, kernfs_unlock }, /* unlock */ | | 197 | { &vop_unlock_desc, genfs_unlock }, /* unlock */ |
219 | { &vop_bmap_desc, kernfs_bmap }, /* bmap */ | | 198 | { &vop_bmap_desc, genfs_badop }, /* bmap */ |
220 | { &vop_strategy_desc, kernfs_strategy }, /* strategy */ | | 199 | { &vop_strategy_desc, genfs_eopnotsupp }, /* strategy */ |
221 | { &vop_print_desc, kernfs_print }, /* print */ | | 200 | { &vop_print_desc, kernfs_print }, /* print */ |
222 | { &vop_islocked_desc, kernfs_islocked }, /* islocked */ | | 201 | { &vop_islocked_desc, genfs_islocked }, /* islocked */ |
223 | { &vop_pathconf_desc, kernfs_pathconf }, /* pathconf */ | | 202 | { &vop_pathconf_desc, kernfs_pathconf }, /* pathconf */ |
224 | { &vop_advlock_desc, kernfs_advlock }, /* advlock */ | | 203 | { &vop_advlock_desc, genfs_einval }, /* advlock */ |
225 | { &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */ | | 204 | { &vop_bwrite_desc, genfs_eopnotsupp }, /* bwrite */ |
226 | { &vop_getpages_desc, kernfs_getpages }, /* getpages */ | | 205 | { &vop_getpages_desc, kernfs_getpages }, /* getpages */ |
227 | { &vop_putpages_desc, kernfs_putpages }, /* putpages */ | | 206 | { &vop_putpages_desc, genfs_putpages }, /* putpages */ |
228 | { NULL, NULL } | | 207 | { NULL, NULL } |
229 | }; | | 208 | }; |
230 | const struct vnodeopv_desc kernfs_vnodeop_opv_desc = | | 209 | const struct vnodeopv_desc kernfs_vnodeop_opv_desc = |
231 | { &kernfs_vnodeop_p, kernfs_vnodeop_entries }; | | 210 | { &kernfs_vnodeop_p, kernfs_vnodeop_entries }; |
232 | | | 211 | |
233 | int (**kernfs_specop_p)(void *); | | 212 | int (**kernfs_specop_p)(void *); |
234 | const struct vnodeopv_entry_desc kernfs_specop_entries[] = { | | 213 | const struct vnodeopv_entry_desc kernfs_specop_entries[] = { |
235 | { &vop_default_desc, vn_default_error }, | | 214 | { &vop_default_desc, vn_default_error }, |
236 | GENFS_SPECOP_ENTRIES, | | 215 | GENFS_SPECOP_ENTRIES, |
237 | { &vop_close_desc, spec_close }, /* close */ | | 216 | { &vop_close_desc, spec_close }, /* close */ |
238 | { &vop_access_desc, kernfs_access }, /* access */ | | 217 | { &vop_access_desc, kernfs_access }, /* access */ |
239 | { &vop_accessx_desc, genfs_accessx }, /* accessx */ | | 218 | { &vop_accessx_desc, genfs_accessx }, /* accessx */ |
240 | { &vop_getattr_desc, kernfs_getattr }, /* getattr */ | | 219 | { &vop_getattr_desc, kernfs_getattr }, /* getattr */ |
241 | { &vop_setattr_desc, kernfs_setattr }, /* setattr */ | | 220 | { &vop_setattr_desc, kernfs_setattr }, /* setattr */ |
242 | { &vop_read_desc, spec_read }, /* read */ | | 221 | { &vop_read_desc, spec_read }, /* read */ |
243 | { &vop_write_desc, spec_write }, /* write */ | | 222 | { &vop_write_desc, spec_write }, /* write */ |
244 | { &vop_fcntl_desc, spec_fcntl }, /* fcntl */ | | 223 | { &vop_fcntl_desc, genfs_fcntl }, /* fcntl */ |
245 | { &vop_fsync_desc, spec_fsync }, /* fsync */ | | 224 | { &vop_fsync_desc, spec_fsync }, /* fsync */ |
246 | { &vop_inactive_desc, kernfs_inactive }, /* inactive */ | | 225 | { &vop_inactive_desc, kernfs_inactive }, /* inactive */ |
247 | { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */ | | 226 | { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */ |
248 | { &vop_lock_desc, kernfs_lock }, /* lock */ | | 227 | { &vop_lock_desc, genfs_lock }, /* lock */ |
249 | { &vop_unlock_desc, kernfs_unlock }, /* unlock */ | | 228 | { &vop_unlock_desc, genfs_unlock }, /* unlock */ |
250 | { &vop_print_desc, kernfs_print }, /* print */ | | 229 | { &vop_print_desc, kernfs_print }, /* print */ |
251 | { &vop_islocked_desc, kernfs_islocked }, /* islocked */ | | 230 | { &vop_islocked_desc, genfs_islocked }, /* islocked */ |
252 | { &vop_bwrite_desc, spec_bwrite }, /* bwrite */ | | 231 | { &vop_bwrite_desc, vn_bwrite }, /* bwrite */ |
253 | { NULL, NULL } | | 232 | { NULL, NULL } |
254 | }; | | 233 | }; |
255 | const struct vnodeopv_desc kernfs_specop_opv_desc = | | 234 | const struct vnodeopv_desc kernfs_specop_opv_desc = |
256 | { &kernfs_specop_p, kernfs_specop_entries }; | | 235 | { &kernfs_specop_p, kernfs_specop_entries }; |
257 | | | 236 | |
258 | static inline int | | 237 | static inline int |
259 | kernfs_fileop_compare(struct kernfs_fileop *a, struct kernfs_fileop *b) | | 238 | kernfs_fileop_compare(struct kernfs_fileop *a, struct kernfs_fileop *b) |
260 | { | | 239 | { |
261 | if (a->kf_type < b->kf_type) | | 240 | if (a->kf_type < b->kf_type) |
262 | return -1; | | 241 | return -1; |
263 | if (a->kf_type > b->kf_type) | | 242 | if (a->kf_type > b->kf_type) |
264 | return 1; | | 243 | return 1; |
265 | if (a->kf_fileop < b->kf_fileop) | | 244 | if (a->kf_fileop < b->kf_fileop) |