Mon Jul 19 01:33:53 2021 UTC ()
Abolish all the silly indirection macros for initializing vnode ops tables.

These are things of the form #define foofs_op genfs_op, or #define
foofs_op genfs_eopnotsupp, or similar. They serve no purpose besides
obfuscation, and have gotten cutpasted all over everywhere.

Part 3; cvs randomly didn't commit all the files the first time, still
hunting down the files it skipped.


(dholland)
diff -r1.171 -r1.172 src/sys/miscfs/kernfs/kernfs_vnops.c

cvs diff -r1.171 -r1.172 src/sys/miscfs/kernfs/kernfs_vnops.c (switch to unified diff)

--- src/sys/miscfs/kernfs/kernfs_vnops.c 2021/07/18 23:56:13 1.171
+++ src/sys/miscfs/kernfs/kernfs_vnops.c 2021/07/19 01:33:53 1.172
@@ -1,1215 +1,1194 @@ @@ -1,1215 +1,1194 @@
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.
15 * 2. Redistributions in binary form must reproduce the above copyright 15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the 16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution. 17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors 18 * 3. Neither the name of the University nor the names of its contributors
19 * may be used to endorse or promote products derived from this software 19 * may be used to endorse or promote products derived from this software
20 * without specific prior written permission. 20 * without specific prior written permission.
21 * 21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
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>
56#include <sys/buf.h> 56#include <sys/buf.h>
57#include <sys/dirent.h> 57#include <sys/dirent.h>
58#include <sys/msgbuf.h> 58#include <sys/msgbuf.h>
59 59
60#include <miscfs/genfs/genfs.h> 60#include <miscfs/genfs/genfs.h>
61#include <miscfs/kernfs/kernfs.h> 61#include <miscfs/kernfs/kernfs.h>
62#include <miscfs/specfs/specdev.h> 62#include <miscfs/specfs/specdev.h>
63 63
64#include <uvm/uvm_extern.h> 64#include <uvm/uvm_extern.h>
65 65
66#define KSTRING 256 /* Largest I/O available via this filesystem */ 66#define KSTRING 256 /* Largest I/O available via this filesystem */
67#define UIO_MX 32 67#define UIO_MX 32
68 68
69#define READ_MODE (S_IRUSR|S_IRGRP|S_IROTH) 69#define READ_MODE (S_IRUSR|S_IRGRP|S_IROTH)
70#define WRITE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH) 70#define WRITE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH)
71#define UREAD_MODE (S_IRUSR) 71#define UREAD_MODE (S_IRUSR)
72#define DIR_MODE (S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH) 72#define DIR_MODE (S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
73#define UDIR_MODE (S_IRUSR|S_IXUSR) 73#define UDIR_MODE (S_IRUSR|S_IXUSR)
74 74
75#define N(s) sizeof(s)-1, s 75#define N(s) sizeof(s)-1, s
76const struct kern_target kern_targets[] = { 76const struct kern_target kern_targets[] = {
77/* NOTE: The name must be less than UIO_MX-16 chars in length */ 77/* NOTE: The name must be less than UIO_MX-16 chars in length */
78 /* name data tag type ro/rw */ 78 /* name data tag type ro/rw */
79 { DT_DIR, N("."), 0, KFSkern, VDIR, DIR_MODE }, 79 { DT_DIR, N("."), 0, KFSkern, VDIR, DIR_MODE },
80 { DT_DIR, N(".."), 0, KFSroot, VDIR, DIR_MODE }, 80 { DT_DIR, N(".."), 0, KFSroot, VDIR, DIR_MODE },
81 { DT_REG, N("boottime"), 0, KFSboottime, VREG, READ_MODE }, 81 { DT_REG, N("boottime"), 0, KFSboottime, VREG, READ_MODE },
82 /* XXXUNCONST */ 82 /* XXXUNCONST */
83 { DT_REG, N("copyright"), __UNCONST(copyright), 83 { DT_REG, N("copyright"), __UNCONST(copyright),
84 KFSstring, VREG, READ_MODE }, 84 KFSstring, VREG, READ_MODE },
85 { DT_REG, N("hostname"), 0, KFShostname, VREG, WRITE_MODE }, 85 { DT_REG, N("hostname"), 0, KFShostname, VREG, WRITE_MODE },
86 { DT_REG, N("hz"), &hz, KFSint, VREG, READ_MODE }, 86 { DT_REG, N("hz"), &hz, KFSint, VREG, READ_MODE },
87 { DT_REG, N("loadavg"), 0, KFSavenrun, VREG, READ_MODE }, 87 { DT_REG, N("loadavg"), 0, KFSavenrun, VREG, READ_MODE },
88 { DT_REG, N("msgbuf"), 0, KFSmsgbuf, VREG, READ_MODE }, 88 { DT_REG, N("msgbuf"), 0, KFSmsgbuf, VREG, READ_MODE },
89 { DT_REG, N("pagesize"), &uvmexp.pagesize, KFSint, VREG, READ_MODE }, 89 { DT_REG, N("pagesize"), &uvmexp.pagesize, KFSint, VREG, READ_MODE },
90 { DT_REG, N("physmem"), &physmem, KFSint, VREG, READ_MODE }, 90 { DT_REG, N("physmem"), &physmem, KFSint, VREG, READ_MODE },
91#if 0 91#if 0
92 { DT_DIR, N("root"), 0, KFSnull, VDIR, DIR_MODE }, 92 { DT_DIR, N("root"), 0, KFSnull, VDIR, DIR_MODE },
93#endif 93#endif
94 { DT_BLK, N("rootdev"), &rootdev, KFSdevice, VBLK, UREAD_MODE }, 94 { DT_BLK, N("rootdev"), &rootdev, KFSdevice, VBLK, UREAD_MODE },
95 { DT_CHR, N("rrootdev"), &rrootdev, KFSdevice, VCHR, UREAD_MODE }, 95 { DT_CHR, N("rrootdev"), &rrootdev, KFSdevice, VCHR, UREAD_MODE },
96 { DT_REG, N("time"), 0, KFStime, VREG, READ_MODE }, 96 { DT_REG, N("time"), 0, KFStime, VREG, READ_MODE },
97 /* XXXUNCONST */ 97 /* XXXUNCONST */
98 { DT_REG, N("version"), __UNCONST(version), 98 { DT_REG, N("version"), __UNCONST(version),
99 KFSstring, VREG, READ_MODE }, 99 KFSstring, VREG, READ_MODE },
100}; 100};
101const struct kern_target subdir_targets[] = { 101const struct kern_target subdir_targets[] = {
102/* NOTE: The name must be less than UIO_MX-16 chars in length */ 102/* NOTE: The name must be less than UIO_MX-16 chars in length */
103 /* name data tag type ro/rw */ 103 /* name data tag type ro/rw */
104 { DT_DIR, N("."), 0, KFSsubdir, VDIR, DIR_MODE }, 104 { DT_DIR, N("."), 0, KFSsubdir, VDIR, DIR_MODE },
105 { DT_DIR, N(".."), 0, KFSkern, VDIR, DIR_MODE }, 105 { DT_DIR, N(".."), 0, KFSkern, VDIR, DIR_MODE },
106}; 106};
107#undef N 107#undef N
108SIMPLEQ_HEAD(,dyn_kern_target) dyn_kern_targets = 108SIMPLEQ_HEAD(,dyn_kern_target) dyn_kern_targets =
109 SIMPLEQ_HEAD_INITIALIZER(dyn_kern_targets); 109 SIMPLEQ_HEAD_INITIALIZER(dyn_kern_targets);
110int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]); 110int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]);
111const int static_nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]); 111const int static_nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]);
112int nkern_dirs = 2; 112int nkern_dirs = 2;
113 113
114int kernfs_try_fileop(kfstype, kfsfileop, void *, int); 114int kernfs_try_fileop(kfstype, kfsfileop, void *, int);
115int kernfs_try_xread(kfstype, const struct kernfs_node *, char **, 115int kernfs_try_xread(kfstype, const struct kernfs_node *, char **,
116 size_t, int); 116 size_t, int);
117int kernfs_try_xwrite(kfstype, const struct kernfs_node *, char *, 117int kernfs_try_xwrite(kfstype, const struct kernfs_node *, char *,
118 size_t, int); 118 size_t, int);
119 119
120static int kernfs_default_xread(void *v); 120static int kernfs_default_xread(void *v);
121static int kernfs_default_xwrite(void *v); 121static int kernfs_default_xwrite(void *v);
122static int kernfs_default_fileop_getattr(void *); 122static int kernfs_default_fileop_getattr(void *);
123 123
124/* must include all fileop's */ 124/* must include all fileop's */
125const struct kernfs_fileop kernfs_default_fileops[] = { 125const struct kernfs_fileop kernfs_default_fileops[] = {
126 { .kf_fileop = KERNFS_XREAD }, 126 { .kf_fileop = KERNFS_XREAD },
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
139int kernfs_lookup(void *); 139int kernfs_lookup(void *);
140#define kernfs_create genfs_eopnotsupp 
141#define kernfs_mknod genfs_eopnotsupp 
142int kernfs_open(void *); 140int kernfs_open(void *);
143int kernfs_close(void *); 141int kernfs_close(void *);
144int kernfs_access(void *); 142int kernfs_access(void *);
145int kernfs_getattr(void *); 143int kernfs_getattr(void *);
146int kernfs_setattr(void *); 144int kernfs_setattr(void *);
147int kernfs_read(void *); 145int kernfs_read(void *);
148int kernfs_write(void *); 146int kernfs_write(void *);
149#define kernfs_fcntl genfs_fcntl 
150int kernfs_ioctl(void *); 147int 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 
156int kernfs_link(void *); 148int kernfs_link(void *);
157#define kernfs_rename genfs_eopnotsupp 
158#define kernfs_mkdir genfs_eopnotsupp 
159#define kernfs_rmdir genfs_eopnotsupp 
160int kernfs_symlink(void *); 149int kernfs_symlink(void *);
161int kernfs_readdir(void *); 150int kernfs_readdir(void *);
162#define kernfs_readlink genfs_eopnotsupp 
163#define kernfs_abortop genfs_abortop 
164int kernfs_inactive(void *); 151int kernfs_inactive(void *);
165int kernfs_reclaim(void *); 152int 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 
170int kernfs_print(void *); 153int kernfs_print(void *);
171#define kernfs_islocked genfs_islocked 
172int kernfs_pathconf(void *); 154int kernfs_pathconf(void *);
173#define kernfs_advlock genfs_einval 
174#define kernfs_bwrite genfs_eopnotsupp 
175int kernfs_getpages(void *); 155int kernfs_getpages(void *);
176#define kernfs_putpages genfs_putpages 
177 156
178static int kernfs_xread(struct kernfs_node *, int, char **, 157static int kernfs_xread(struct kernfs_node *, int, char **,
179 size_t, size_t *); 158 size_t, size_t *);
180static int kernfs_xwrite(const struct kernfs_node *, char *, size_t); 159static int kernfs_xwrite(const struct kernfs_node *, char *, size_t);
181 160
182int (**kernfs_vnodeop_p)(void *); 161int (**kernfs_vnodeop_p)(void *);
183const struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = { 162const 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};
230const struct vnodeopv_desc kernfs_vnodeop_opv_desc = 209const struct vnodeopv_desc kernfs_vnodeop_opv_desc =
231 { &kernfs_vnodeop_p, kernfs_vnodeop_entries }; 210 { &kernfs_vnodeop_p, kernfs_vnodeop_entries };
232 211
233int (**kernfs_specop_p)(void *); 212int (**kernfs_specop_p)(void *);
234const struct vnodeopv_entry_desc kernfs_specop_entries[] = { 213const 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};
255const struct vnodeopv_desc kernfs_specop_opv_desc = 234const struct vnodeopv_desc kernfs_specop_opv_desc =
256 { &kernfs_specop_p, kernfs_specop_entries }; 235 { &kernfs_specop_p, kernfs_specop_entries };
257 236
258static inline int 237static inline int
259kernfs_fileop_compare(struct kernfs_fileop *a, struct kernfs_fileop *b) 238kernfs_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)
266 return -1; 245 return -1;
267 if (a->kf_fileop > b->kf_fileop) 246 if (a->kf_fileop > b->kf_fileop)
268 return 1; 247 return 1;
269 return (0); 248 return (0);
270} 249}
271 250
272SPLAY_HEAD(kfsfileoptree, kernfs_fileop) kfsfileoptree = 251SPLAY_HEAD(kfsfileoptree, kernfs_fileop) kfsfileoptree =
273 SPLAY_INITIALIZER(kfsfileoptree); 252 SPLAY_INITIALIZER(kfsfileoptree);
274SPLAY_PROTOTYPE(kfsfileoptree, kernfs_fileop, kf_node, kernfs_fileop_compare); 253SPLAY_PROTOTYPE(kfsfileoptree, kernfs_fileop, kf_node, kernfs_fileop_compare);
275SPLAY_GENERATE(kfsfileoptree, kernfs_fileop, kf_node, kernfs_fileop_compare); 254SPLAY_GENERATE(kfsfileoptree, kernfs_fileop, kf_node, kernfs_fileop_compare);
276 255
277kfstype 256kfstype
278kernfs_alloctype(int nkf, const struct kernfs_fileop *kf) 257kernfs_alloctype(int nkf, const struct kernfs_fileop *kf)
279{ 258{
280 static u_char nextfreetype = KFSlasttype; 259 static u_char nextfreetype = KFSlasttype;
281 struct kernfs_fileop *dkf, *fkf, skf; 260 struct kernfs_fileop *dkf, *fkf, skf;
282 int i; 261 int i;
283 262
284 /* XXX need to keep track of dkf's memory if we support 263 /* XXX need to keep track of dkf's memory if we support
285 deallocating types */ 264 deallocating types */
286 dkf = malloc(sizeof(kernfs_default_fileops), M_TEMP, M_WAITOK); 265 dkf = malloc(sizeof(kernfs_default_fileops), M_TEMP, M_WAITOK);
287 memcpy(dkf, kernfs_default_fileops, sizeof(kernfs_default_fileops)); 266 memcpy(dkf, kernfs_default_fileops, sizeof(kernfs_default_fileops));
288 267
289 for (i = 0; i < sizeof(kernfs_default_fileops) / 268 for (i = 0; i < sizeof(kernfs_default_fileops) /
290 sizeof(kernfs_default_fileops[0]); i++) { 269 sizeof(kernfs_default_fileops[0]); i++) {
291 dkf[i].kf_type = nextfreetype; 270 dkf[i].kf_type = nextfreetype;
292 SPLAY_INSERT(kfsfileoptree, &kfsfileoptree, &dkf[i]); 271 SPLAY_INSERT(kfsfileoptree, &kfsfileoptree, &dkf[i]);
293 } 272 }
294 273
295 for (i = 0; i < nkf; i++) { 274 for (i = 0; i < nkf; i++) {
296 skf.kf_type = nextfreetype; 275 skf.kf_type = nextfreetype;
297 skf.kf_fileop = kf[i].kf_fileop; 276 skf.kf_fileop = kf[i].kf_fileop;
298 if ((fkf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf))) 277 if ((fkf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf)))
299 fkf->kf_vop = kf[i].kf_vop; 278 fkf->kf_vop = kf[i].kf_vop;
300 } 279 }
301 280
302 return nextfreetype++; 281 return nextfreetype++;
303} 282}
304 283
305int 284int
306kernfs_try_fileop(kfstype type, kfsfileop fileop, void *v, int error) 285kernfs_try_fileop(kfstype type, kfsfileop fileop, void *v, int error)
307{ 286{
308 struct kernfs_fileop *kf, skf; 287 struct kernfs_fileop *kf, skf;
309 288
310 skf.kf_type = type; 289 skf.kf_type = type;
311 skf.kf_fileop = fileop; 290 skf.kf_fileop = fileop;
312 if ((kf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf))) 291 if ((kf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf)))
313 if (kf->kf_vop) 292 if (kf->kf_vop)
314 return kf->kf_vop(v); 293 return kf->kf_vop(v);
315 return error; 294 return error;
316} 295}
317 296
318int 297int
319kernfs_try_xread(kfstype type, const struct kernfs_node *kfs, char **bfp, 298kernfs_try_xread(kfstype type, const struct kernfs_node *kfs, char **bfp,
320 size_t len, int error) 299 size_t len, int error)
321{ 300{
322 struct kernfs_fileop *kf, skf; 301 struct kernfs_fileop *kf, skf;
323 302
324 skf.kf_type = type; 303 skf.kf_type = type;
325 skf.kf_fileop = KERNFS_XREAD; 304 skf.kf_fileop = KERNFS_XREAD;
326 if ((kf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf))) 305 if ((kf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf)))
327 if (kf->kf_xread) 306 if (kf->kf_xread)
328 return kf->kf_xread(kfs, bfp, len); 307 return kf->kf_xread(kfs, bfp, len);
329 return error; 308 return error;
330} 309}
331 310
332int 311int
333kernfs_try_xwrite(kfstype type, const struct kernfs_node *kfs, char *bf, 312kernfs_try_xwrite(kfstype type, const struct kernfs_node *kfs, char *bf,
334 size_t len, int error) 313 size_t len, int error)
335{ 314{
336 struct kernfs_fileop *kf, skf; 315 struct kernfs_fileop *kf, skf;
337 316
338 skf.kf_type = type; 317 skf.kf_type = type;
339 skf.kf_fileop = KERNFS_XWRITE; 318 skf.kf_fileop = KERNFS_XWRITE;
340 if ((kf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf))) 319 if ((kf = SPLAY_FIND(kfsfileoptree, &kfsfileoptree, &skf)))
341 if (kf->kf_xwrite) 320 if (kf->kf_xwrite)
342 return kf->kf_xwrite(kfs, bf, len); 321 return kf->kf_xwrite(kfs, bf, len);
343 return error; 322 return error;
344} 323}
345 324
346int 325int
347kernfs_addentry(kernfs_parentdir_t *pkt, kernfs_entry_t *dkt) 326kernfs_addentry(kernfs_parentdir_t *pkt, kernfs_entry_t *dkt)
348{ 327{
349 struct kernfs_subdir *ks, *parent; 328 struct kernfs_subdir *ks, *parent;
350 329
351 if (pkt == NULL) { 330 if (pkt == NULL) {
352 SIMPLEQ_INSERT_TAIL(&dyn_kern_targets, dkt, dkt_queue); 331 SIMPLEQ_INSERT_TAIL(&dyn_kern_targets, dkt, dkt_queue);
353 nkern_targets++; 332 nkern_targets++;
354 if (dkt->dkt_kt.kt_vtype == VDIR) 333 if (dkt->dkt_kt.kt_vtype == VDIR)
355 nkern_dirs++; 334 nkern_dirs++;
356 } else { 335 } else {
357 parent = (struct kernfs_subdir *)pkt->kt_data; 336 parent = (struct kernfs_subdir *)pkt->kt_data;
358 SIMPLEQ_INSERT_TAIL(&parent->ks_entries, dkt, dkt_queue); 337 SIMPLEQ_INSERT_TAIL(&parent->ks_entries, dkt, dkt_queue);
359 parent->ks_nentries++; 338 parent->ks_nentries++;
360 if (dkt->dkt_kt.kt_vtype == VDIR) 339 if (dkt->dkt_kt.kt_vtype == VDIR)
361 parent->ks_dirs++; 340 parent->ks_dirs++;
362 } 341 }
363 if (dkt->dkt_kt.kt_vtype == VDIR && dkt->dkt_kt.kt_data == NULL) { 342 if (dkt->dkt_kt.kt_vtype == VDIR && dkt->dkt_kt.kt_data == NULL) {
364 ks = malloc(sizeof(struct kernfs_subdir), 343 ks = malloc(sizeof(struct kernfs_subdir),
365 M_TEMP, M_WAITOK); 344 M_TEMP, M_WAITOK);
366 SIMPLEQ_INIT(&ks->ks_entries); 345 SIMPLEQ_INIT(&ks->ks_entries);
367 ks->ks_nentries = 2; /* . and .. */ 346 ks->ks_nentries = 2; /* . and .. */
368 ks->ks_dirs = 2; 347 ks->ks_dirs = 2;
369 ks->ks_parent = pkt ? pkt : &kern_targets[0]; 348 ks->ks_parent = pkt ? pkt : &kern_targets[0];
370 dkt->dkt_kt.kt_data = ks; 349 dkt->dkt_kt.kt_data = ks;
371 } 350 }
372 return 0; 351 return 0;
373} 352}
374 353
375static int 354static int
376kernfs_xread(struct kernfs_node *kfs, int off, char **bufp, size_t len, size_t *wrlen) 355kernfs_xread(struct kernfs_node *kfs, int off, char **bufp, size_t len, size_t *wrlen)
377{ 356{
378 const struct kern_target *kt; 357 const struct kern_target *kt;
379 int err; 358 int err;
380 359
381 kt = kfs->kfs_kt; 360 kt = kfs->kfs_kt;
382 361
383 switch (kfs->kfs_type) { 362 switch (kfs->kfs_type) {
384 case KFStime: { 363 case KFStime: {
385 struct timeval tv; 364 struct timeval tv;
386 365
387 microtime(&tv); 366 microtime(&tv);
388 snprintf(*bufp, len, "%lld %ld\n", (long long)tv.tv_sec, 367 snprintf(*bufp, len, "%lld %ld\n", (long long)tv.tv_sec,
389 (long)tv.tv_usec); 368 (long)tv.tv_usec);
390 break; 369 break;
391 } 370 }
392 371
393 case KFSboottime: { 372 case KFSboottime: {
394 struct timeval tv; 373 struct timeval tv;
395 374
396 /* 375 /*
397 * Historically, /kern/boottime only contained seconds. 376 * Historically, /kern/boottime only contained seconds.
398 */ 377 */
399 getmicroboottime(&tv); 378 getmicroboottime(&tv);
400 snprintf(*bufp, len, "%lld\n", (long long)tv.tv_sec); 379 snprintf(*bufp, len, "%lld\n", (long long)tv.tv_sec);
401 break; 380 break;
402 } 381 }
403 382
404 case KFSint: { 383 case KFSint: {
405 int *ip = kt->kt_data; 384 int *ip = kt->kt_data;
406 385
407 snprintf(*bufp, len, "%d\n", *ip); 386 snprintf(*bufp, len, "%d\n", *ip);
408 break; 387 break;
409 } 388 }
410 389
411 case KFSstring: { 390 case KFSstring: {
412 char *cp = kt->kt_data; 391 char *cp = kt->kt_data;
413 392
414 *bufp = cp; 393 *bufp = cp;
415 break; 394 break;
416 } 395 }
417 396
418 case KFSmsgbuf: { 397 case KFSmsgbuf: {
419 long n; 398 long n;
420 399
421 /* 400 /*
422 * deal with cases where the message buffer has 401 * deal with cases where the message buffer has
423 * become corrupted. 402 * become corrupted.
424 */ 403 */
425 if (!logenabled(msgbufp)) { 404 if (!logenabled(msgbufp)) {
426 msgbufenabled = 0; 405 msgbufenabled = 0;
427 return (ENXIO); 406 return (ENXIO);
428 } 407 }
429 408
430 /* 409 /*
431 * Note that reads of /kern/msgbuf won't necessarily yield 410 * Note that reads of /kern/msgbuf won't necessarily yield
432 * consistent results, if the message buffer is modified 411 * consistent results, if the message buffer is modified
433 * while the read is in progress. The worst that can happen 412 * while the read is in progress. The worst that can happen
434 * is that incorrect data will be read. There's no way 413 * is that incorrect data will be read. There's no way
435 * that this can crash the system unless the values in the 414 * that this can crash the system unless the values in the
436 * message buffer header are corrupted, but that'll cause 415 * message buffer header are corrupted, but that'll cause
437 * the system to die anyway. 416 * the system to die anyway.
438 */ 417 */
439 if (off >= msgbufp->msg_bufs) { 418 if (off >= msgbufp->msg_bufs) {
440 *wrlen = 0; 419 *wrlen = 0;
441 return (0); 420 return (0);
442 } 421 }
443 n = msgbufp->msg_bufx + off; 422 n = msgbufp->msg_bufx + off;
444 if (n >= msgbufp->msg_bufs) 423 if (n >= msgbufp->msg_bufs)
445 n -= msgbufp->msg_bufs; 424 n -= msgbufp->msg_bufs;
446 len = uimin(msgbufp->msg_bufs - n, msgbufp->msg_bufs - off); 425 len = uimin(msgbufp->msg_bufs - n, msgbufp->msg_bufs - off);
447 *bufp = msgbufp->msg_bufc + n; 426 *bufp = msgbufp->msg_bufc + n;
448 *wrlen = len; 427 *wrlen = len;
449 return (0); 428 return (0);
450 } 429 }
451 430
452 case KFShostname: { 431 case KFShostname: {
453 char *cp = hostname; 432 char *cp = hostname;
454 size_t xlen = hostnamelen; 433 size_t xlen = hostnamelen;
455 434
456 if (xlen >= (len - 2)) 435 if (xlen >= (len - 2))
457 return (EINVAL); 436 return (EINVAL);
458 437
459 memcpy(*bufp, cp, xlen); 438 memcpy(*bufp, cp, xlen);
460 (*bufp)[xlen] = '\n'; 439 (*bufp)[xlen] = '\n';
461 (*bufp)[xlen+1] = '\0'; 440 (*bufp)[xlen+1] = '\0';
462 break; 441 break;
463 } 442 }
464 443
465 case KFSavenrun: 444 case KFSavenrun:
466 averunnable.fscale = FSCALE; 445 averunnable.fscale = FSCALE;
467 snprintf(*bufp, len, "%d %d %d %ld\n", 446 snprintf(*bufp, len, "%d %d %d %ld\n",
468 averunnable.ldavg[0], averunnable.ldavg[1], 447 averunnable.ldavg[0], averunnable.ldavg[1],
469 averunnable.ldavg[2], averunnable.fscale); 448 averunnable.ldavg[2], averunnable.fscale);
470 break; 449 break;
471 450
472 default: 451 default:
473 err = kernfs_try_xread(kfs->kfs_type, kfs, bufp, len, 452 err = kernfs_try_xread(kfs->kfs_type, kfs, bufp, len,
474 EOPNOTSUPP); 453 EOPNOTSUPP);
475 if (err) 454 if (err)
476 return err; 455 return err;
477 } 456 }
478 457
479 len = strlen(*bufp); 458 len = strlen(*bufp);
480 if (len <= off) 459 if (len <= off)
481 *wrlen = 0; 460 *wrlen = 0;
482 else { 461 else {
483 *bufp += off; 462 *bufp += off;
484 *wrlen = len - off; 463 *wrlen = len - off;
485 } 464 }
486 return (0); 465 return (0);
487} 466}
488 467
489static int 468static int
490kernfs_xwrite(const struct kernfs_node *kfs, char *bf, size_t len) 469kernfs_xwrite(const struct kernfs_node *kfs, char *bf, size_t len)
491{ 470{
492 471
493 switch (kfs->kfs_type) { 472 switch (kfs->kfs_type) {
494 case KFShostname: 473 case KFShostname:
495 if (bf[len-1] == '\n') 474 if (bf[len-1] == '\n')
496 --len; 475 --len;
497 memcpy(hostname, bf, len); 476 memcpy(hostname, bf, len);
498 hostname[len] = '\0'; 477 hostname[len] = '\0';
499 hostnamelen = (size_t) len; 478 hostnamelen = (size_t) len;
500 return (0); 479 return (0);
501 480
502 default: 481 default:
503 return kernfs_try_xwrite(kfs->kfs_type, kfs, bf, len, EIO); 482 return kernfs_try_xwrite(kfs->kfs_type, kfs, bf, len, EIO);
504 } 483 }
505} 484}
506 485
507 486
508/* 487/*
509 * vp is the current namei directory 488 * vp is the current namei directory
510 * ndp is the name to locate in that directory... 489 * ndp is the name to locate in that directory...
511 */ 490 */
512int 491int
513kernfs_lookup(void *v) 492kernfs_lookup(void *v)
514{ 493{
515 struct vop_lookup_v2_args /* { 494 struct vop_lookup_v2_args /* {
516 struct vnode * a_dvp; 495 struct vnode * a_dvp;
517 struct vnode ** a_vpp; 496 struct vnode ** a_vpp;
518 struct componentname * a_cnp; 497 struct componentname * a_cnp;
519 } */ *ap = v; 498 } */ *ap = v;
520 struct componentname *cnp = ap->a_cnp; 499 struct componentname *cnp = ap->a_cnp;
521 struct vnode **vpp = ap->a_vpp; 500 struct vnode **vpp = ap->a_vpp;
522 struct vnode *dvp = ap->a_dvp; 501 struct vnode *dvp = ap->a_dvp;
523 const char *pname = cnp->cn_nameptr; 502 const char *pname = cnp->cn_nameptr;
524 const struct kernfs_node *kfs; 503 const struct kernfs_node *kfs;
525 const struct kern_target *kt; 504 const struct kern_target *kt;
526 const struct dyn_kern_target *dkt; 505 const struct dyn_kern_target *dkt;
527 const struct kernfs_subdir *ks; 506 const struct kernfs_subdir *ks;
528 int error, i; 507 int error, i;
529 508
530 *vpp = NULLVP; 509 *vpp = NULLVP;
531 510
532 if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME) 511 if (cnp->cn_nameiop == DELETE || cnp->cn_nameiop == RENAME)
533 return (EROFS); 512 return (EROFS);
534 513
535 if (cnp->cn_namelen == 1 && *pname == '.') { 514 if (cnp->cn_namelen == 1 && *pname == '.') {
536 *vpp = dvp; 515 *vpp = dvp;
537 vref(dvp); 516 vref(dvp);
538 return (0); 517 return (0);
539 } 518 }
540 519
541 kfs = VTOKERN(dvp); 520 kfs = VTOKERN(dvp);
542 switch (kfs->kfs_type) { 521 switch (kfs->kfs_type) {
543 case KFSkern: 522 case KFSkern:
544 /* 523 /*
545 * Shouldn't get here with .. in the root node. 524 * Shouldn't get here with .. in the root node.
546 */ 525 */
547 if (cnp->cn_flags & ISDOTDOT) 526 if (cnp->cn_flags & ISDOTDOT)
548 return (EIO); 527 return (EIO);
549 528
550 for (i = 0; i < static_nkern_targets; i++) { 529 for (i = 0; i < static_nkern_targets; i++) {
551 kt = &kern_targets[i]; 530 kt = &kern_targets[i];
552 if (cnp->cn_namelen == kt->kt_namlen && 531 if (cnp->cn_namelen == kt->kt_namlen &&
553 memcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) 532 memcmp(kt->kt_name, pname, cnp->cn_namelen) == 0)
554 goto found; 533 goto found;
555 } 534 }
556 SIMPLEQ_FOREACH(dkt, &dyn_kern_targets, dkt_queue) { 535 SIMPLEQ_FOREACH(dkt, &dyn_kern_targets, dkt_queue) {
557 if (cnp->cn_namelen == dkt->dkt_kt.kt_namlen && 536 if (cnp->cn_namelen == dkt->dkt_kt.kt_namlen &&
558 memcmp(dkt->dkt_kt.kt_name, pname, cnp->cn_namelen) == 0) { 537 memcmp(dkt->dkt_kt.kt_name, pname, cnp->cn_namelen) == 0) {
559 kt = &dkt->dkt_kt; 538 kt = &dkt->dkt_kt;
560 goto found; 539 goto found;
561 } 540 }
562 } 541 }
563 break; 542 break;
564 543
565 found: 544 found:
566 error = vcache_get(dvp->v_mount, &kt, sizeof(kt), vpp); 545 error = vcache_get(dvp->v_mount, &kt, sizeof(kt), vpp);
567 return error; 546 return error;
568 547
569 case KFSsubdir: 548 case KFSsubdir:
570 ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data; 549 ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data;
571 if (cnp->cn_flags & ISDOTDOT) { 550 if (cnp->cn_flags & ISDOTDOT) {
572 kt = ks->ks_parent; 551 kt = ks->ks_parent;
573 goto found; 552 goto found;
574 } 553 }
575 554
576 SIMPLEQ_FOREACH(dkt, &ks->ks_entries, dkt_queue) { 555 SIMPLEQ_FOREACH(dkt, &ks->ks_entries, dkt_queue) {
577 if (cnp->cn_namelen == dkt->dkt_kt.kt_namlen && 556 if (cnp->cn_namelen == dkt->dkt_kt.kt_namlen &&
578 memcmp(dkt->dkt_kt.kt_name, pname, cnp->cn_namelen) == 0) { 557 memcmp(dkt->dkt_kt.kt_name, pname, cnp->cn_namelen) == 0) {
579 kt = &dkt->dkt_kt; 558 kt = &dkt->dkt_kt;
580 goto found; 559 goto found;
581 } 560 }
582 } 561 }
583 break; 562 break;
584 563
585 default: 564 default:
586 return (ENOTDIR); 565 return (ENOTDIR);
587 } 566 }
588 567
589 return (cnp->cn_nameiop == LOOKUP ? ENOENT : EROFS); 568 return (cnp->cn_nameiop == LOOKUP ? ENOENT : EROFS);
590} 569}
591 570
592int 571int
593kernfs_open(void *v) 572kernfs_open(void *v)
594{ 573{
595 struct vop_open_args /* { 574 struct vop_open_args /* {
596 struct vnode *a_vp; 575 struct vnode *a_vp;
597 int a_mode; 576 int a_mode;
598 kauth_cred_t a_cred; 577 kauth_cred_t a_cred;
599 } */ *ap = v; 578 } */ *ap = v;
600 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 579 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
601 580
602 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_OPEN, v, 0); 581 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_OPEN, v, 0);
603} 582}
604 583
605int 584int
606kernfs_close(void *v) 585kernfs_close(void *v)
607{ 586{
608 struct vop_close_args /* { 587 struct vop_close_args /* {
609 struct vnode *a_vp; 588 struct vnode *a_vp;
610 int a_fflag; 589 int a_fflag;
611 kauth_cred_t a_cred; 590 kauth_cred_t a_cred;
612 } */ *ap = v; 591 } */ *ap = v;
613 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 592 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
614 593
615 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_CLOSE, v, 0); 594 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_CLOSE, v, 0);
616} 595}
617 596
618int 597int
619kernfs_access(void *v) 598kernfs_access(void *v)
620{ 599{
621 struct vop_access_args /* { 600 struct vop_access_args /* {
622 struct vnode *a_vp; 601 struct vnode *a_vp;
623 accmode_t a_accmode; 602 accmode_t a_accmode;
624 kauth_cred_t a_cred; 603 kauth_cred_t a_cred;
625 } */ *ap = v; 604 } */ *ap = v;
626 struct vattr va; 605 struct vattr va;
627 int error; 606 int error;
628 607
629 if ((error = VOP_GETATTR(ap->a_vp, &va, ap->a_cred)) != 0) 608 if ((error = VOP_GETATTR(ap->a_vp, &va, ap->a_cred)) != 0)
630 return (error); 609 return (error);
631 610
632 return kauth_authorize_vnode(ap->a_cred, 611 return kauth_authorize_vnode(ap->a_cred,
633 KAUTH_ACCESS_ACTION(ap->a_accmode, ap->a_vp->v_type, va.va_mode), 612 KAUTH_ACCESS_ACTION(ap->a_accmode, ap->a_vp->v_type, va.va_mode),
634 ap->a_vp, NULL, genfs_can_access(ap->a_vp, ap->a_cred, 613 ap->a_vp, NULL, genfs_can_access(ap->a_vp, ap->a_cred,
635 va.va_uid, va.va_gid, va.va_mode, NULL, ap->a_accmode)); 614 va.va_uid, va.va_gid, va.va_mode, NULL, ap->a_accmode));
636} 615}
637 616
638static int 617static int
639kernfs_default_fileop_getattr(void *v) 618kernfs_default_fileop_getattr(void *v)
640{ 619{
641 struct vop_getattr_args /* { 620 struct vop_getattr_args /* {
642 struct vnode *a_vp; 621 struct vnode *a_vp;
643 struct vattr *a_vap; 622 struct vattr *a_vap;
644 kauth_cred_t a_cred; 623 kauth_cred_t a_cred;
645 } */ *ap = v; 624 } */ *ap = v;
646 struct vattr *vap = ap->a_vap; 625 struct vattr *vap = ap->a_vap;
647 626
648 vap->va_nlink = 1; 627 vap->va_nlink = 1;
649 vap->va_bytes = vap->va_size = 0; 628 vap->va_bytes = vap->va_size = 0;
650 629
651 return 0; 630 return 0;
652} 631}
653 632
654int 633int
655kernfs_getattr(void *v) 634kernfs_getattr(void *v)
656{ 635{
657 struct vop_getattr_args /* { 636 struct vop_getattr_args /* {
658 struct vnode *a_vp; 637 struct vnode *a_vp;
659 struct vattr *a_vap; 638 struct vattr *a_vap;
660 kauth_cred_t a_cred; 639 kauth_cred_t a_cred;
661 } */ *ap = v; 640 } */ *ap = v;
662 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 641 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
663 struct kernfs_subdir *ks; 642 struct kernfs_subdir *ks;
664 struct vattr *vap = ap->a_vap; 643 struct vattr *vap = ap->a_vap;
665 int error = 0; 644 int error = 0;
666 char strbuf[KSTRING], *bf; 645 char strbuf[KSTRING], *bf;
667 size_t nread, total; 646 size_t nread, total;
668 647
669 vattr_null(vap); 648 vattr_null(vap);
670 vap->va_type = ap->a_vp->v_type; 649 vap->va_type = ap->a_vp->v_type;
671 vap->va_uid = 0; 650 vap->va_uid = 0;
672 vap->va_gid = 0; 651 vap->va_gid = 0;
673 vap->va_mode = kfs->kfs_mode; 652 vap->va_mode = kfs->kfs_mode;
674 vap->va_fileid = kfs->kfs_fileno; 653 vap->va_fileid = kfs->kfs_fileno;
675 vap->va_flags = 0; 654 vap->va_flags = 0;
676 vap->va_size = 0; 655 vap->va_size = 0;
677 vap->va_blocksize = DEV_BSIZE; 656 vap->va_blocksize = DEV_BSIZE;
678 /* Make all times be current TOD, except for the "boottime" node. */ 657 /* Make all times be current TOD, except for the "boottime" node. */
679 if (kfs->kfs_kt->kt_namlen == 8 && 658 if (kfs->kfs_kt->kt_namlen == 8 &&
680 !memcmp(kfs->kfs_kt->kt_name, "boottime", 8)) { 659 !memcmp(kfs->kfs_kt->kt_name, "boottime", 8)) {
681 getnanoboottime(&vap->va_ctime); 660 getnanoboottime(&vap->va_ctime);
682 } else { 661 } else {
683 getnanotime(&vap->va_ctime); 662 getnanotime(&vap->va_ctime);
684 } 663 }
685 vap->va_atime = vap->va_mtime = vap->va_ctime; 664 vap->va_atime = vap->va_mtime = vap->va_ctime;
686 vap->va_gen = 0; 665 vap->va_gen = 0;
687 vap->va_flags = 0; 666 vap->va_flags = 0;
688 vap->va_rdev = 0; 667 vap->va_rdev = 0;
689 vap->va_bytes = 0; 668 vap->va_bytes = 0;
690 669
691 switch (kfs->kfs_type) { 670 switch (kfs->kfs_type) {
692 case KFSkern: 671 case KFSkern:
693 vap->va_nlink = nkern_dirs; 672 vap->va_nlink = nkern_dirs;
694 vap->va_bytes = vap->va_size = DEV_BSIZE; 673 vap->va_bytes = vap->va_size = DEV_BSIZE;
695 break; 674 break;
696 675
697 case KFSdevice: 676 case KFSdevice:
698 vap->va_nlink = 1; 677 vap->va_nlink = 1;
699 vap->va_rdev = ap->a_vp->v_rdev; 678 vap->va_rdev = ap->a_vp->v_rdev;
700 break; 679 break;
701 680
702 case KFSroot: 681 case KFSroot:
703 vap->va_nlink = 1; 682 vap->va_nlink = 1;
704 vap->va_bytes = vap->va_size = DEV_BSIZE; 683 vap->va_bytes = vap->va_size = DEV_BSIZE;
705 break; 684 break;
706 685
707 case KFSsubdir: 686 case KFSsubdir:
708 ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data; 687 ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data;
709 vap->va_nlink = ks->ks_dirs; 688 vap->va_nlink = ks->ks_dirs;
710 vap->va_bytes = vap->va_size = DEV_BSIZE; 689 vap->va_bytes = vap->va_size = DEV_BSIZE;
711 break; 690 break;
712 691
713 case KFSnull: 692 case KFSnull:
714 case KFStime: 693 case KFStime:
715 case KFSboottime: 694 case KFSboottime:
716 case KFSint: 695 case KFSint:
717 case KFSstring: 696 case KFSstring:
718 case KFShostname: 697 case KFShostname:
719 case KFSavenrun: 698 case KFSavenrun:
720 case KFSmsgbuf: 699 case KFSmsgbuf:
721 vap->va_nlink = 1; 700 vap->va_nlink = 1;
722 total = 0; 701 total = 0;
723 do { 702 do {
724 bf = strbuf; 703 bf = strbuf;
725 error = kernfs_xread(kfs, total, &bf, 704 error = kernfs_xread(kfs, total, &bf,
726 sizeof(strbuf), &nread); 705 sizeof(strbuf), &nread);
727 total += nread; 706 total += nread;
728 } while (error == 0 && nread != 0); 707 } while (error == 0 && nread != 0);
729 vap->va_bytes = vap->va_size = total; 708 vap->va_bytes = vap->va_size = total;
730 break; 709 break;
731 710
732 default: 711 default:
733 error = kernfs_try_fileop(kfs->kfs_type, 712 error = kernfs_try_fileop(kfs->kfs_type,
734 KERNFS_FILEOP_GETATTR, v, EINVAL); 713 KERNFS_FILEOP_GETATTR, v, EINVAL);
735 break; 714 break;
736 } 715 }
737 716
738 return (error); 717 return (error);
739} 718}
740 719
741/*ARGSUSED*/ 720/*ARGSUSED*/
742int 721int
743kernfs_setattr(void *v) 722kernfs_setattr(void *v)
744{ 723{
745 724
746 /* 725 /*
747 * Silently ignore attribute changes. 726 * Silently ignore attribute changes.
748 * This allows for open with truncate to have no 727 * This allows for open with truncate to have no
749 * effect until some data is written. I want to 728 * effect until some data is written. I want to
750 * do it this way because all writes are atomic. 729 * do it this way because all writes are atomic.
751 */ 730 */
752 return (0); 731 return (0);
753} 732}
754 733
755int 734int
756kernfs_default_xread(void *v) 735kernfs_default_xread(void *v)
757{ 736{
758 struct vop_read_args /* { 737 struct vop_read_args /* {
759 struct vnode *a_vp; 738 struct vnode *a_vp;
760 struct uio *a_uio; 739 struct uio *a_uio;
761 int a_ioflag; 740 int a_ioflag;
762 kauth_cred_t a_cred; 741 kauth_cred_t a_cred;
763 } */ *ap = v; 742 } */ *ap = v;
764 struct uio *uio = ap->a_uio; 743 struct uio *uio = ap->a_uio;
765 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 744 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
766 char strbuf[KSTRING], *bf; 745 char strbuf[KSTRING], *bf;
767 int off; 746 int off;
768 size_t len; 747 size_t len;
769 int error; 748 int error;
770 749
771 if (ap->a_vp->v_type == VDIR) 750 if (ap->a_vp->v_type == VDIR)
772 return EISDIR; 751 return EISDIR;
773 752
774 off = (int)uio->uio_offset; 753 off = (int)uio->uio_offset;
775 /* Don't allow negative offsets */ 754 /* Don't allow negative offsets */
776 if (off < 0) 755 if (off < 0)
777 return EINVAL; 756 return EINVAL;
778 757
779 bf = strbuf; 758 bf = strbuf;
780 if ((error = kernfs_xread(kfs, off, &bf, sizeof(strbuf), &len)) == 0) 759 if ((error = kernfs_xread(kfs, off, &bf, sizeof(strbuf), &len)) == 0)
781 error = uiomove(bf, len, uio); 760 error = uiomove(bf, len, uio);
782 return (error); 761 return (error);
783} 762}
784 763
785int 764int
786kernfs_read(void *v) 765kernfs_read(void *v)
787{ 766{
788 struct vop_read_args /* { 767 struct vop_read_args /* {
789 struct vnode *a_vp; 768 struct vnode *a_vp;
790 struct uio *a_uio; 769 struct uio *a_uio;
791 int a_ioflag; 770 int a_ioflag;
792 struct ucred *a_cred; 771 struct ucred *a_cred;
793 } */ *ap = v; 772 } */ *ap = v;
794 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 773 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
795 774
796 if (kfs->kfs_type < KFSlasttype) { 775 if (kfs->kfs_type < KFSlasttype) {
797 /* use default function */ 776 /* use default function */
798 return kernfs_default_xread(v); 777 return kernfs_default_xread(v);
799 } 778 }
800 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_READ, v, 779 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_READ, v,
801 EOPNOTSUPP); 780 EOPNOTSUPP);
802} 781}
803 782
804static int 783static int
805kernfs_default_xwrite(void *v) 784kernfs_default_xwrite(void *v)
806{ 785{
807 struct vop_write_args /* { 786 struct vop_write_args /* {
808 struct vnode *a_vp; 787 struct vnode *a_vp;
809 struct uio *a_uio; 788 struct uio *a_uio;
810 int a_ioflag; 789 int a_ioflag;
811 kauth_cred_t a_cred; 790 kauth_cred_t a_cred;
812 } */ *ap = v; 791 } */ *ap = v;
813 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 792 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
814 struct uio *uio = ap->a_uio; 793 struct uio *uio = ap->a_uio;
815 int error; 794 int error;
816 size_t xlen; 795 size_t xlen;
817 char strbuf[KSTRING]; 796 char strbuf[KSTRING];
818 797
819 if (uio->uio_offset != 0) 798 if (uio->uio_offset != 0)
820 return (EINVAL); 799 return (EINVAL);
821 800
822 xlen = uimin(uio->uio_resid, KSTRING-1); 801 xlen = uimin(uio->uio_resid, KSTRING-1);
823 if ((error = uiomove(strbuf, xlen, uio)) != 0) 802 if ((error = uiomove(strbuf, xlen, uio)) != 0)
824 return (error); 803 return (error);
825 804
826 if (uio->uio_resid != 0) 805 if (uio->uio_resid != 0)
827 return (EIO); 806 return (EIO);
828 807
829 strbuf[xlen] = '\0'; 808 strbuf[xlen] = '\0';
830 xlen = strlen(strbuf); 809 xlen = strlen(strbuf);
831 return (kernfs_xwrite(kfs, strbuf, xlen)); 810 return (kernfs_xwrite(kfs, strbuf, xlen));
832} 811}
833 812
834int 813int
835kernfs_write(void *v) 814kernfs_write(void *v)
836{ 815{
837 struct vop_write_args /* { 816 struct vop_write_args /* {
838 struct vnode *a_vp; 817 struct vnode *a_vp;
839 struct uio *a_uio; 818 struct uio *a_uio;
840 int a_ioflag; 819 int a_ioflag;
841 kauth_cred_t a_cred; 820 kauth_cred_t a_cred;
842 } */ *ap = v; 821 } */ *ap = v;
843 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 822 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
844 823
845 if (kfs->kfs_type < KFSlasttype) { 824 if (kfs->kfs_type < KFSlasttype) {
846 /* use default function */ 825 /* use default function */
847 return kernfs_default_xwrite(v); 826 return kernfs_default_xwrite(v);
848 } 827 }
849 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_WRITE, v, 828 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_WRITE, v,
850 EOPNOTSUPP); 829 EOPNOTSUPP);
851} 830}
852 831
853int 832int
854kernfs_ioctl(void *v) 833kernfs_ioctl(void *v)
855{ 834{
856 struct vop_ioctl_args /* { 835 struct vop_ioctl_args /* {
857 const struct vnodeop_desc *a_desc; 836 const struct vnodeop_desc *a_desc;
858 struct vnode *a_vp; 837 struct vnode *a_vp;
859 u_long a_command; 838 u_long a_command;
860 void *a_data; 839 void *a_data;
861 int a_fflag; 840 int a_fflag;
862 kauth_cred_t a_cred; 841 kauth_cred_t a_cred;
863 } */ *ap = v; 842 } */ *ap = v;
864 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 843 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
865 844
866 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_IOCTL, v, 845 return kernfs_try_fileop(kfs->kfs_type, KERNFS_FILEOP_IOCTL, v,
867 EPASSTHROUGH); 846 EPASSTHROUGH);
868} 847}
869 848
870static int 849static int
871kernfs_setdirentfileno_kt(struct dirent *d, const struct kern_target *kt, 850kernfs_setdirentfileno_kt(struct dirent *d, const struct kern_target *kt,
872 struct vop_readdir_args *ap) 851 struct vop_readdir_args *ap)
873{ 852{
874 struct kernfs_node *kfs; 853 struct kernfs_node *kfs;
875 struct vnode *vp; 854 struct vnode *vp;
876 int error; 855 int error;
877 856
878 if ((error = vcache_get(ap->a_vp->v_mount, &kt, sizeof(kt), &vp)) != 0) 857 if ((error = vcache_get(ap->a_vp->v_mount, &kt, sizeof(kt), &vp)) != 0)
879 return error; 858 return error;
880 kfs = VTOKERN(vp); 859 kfs = VTOKERN(vp);
881 d->d_fileno = kfs->kfs_fileno; 860 d->d_fileno = kfs->kfs_fileno;
882 vrele(vp); 861 vrele(vp);
883 return 0; 862 return 0;
884} 863}
885 864
886static int 865static int
887kernfs_setdirentfileno(struct dirent *d, off_t entry, 866kernfs_setdirentfileno(struct dirent *d, off_t entry,
888 struct kernfs_node *thisdir_kfs, const struct kern_target *parent_kt, 867 struct kernfs_node *thisdir_kfs, const struct kern_target *parent_kt,
889 const struct kern_target *kt, struct vop_readdir_args *ap) 868 const struct kern_target *kt, struct vop_readdir_args *ap)
890{ 869{
891 const struct kern_target *ikt; 870 const struct kern_target *ikt;
892 int error; 871 int error;
893 872
894 switch (entry) { 873 switch (entry) {
895 case 0: 874 case 0:
896 d->d_fileno = thisdir_kfs->kfs_fileno; 875 d->d_fileno = thisdir_kfs->kfs_fileno;
897 return 0; 876 return 0;
898 case 1: 877 case 1:
899 ikt = parent_kt; 878 ikt = parent_kt;
900 break; 879 break;
901 default: 880 default:
902 ikt = kt; 881 ikt = kt;
903 break; 882 break;
904 } 883 }
905 if (ikt != thisdir_kfs->kfs_kt) { 884 if (ikt != thisdir_kfs->kfs_kt) {
906 if ((error = kernfs_setdirentfileno_kt(d, ikt, ap)) != 0) 885 if ((error = kernfs_setdirentfileno_kt(d, ikt, ap)) != 0)
907 return error; 886 return error;
908 } else 887 } else
909 d->d_fileno = thisdir_kfs->kfs_fileno; 888 d->d_fileno = thisdir_kfs->kfs_fileno;
910 return 0; 889 return 0;
911} 890}
912 891
913int 892int
914kernfs_readdir(void *v) 893kernfs_readdir(void *v)
915{ 894{
916 struct vop_readdir_args /* { 895 struct vop_readdir_args /* {
917 struct vnode *a_vp; 896 struct vnode *a_vp;
918 struct uio *a_uio; 897 struct uio *a_uio;
919 kauth_cred_t a_cred; 898 kauth_cred_t a_cred;
920 int *a_eofflag; 899 int *a_eofflag;
921 off_t **a_cookies; 900 off_t **a_cookies;
922 int a_*ncookies; 901 int a_*ncookies;
923 } */ *ap = v; 902 } */ *ap = v;
924 struct uio *uio = ap->a_uio; 903 struct uio *uio = ap->a_uio;
925 struct dirent d; 904 struct dirent d;
926 struct kernfs_node *kfs = VTOKERN(ap->a_vp); 905 struct kernfs_node *kfs = VTOKERN(ap->a_vp);
927 const struct kern_target *kt; 906 const struct kern_target *kt;
928 const struct dyn_kern_target *dkt = NULL; 907 const struct dyn_kern_target *dkt = NULL;
929 const struct kernfs_subdir *ks; 908 const struct kernfs_subdir *ks;
930 off_t i, j; 909 off_t i, j;
931 int error; 910 int error;
932 off_t *cookies = NULL; 911 off_t *cookies = NULL;
933 int ncookies = 0, n; 912 int ncookies = 0, n;
934 913
935 if (uio->uio_resid < UIO_MX) 914 if (uio->uio_resid < UIO_MX)
936 return (EINVAL); 915 return (EINVAL);
937 if (uio->uio_offset < 0) 916 if (uio->uio_offset < 0)
938 return (EINVAL); 917 return (EINVAL);
939 918
940 error = 0; 919 error = 0;
941 i = uio->uio_offset; 920 i = uio->uio_offset;
942 memset(&d, 0, sizeof(d)); 921 memset(&d, 0, sizeof(d));
943 d.d_reclen = UIO_MX; 922 d.d_reclen = UIO_MX;
944 ncookies = uio->uio_resid / UIO_MX; 923 ncookies = uio->uio_resid / UIO_MX;
945 924
946 switch (kfs->kfs_type) { 925 switch (kfs->kfs_type) {
947 case KFSkern: 926 case KFSkern:
948 if (i >= nkern_targets) 927 if (i >= nkern_targets)
949 return (0); 928 return (0);
950 929
951 if (ap->a_ncookies) { 930 if (ap->a_ncookies) {
952 ncookies = uimin(ncookies, (nkern_targets - i)); 931 ncookies = uimin(ncookies, (nkern_targets - i));
953 cookies = malloc(ncookies * sizeof(off_t), M_TEMP, 932 cookies = malloc(ncookies * sizeof(off_t), M_TEMP,
954 M_WAITOK); 933 M_WAITOK);
955 *ap->a_cookies = cookies; 934 *ap->a_cookies = cookies;
956 } 935 }
957 936
958 n = 0; 937 n = 0;
959 for (; i < nkern_targets && uio->uio_resid >= UIO_MX; i++) { 938 for (; i < nkern_targets && uio->uio_resid >= UIO_MX; i++) {
960 if (i < static_nkern_targets) 939 if (i < static_nkern_targets)
961 kt = &kern_targets[i]; 940 kt = &kern_targets[i];
962 else { 941 else {
963 if (dkt == NULL) { 942 if (dkt == NULL) {
964 dkt = SIMPLEQ_FIRST(&dyn_kern_targets); 943 dkt = SIMPLEQ_FIRST(&dyn_kern_targets);
965 for (j = static_nkern_targets; j < i && 944 for (j = static_nkern_targets; j < i &&
966 dkt != NULL; j++) 945 dkt != NULL; j++)
967 dkt = SIMPLEQ_NEXT(dkt, dkt_queue); 946 dkt = SIMPLEQ_NEXT(dkt, dkt_queue);
968 if (j != i) 947 if (j != i)
969 break; 948 break;
970 } else { 949 } else {
971 dkt = SIMPLEQ_NEXT(dkt, dkt_queue); 950 dkt = SIMPLEQ_NEXT(dkt, dkt_queue);
972 } 951 }
973 if (dkt == NULL) 952 if (dkt == NULL)
974 break; 953 break;
975 kt = &dkt->dkt_kt; 954 kt = &dkt->dkt_kt;
976 } 955 }
977 if (kt->kt_tag == KFSmsgbuf) { 956 if (kt->kt_tag == KFSmsgbuf) {
978 if (!logenabled(msgbufp)) { 957 if (!logenabled(msgbufp)) {
979 continue; 958 continue;
980 } 959 }
981 } 960 }
982 d.d_namlen = kt->kt_namlen; 961 d.d_namlen = kt->kt_namlen;
983 if ((error = kernfs_setdirentfileno(&d, i, kfs, 962 if ((error = kernfs_setdirentfileno(&d, i, kfs,
984 &kern_targets[0], kt, ap)) != 0) 963 &kern_targets[0], kt, ap)) != 0)
985 break; 964 break;
986 memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); 965 memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1);
987 d.d_type = kt->kt_type; 966 d.d_type = kt->kt_type;
988 if ((error = uiomove(&d, UIO_MX, uio)) != 0) 967 if ((error = uiomove(&d, UIO_MX, uio)) != 0)
989 break; 968 break;
990 if (cookies) 969 if (cookies)
991 *cookies++ = i + 1; 970 *cookies++ = i + 1;
992 n++; 971 n++;
993 } 972 }
994 ncookies = n; 973 ncookies = n;
995 break; 974 break;
996 975
997 case KFSroot: 976 case KFSroot:
998 if (i >= 2) 977 if (i >= 2)
999 return 0; 978 return 0;
1000 979
1001 if (ap->a_ncookies) { 980 if (ap->a_ncookies) {
1002 ncookies = uimin(ncookies, (2 - i)); 981 ncookies = uimin(ncookies, (2 - i));
1003 cookies = malloc(ncookies * sizeof(off_t), M_TEMP, 982 cookies = malloc(ncookies * sizeof(off_t), M_TEMP,
1004 M_WAITOK); 983 M_WAITOK);
1005 *ap->a_cookies = cookies; 984 *ap->a_cookies = cookies;
1006 } 985 }
1007 986
1008 n = 0; 987 n = 0;
1009 for (; i < 2 && uio->uio_resid >= UIO_MX; i++) { 988 for (; i < 2 && uio->uio_resid >= UIO_MX; i++) {
1010 kt = &kern_targets[i]; 989 kt = &kern_targets[i];
1011 d.d_namlen = kt->kt_namlen; 990 d.d_namlen = kt->kt_namlen;
1012 d.d_fileno = KERNFS_FILENO(kt, kt->kt_tag, 0); 991 d.d_fileno = KERNFS_FILENO(kt, kt->kt_tag, 0);
1013 memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); 992 memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1);
1014 d.d_type = kt->kt_type; 993 d.d_type = kt->kt_type;
1015 if ((error = uiomove(&d, UIO_MX, uio)) != 0) 994 if ((error = uiomove(&d, UIO_MX, uio)) != 0)
1016 break; 995 break;
1017 if (cookies) 996 if (cookies)
1018 *cookies++ = i + 1; 997 *cookies++ = i + 1;
1019 n++; 998 n++;
1020 } 999 }
1021 ncookies = n; 1000 ncookies = n;
1022 break; 1001 break;
1023 1002
1024 case KFSsubdir: 1003 case KFSsubdir:
1025 ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data; 1004 ks = (struct kernfs_subdir *)kfs->kfs_kt->kt_data;
1026 if (i >= ks->ks_nentries) 1005 if (i >= ks->ks_nentries)
1027 return (0); 1006 return (0);
1028 1007
1029 if (ap->a_ncookies) { 1008 if (ap->a_ncookies) {
1030 ncookies = uimin(ncookies, (ks->ks_nentries - i)); 1009 ncookies = uimin(ncookies, (ks->ks_nentries - i));
1031 cookies = malloc(ncookies * sizeof(off_t), M_TEMP, 1010 cookies = malloc(ncookies * sizeof(off_t), M_TEMP,
1032 M_WAITOK); 1011 M_WAITOK);
1033 *ap->a_cookies = cookies; 1012 *ap->a_cookies = cookies;
1034 } 1013 }
1035 1014
1036 dkt = SIMPLEQ_FIRST(&ks->ks_entries); 1015 dkt = SIMPLEQ_FIRST(&ks->ks_entries);
1037 for (j = 0; j < i && dkt != NULL; j++) 1016 for (j = 0; j < i && dkt != NULL; j++)
1038 dkt = SIMPLEQ_NEXT(dkt, dkt_queue); 1017 dkt = SIMPLEQ_NEXT(dkt, dkt_queue);
1039 n = 0; 1018 n = 0;
1040 for (; i < ks->ks_nentries && uio->uio_resid >= UIO_MX; i++) { 1019 for (; i < ks->ks_nentries && uio->uio_resid >= UIO_MX; i++) {
1041 if (i < 2) 1020 if (i < 2)
1042 kt = &subdir_targets[i]; 1021 kt = &subdir_targets[i];
1043 else { 1022 else {
1044 /* check if ks_nentries lied to us */ 1023 /* check if ks_nentries lied to us */
1045 if (dkt == NULL) 1024 if (dkt == NULL)
1046 break; 1025 break;
1047 kt = &dkt->dkt_kt; 1026 kt = &dkt->dkt_kt;
1048 dkt = SIMPLEQ_NEXT(dkt, dkt_queue); 1027 dkt = SIMPLEQ_NEXT(dkt, dkt_queue);
1049 } 1028 }
1050 d.d_namlen = kt->kt_namlen; 1029 d.d_namlen = kt->kt_namlen;
1051 if ((error = kernfs_setdirentfileno(&d, i, kfs, 1030 if ((error = kernfs_setdirentfileno(&d, i, kfs,
1052 ks->ks_parent, kt, ap)) != 0) 1031 ks->ks_parent, kt, ap)) != 0)
1053 break; 1032 break;
1054 memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1); 1033 memcpy(d.d_name, kt->kt_name, kt->kt_namlen + 1);
1055 d.d_type = kt->kt_type; 1034 d.d_type = kt->kt_type;
1056 if ((error = uiomove(&d, UIO_MX, uio)) != 0) 1035 if ((error = uiomove(&d, UIO_MX, uio)) != 0)
1057 break; 1036 break;
1058 if (cookies) 1037 if (cookies)
1059 *cookies++ = i + 1; 1038 *cookies++ = i + 1;
1060 n++; 1039 n++;
1061 } 1040 }
1062 ncookies = n; 1041 ncookies = n;
1063 break; 1042 break;
1064 1043
1065 default: 1044 default:
1066 error = ENOTDIR; 1045 error = ENOTDIR;
1067 break; 1046 break;
1068 } 1047 }
1069 1048
1070 if (ap->a_ncookies) { 1049 if (ap->a_ncookies) {
1071 if (error) { 1050 if (error) {
1072 if (cookies) 1051 if (cookies)
1073 free(*ap->a_cookies, M_TEMP); 1052 free(*ap->a_cookies, M_TEMP);
1074 *ap->a_ncookies = 0; 1053 *ap->a_ncookies = 0;
1075 *ap->a_cookies = NULL; 1054 *ap->a_cookies = NULL;
1076 } else 1055 } else
1077 *ap->a_ncookies = ncookies; 1056 *ap->a_ncookies = ncookies;
1078 } 1057 }
1079 1058
1080 uio->uio_offset = i; 1059 uio->uio_offset = i;
1081 return (error); 1060 return (error);
1082} 1061}
1083 1062
1084int 1063int
1085kernfs_inactive(void *v) 1064kernfs_inactive(void *v)
1086{ 1065{
1087 struct vop_inactive_v2_args /* { 1066 struct vop_inactive_v2_args /* {
1088 struct vnode *a_vp; 1067 struct vnode *a_vp;
1089 bool *a_recycle; 1068 bool *a_recycle;
1090 } */ *ap = v; 1069 } */ *ap = v;
1091 1070
1092 *ap->a_recycle = false; 1071 *ap->a_recycle = false;
1093 1072
1094 return (0); 1073 return (0);
1095} 1074}
1096 1075
1097int 1076int
1098kernfs_reclaim(void *v) 1077kernfs_reclaim(void *v)
1099{ 1078{
1100 struct vop_reclaim_v2_args /* { 1079 struct vop_reclaim_v2_args /* {
1101 struct vnode *a_vp; 1080 struct vnode *a_vp;
1102 } */ *ap = v; 1081 } */ *ap = v;
1103 struct vnode *vp = ap->a_vp; 1082 struct vnode *vp = ap->a_vp;
1104 struct kernfs_node *kfs = VTOKERN(vp); 1083 struct kernfs_node *kfs = VTOKERN(vp);
1105 1084
1106 VOP_UNLOCK(vp); 1085 VOP_UNLOCK(vp);
1107 1086
1108 vp->v_data = NULL; 1087 vp->v_data = NULL;
1109 mutex_enter(&kfs_lock); 1088 mutex_enter(&kfs_lock);
1110 TAILQ_REMOVE(&VFSTOKERNFS(vp->v_mount)->nodelist, kfs, kfs_list); 1089 TAILQ_REMOVE(&VFSTOKERNFS(vp->v_mount)->nodelist, kfs, kfs_list);
1111 mutex_exit(&kfs_lock); 1090 mutex_exit(&kfs_lock);
1112 kmem_free(kfs, sizeof(struct kernfs_node)); 1091 kmem_free(kfs, sizeof(struct kernfs_node));
1113 1092
1114 return 0; 1093 return 0;
1115} 1094}
1116 1095
1117/* 1096/*
1118 * Return POSIX pathconf information applicable to special devices. 1097 * Return POSIX pathconf information applicable to special devices.
1119 */ 1098 */
1120int 1099int
1121kernfs_pathconf(void *v) 1100kernfs_pathconf(void *v)
1122{ 1101{
1123 struct vop_pathconf_args /* { 1102 struct vop_pathconf_args /* {
1124 struct vnode *a_vp; 1103 struct vnode *a_vp;
1125 int a_name; 1104 int a_name;
1126 register_t *a_retval; 1105 register_t *a_retval;
1127 } */ *ap = v; 1106 } */ *ap = v;
1128 1107
1129 switch (ap->a_name) { 1108 switch (ap->a_name) {
1130 case _PC_LINK_MAX: 1109 case _PC_LINK_MAX:
1131 *ap->a_retval = LINK_MAX; 1110 *ap->a_retval = LINK_MAX;
1132 return (0); 1111 return (0);
1133 case _PC_MAX_CANON: 1112 case _PC_MAX_CANON:
1134 *ap->a_retval = MAX_CANON; 1113 *ap->a_retval = MAX_CANON;
1135 return (0); 1114 return (0);
1136 case _PC_MAX_INPUT: 1115 case _PC_MAX_INPUT:
1137 *ap->a_retval = MAX_INPUT; 1116 *ap->a_retval = MAX_INPUT;
1138 return (0); 1117 return (0);
1139 case _PC_PIPE_BUF: 1118 case _PC_PIPE_BUF:
1140 *ap->a_retval = PIPE_BUF; 1119 *ap->a_retval = PIPE_BUF;
1141 return (0); 1120 return (0);
1142 case _PC_CHOWN_RESTRICTED: 1121 case _PC_CHOWN_RESTRICTED:
1143 *ap->a_retval = 1; 1122 *ap->a_retval = 1;
1144 return (0); 1123 return (0);
1145 case _PC_VDISABLE: 1124 case _PC_VDISABLE:
1146 *ap->a_retval = _POSIX_VDISABLE; 1125 *ap->a_retval = _POSIX_VDISABLE;
1147 return (0); 1126 return (0);
1148 case _PC_SYNC_IO: 1127 case _PC_SYNC_IO:
1149 *ap->a_retval = 1; 1128 *ap->a_retval = 1;
1150 return (0); 1129 return (0);
1151 default: 1130 default:
1152 return genfs_pathconf(ap); 1131 return genfs_pathconf(ap);
1153 } 1132 }
1154 /* NOTREACHED */ 1133 /* NOTREACHED */
1155} 1134}
1156 1135
1157/* 1136/*
1158 * Print out the contents of a /dev/fd vnode. 1137 * Print out the contents of a /dev/fd vnode.
1159 */ 1138 */
1160/* ARGSUSED */ 1139/* ARGSUSED */
1161int 1140int
1162kernfs_print(void *v) 1141kernfs_print(void *v)
1163{ 1142{
1164 1143
1165 printf("tag VT_KERNFS, kernfs vnode\n"); 1144 printf("tag VT_KERNFS, kernfs vnode\n");
1166 return (0); 1145 return (0);
1167} 1146}
1168 1147
1169int 1148int
1170kernfs_link(void *v) 1149kernfs_link(void *v)
1171{ 1150{
1172 struct vop_link_v2_args /* { 1151 struct vop_link_v2_args /* {
1173 struct vnode *a_dvp; 1152 struct vnode *a_dvp;
1174 struct vnode *a_vp; 1153 struct vnode *a_vp;
1175 struct componentname *a_cnp; 1154 struct componentname *a_cnp;
1176 } */ *ap = v; 1155 } */ *ap = v;
1177 1156
1178 VOP_ABORTOP(ap->a_dvp, ap->a_cnp); 1157 VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
1179 return (EROFS); 1158 return (EROFS);
1180} 1159}
1181 1160
1182int 1161int
1183kernfs_symlink(void *v) 1162kernfs_symlink(void *v)
1184{ 1163{
1185 struct vop_symlink_v3_args /* { 1164 struct vop_symlink_v3_args /* {
1186 struct vnode *a_dvp; 1165 struct vnode *a_dvp;
1187 struct vnode **a_vpp; 1166 struct vnode **a_vpp;
1188 struct componentname *a_cnp; 1167 struct componentname *a_cnp;
1189 struct vattr *a_vap; 1168 struct vattr *a_vap;
1190 char *a_target; 1169 char *a_target;
1191 } */ *ap = v; 1170 } */ *ap = v;
1192 1171
1193 VOP_ABORTOP(ap->a_dvp, ap->a_cnp); 1172 VOP_ABORTOP(ap->a_dvp, ap->a_cnp);
1194 return (EROFS); 1173 return (EROFS);
1195} 1174}
1196  1175
1197int 1176int
1198kernfs_getpages(void *v) 1177kernfs_getpages(void *v)
1199{ 1178{
1200 struct vop_getpages_args /* { 1179 struct vop_getpages_args /* {
1201 struct vnode *a_vp; 1180 struct vnode *a_vp;
1202 voff_t a_offset; 1181 voff_t a_offset;
1203 struct vm_page **a_m; 1182 struct vm_page **a_m;
1204 int *a_count; 1183 int *a_count;
1205 int a_centeridx; 1184 int a_centeridx;
1206 vm_prot_t a_access_type; 1185 vm_prot_t a_access_type;
1207 int a_advice; 1186 int a_advice;
1208 int a_flags; 1187 int a_flags;
1209 } */ *ap = v; 1188 } */ *ap = v;
1210 1189
1211 if ((ap->a_flags & PGO_LOCKED) == 0) 1190 if ((ap->a_flags & PGO_LOCKED) == 0)
1212 rw_exit(ap->a_vp->v_uobj.vmobjlock); 1191 rw_exit(ap->a_vp->v_uobj.vmobjlock);
1213 1192
1214 return (EFAULT); 1193 return (EFAULT);
1215} 1194}