add revoke operator
[unix-history] / usr / src / sys / miscfs / kernfs / kernfs_vnops.c
CommitLineData
341568e0 1/*
99315dca
KB
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
341568e0
JSP
4 *
5 * This code is derived from software donated to Berkeley by
6 * Jan-Simon Pendry.
7 *
8 * %sccs.include.redist.c%
9 *
728dcff6 10 * @(#)kernfs_vnops.c 8.11 (Berkeley) %G%
341568e0
JSP
11 */
12
13/*
14 * Kernel parameter filesystem (/kern)
15 */
16
17#include <sys/param.h>
18#include <sys/systm.h>
19#include <sys/kernel.h>
20#include <sys/vmmeter.h>
21#include <sys/types.h>
22#include <sys/time.h>
23#include <sys/proc.h>
24#include <sys/vnode.h>
25#include <sys/malloc.h>
26#include <sys/file.h>
27#include <sys/stat.h>
28#include <sys/mount.h>
29#include <sys/namei.h>
30#include <sys/buf.h>
31#include <sys/dirent.h>
32#include <miscfs/kernfs/kernfs.h>
33
34#define KSTRING 256 /* Largest I/O available via this filesystem */
35#define UIO_MX 32
36
a1e23f7a
JSP
37#define READ_MODE (S_IRUSR|S_IRGRP|S_IROTH)
38#define WRITE_MODE (S_IWUSR|S_IRUSR|S_IRGRP|S_IROTH)
39#define DIR_MODE (S_IRUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
40
341568e0 41struct kern_target {
c3f7dc68
JSP
42 u_char kt_type;
43 u_char kt_namlen;
341568e0
JSP
44 char *kt_name;
45 void *kt_data;
c3f7dc68
JSP
46#define KTT_NULL 1
47#define KTT_TIME 5
48#define KTT_INT 17
49#define KTT_STRING 31
50#define KTT_HOSTNAME 47
51#define KTT_AVENRUN 53
52#define KTT_DEVICE 71
53 u_char kt_tag;
54 u_char kt_vtype;
55 mode_t kt_mode;
341568e0
JSP
56} kern_targets[] = {
57/* NOTE: The name must be less than UIO_MX-16 chars in length */
c3f7dc68
JSP
58#define N(s) sizeof(s)-1, s
59 /* name data tag type ro/rw */
60 { DT_DIR, N("."), 0, KTT_NULL, VDIR, DIR_MODE },
61 { DT_DIR, N(".."), 0, KTT_NULL, VDIR, DIR_MODE },
62 { DT_REG, N("boottime"), &boottime.tv_sec, KTT_INT, VREG, READ_MODE },
63 { DT_REG, N("copyright"), copyright, KTT_STRING, VREG, READ_MODE },
64 { DT_REG, N("hostname"), 0, KTT_HOSTNAME, VREG, WRITE_MODE },
65 { DT_REG, N("hz"), &hz, KTT_INT, VREG, READ_MODE },
66 { DT_REG, N("loadavg"), 0, KTT_AVENRUN, VREG, READ_MODE },
67 { DT_REG, N("pagesize"), &cnt.v_page_size, KTT_INT, VREG, READ_MODE },
68 { DT_REG, N("physmem"), &physmem, KTT_INT, VREG, READ_MODE },
650e78ba 69#if 0
c3f7dc68 70 { DT_DIR, N("root"), 0, KTT_NULL, VDIR, DIR_MODE },
650e78ba 71#endif
c3f7dc68
JSP
72 { DT_BLK, N("rootdev"), &rootdev, KTT_DEVICE, VBLK, READ_MODE },
73 { DT_CHR, N("rrootdev"), &rrootdev, KTT_DEVICE, VCHR, READ_MODE },
74 { DT_REG, N("time"), 0, KTT_TIME, VREG, READ_MODE },
75 { DT_REG, N("version"), version, KTT_STRING, VREG, READ_MODE },
76#undef N
341568e0 77};
341568e0
JSP
78static int nkern_targets = sizeof(kern_targets) / sizeof(kern_targets[0]);
79
80static int
81kernfs_xread(kt, buf, len, lenp)
82 struct kern_target *kt;
83 char *buf;
84 int len;
85 int *lenp;
86{
c3f7dc68 87
341568e0
JSP
88 switch (kt->kt_tag) {
89 case KTT_TIME: {
90 struct timeval tv;
91 microtime(&tv);
92 sprintf(buf, "%d %d\n", tv.tv_sec, tv.tv_usec);
93 break;
94 }
95
96 case KTT_INT: {
97 int *ip = kt->kt_data;
98 sprintf(buf, "%d\n", *ip);
99 break;
100 }
101
102 case KTT_STRING: {
103 char *cp = kt->kt_data;
104 int xlen = strlen(cp) + 1;
105
106 if (xlen >= len)
107 return (EINVAL);
108
109 bcopy(cp, buf, xlen);
110 break;
111 }
112
113 case KTT_HOSTNAME: {
114 char *cp = hostname;
115 int xlen = hostnamelen;
116
650e78ba 117 if (xlen >= (len-2))
341568e0
JSP
118 return (EINVAL);
119
650e78ba
JSP
120 bcopy(cp, buf, xlen);
121 buf[xlen] = '\n';
122 buf[xlen+1] = '\0';
341568e0
JSP
123 break;
124 }
125
126 case KTT_AVENRUN:
127 sprintf(buf, "%ld %ld %ld %ld\n",
c3f7dc68
JSP
128 averunnable.ldavg[0], averunnable.ldavg[1],
129 averunnable.ldavg[2], averunnable.fscale);
341568e0
JSP
130 break;
131
132 default:
c3f7dc68 133 return (EIO);
341568e0
JSP
134 }
135
136 *lenp = strlen(buf);
137 return (0);
138}
139
140static int
141kernfs_xwrite(kt, buf, len)
142 struct kern_target *kt;
143 char *buf;
144 int len;
145{
c3f7dc68 146
341568e0 147 switch (kt->kt_tag) {
c3f7dc68 148 case KTT_HOSTNAME:
341568e0
JSP
149 if (buf[len-1] == '\n')
150 --len;
151 bcopy(buf, hostname, len);
650e78ba
JSP
152 hostname[len] = '\0';
153 hostnamelen = len;
341568e0 154 return (0);
341568e0
JSP
155
156 default:
157 return (EIO);
158 }
159}
160
161
162/*
163 * vp is the current namei directory
164 * ndp is the name to locate in that directory...
165 */
166kernfs_lookup(ap)
167 struct vop_lookup_args /* {
168 struct vnode * a_dvp;
169 struct vnode ** a_vpp;
170 struct componentname * a_cnp;
171 } */ *ap;
172{
c3f7dc68 173 struct componentname *cnp = ap->a_cnp;
341568e0
JSP
174 struct vnode **vpp = ap->a_vpp;
175 struct vnode *dvp = ap->a_dvp;
c3f7dc68
JSP
176 char *pname = cnp->cn_nameptr;
177 struct kern_target *kt;
341568e0 178 struct vnode *fvp;
1f3d196a 179 int error, i;
341568e0
JSP
180
181#ifdef KERNFS_DIAGNOSTIC
182 printf("kernfs_lookup(%x)\n", ap);
183 printf("kernfs_lookup(dp = %x, vpp = %x, cnp = %x)\n", dvp, vpp, ap->a_cnp);
341568e0
JSP
184 printf("kernfs_lookup(%s)\n", pname);
185#endif
c3f7dc68 186
341568e0
JSP
187 if (cnp->cn_namelen == 1 && *pname == '.') {
188 *vpp = dvp;
fea856fc 189 VREF(dvp);
341568e0
JSP
190 /*VOP_LOCK(dvp);*/
191 return (0);
192 }
193
650e78ba 194#if 0
341568e0
JSP
195 if (cnp->cn_namelen == 4 && bcmp(pname, "root", 4) == 0) {
196 *vpp = rootdir;
197 VREF(rootdir);
198 VOP_LOCK(rootdir);
199 return (0);
200 }
650e78ba 201#endif
fea856fc 202
e053a1ac
JSP
203 *vpp = NULLVP;
204
c3f7dc68
JSP
205 for (error = ENOENT, kt = kern_targets, i = 0; i < nkern_targets;
206 kt++, i++) {
207 if (cnp->cn_namelen == kt->kt_namlen &&
341568e0
JSP
208 bcmp(kt->kt_name, pname, cnp->cn_namelen) == 0) {
209 error = 0;
210 break;
211 }
212 }
213
214#ifdef KERNFS_DIAGNOSTIC
215 printf("kernfs_lookup: i = %d, error = %d\n", i, error);
216#endif
217
218 if (error)
c3f7dc68
JSP
219 return (error);
220
221 if (kt->kt_tag == KTT_DEVICE) {
222 dev_t *dp = kt->kt_data;
223 loop:
224 if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp))
225 return (ENOENT);
226 *vpp = fvp;
227 if (vget(fvp, 1))
228 goto loop;
229 return (0);
230 }
341568e0
JSP
231
232#ifdef KERNFS_DIAGNOSTIC
233 printf("kernfs_lookup: allocate new vnode\n");
234#endif
c3f7dc68
JSP
235 if (error = getnewvnode(VT_KERNFS, dvp->v_mount, kernfs_vnodeop_p,
236 &fvp))
237 return (error);
238
239 MALLOC(fvp->v_data, void *, sizeof(struct kernfs_node), M_TEMP,
240 M_WAITOK);
241 VTOKERN(fvp)->kf_kt = kt;
242 fvp->v_type = kt->kt_vtype;
341568e0 243 *vpp = fvp;
c3f7dc68 244
341568e0
JSP
245#ifdef KERNFS_DIAGNOSTIC
246 printf("kernfs_lookup: newvp = %x\n", fvp);
247#endif
248 return (0);
341568e0
JSP
249}
250
251kernfs_open(ap)
252 struct vop_open_args /* {
253 struct vnode *a_vp;
254 int a_mode;
255 struct ucred *a_cred;
256 struct proc *a_p;
257 } */ *ap;
258{
341568e0 259
c3f7dc68 260 /* Only need to check access permissions. */
341568e0
JSP
261 return (0);
262}
263
264static int
265kernfs_access(ap)
266 struct vop_access_args /* {
267 struct vnode *a_vp;
268 int a_mode;
269 struct ucred *a_cred;
270 struct proc *a_p;
271 } */ *ap;
272{
c3f7dc68
JSP
273 register struct vnode *vp = ap->a_vp;
274 register struct ucred *cred = ap->a_cred;
275 mode_t amode = ap->a_mode;
276 mode_t fmode =
277 (vp->v_flag & VROOT) ? DIR_MODE : VTOKERN(vp)->kf_kt->kt_mode;
278 mode_t mask = 0;
279 register gid_t *gp;
280 int i;
341568e0 281
c3f7dc68
JSP
282 /* Some files are simply not modifiable. */
283 if ((amode & VWRITE) && (fmode & (S_IWUSR|S_IWGRP|S_IWOTH)) == 0)
284 return (EPERM);
8015f948 285
c3f7dc68
JSP
286 /* Root can do anything else. */
287 if (cred->cr_uid == 0)
341568e0 288 return (0);
341568e0 289
c3f7dc68
JSP
290 /* Check for group 0 (wheel) permissions. */
291 for (i = 0, gp = cred->cr_groups; i < cred->cr_ngroups; i++, gp++)
292 if (*gp == 0) {
293 if (amode & VEXEC)
294 mask |= S_IXGRP;
295 if (amode & VREAD)
296 mask |= S_IRGRP;
297 if (amode & VWRITE)
298 mask |= S_IWGRP;
299 return ((fmode & mask) == mask ? 0 : EACCES);
300 }
341568e0 301
c3f7dc68
JSP
302 /* Otherwise, check everyone else. */
303 if (amode & VEXEC)
304 mask |= S_IXOTH;
305 if (amode & VREAD)
306 mask |= S_IROTH;
307 if (amode & VWRITE)
308 mask |= S_IWOTH;
309 return ((fmode & mask) == mask ? 0 : EACCES);
341568e0
JSP
310}
311
341568e0
JSP
312kernfs_getattr(ap)
313 struct vop_getattr_args /* {
314 struct vnode *a_vp;
315 struct vattr *a_vap;
316 struct ucred *a_cred;
317 struct proc *a_p;
318 } */ *ap;
319{
320 struct vnode *vp = ap->a_vp;
321 struct vattr *vap = ap->a_vap;
194bbe41 322 struct timeval tv;
341568e0
JSP
323 int error = 0;
324 char strbuf[KSTRING];
341568e0
JSP
325
326 bzero((caddr_t) vap, sizeof(*vap));
327 vattr_null(vap);
328 vap->va_uid = 0;
329 vap->va_gid = 0;
330 vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
c3f7dc68 331 vap->va_size = 0;
341568e0 332 vap->va_blocksize = DEV_BSIZE;
194bbe41
CD
333 microtime(&tv);
334 TIMEVAL_TO_TIMESPEC(&tv, &vap->va_atime);
341568e0
JSP
335 vap->va_mtime = vap->va_atime;
336 vap->va_ctime = vap->va_ctime;
337 vap->va_gen = 0;
338 vap->va_flags = 0;
339 vap->va_rdev = 0;
341568e0
JSP
340 vap->va_bytes = 0;
341
342 if (vp->v_flag & VROOT) {
343#ifdef KERNFS_DIAGNOSTIC
344 printf("kernfs_getattr: stat rootdir\n");
345#endif
346 vap->va_type = VDIR;
a1e23f7a 347 vap->va_mode = DIR_MODE;
341568e0
JSP
348 vap->va_nlink = 2;
349 vap->va_fileid = 2;
350 vap->va_size = DEV_BSIZE;
351 } else {
8015f948 352 struct kern_target *kt = VTOKERN(vp)->kf_kt;
341568e0
JSP
353 int nbytes;
354#ifdef KERNFS_DIAGNOSTIC
355 printf("kernfs_getattr: stat target %s\n", kt->kt_name);
356#endif
357 vap->va_type = kt->kt_vtype;
c3f7dc68 358 vap->va_mode = kt->kt_mode;
341568e0 359 vap->va_nlink = 1;
c3f7dc68 360 vap->va_fileid = 1 + (kt - kern_targets) / sizeof(*kt);
341568e0
JSP
361 error = kernfs_xread(kt, strbuf, sizeof(strbuf), &nbytes);
362 vap->va_size = nbytes;
363 }
364
341568e0
JSP
365#ifdef KERNFS_DIAGNOSTIC
366 printf("kernfs_getattr: return error %d\n", error);
367#endif
368 return (error);
369}
370
371kernfs_setattr(ap)
372 struct vop_setattr_args /* {
373 struct vnode *a_vp;
374 struct vattr *a_vap;
375 struct ucred *a_cred;
376 struct proc *a_p;
377 } */ *ap;
378{
379
380 /*
381 * Silently ignore attribute changes.
382 * This allows for open with truncate to have no
383 * effect until some data is written. I want to
384 * do it this way because all writes are atomic.
385 */
386 return (0);
387}
388
389static int
390kernfs_read(ap)
391 struct vop_read_args /* {
392 struct vnode *a_vp;
393 struct uio *a_uio;
394 int a_ioflag;
395 struct ucred *a_cred;
396 } */ *ap;
397{
398 struct vnode *vp = ap->a_vp;
399 struct uio *uio = ap->a_uio;
8015f948 400 struct kern_target *kt;
341568e0
JSP
401 char strbuf[KSTRING];
402 int off = uio->uio_offset;
1f3d196a
KB
403 int error, len;
404 char *cp;
8015f948 405
c3f7dc68 406 if (vp->v_type == VDIR)
b5fd929e 407 return (EOPNOTSUPP);
8015f948
KM
408
409 kt = VTOKERN(vp)->kf_kt;
410
341568e0
JSP
411#ifdef KERNFS_DIAGNOSTIC
412 printf("kern_read %s\n", kt->kt_name);
413#endif
414
1f3d196a 415 len = 0;
c3f7dc68 416 if (error = kernfs_xread(kt, strbuf, sizeof(strbuf), &len))
341568e0 417 return (error);
c3f7dc68
JSP
418 if (len <= off)
419 return (0);
420 return (uiomove(&strbuf[off], len - off, uio));
341568e0
JSP
421}
422
423static int
424kernfs_write(ap)
425 struct vop_write_args /* {
426 struct vnode *a_vp;
427 struct uio *a_uio;
428 int a_ioflag;
429 struct ucred *a_cred;
430 } */ *ap;
431{
432 struct vnode *vp = ap->a_vp;
433 struct uio *uio = ap->a_uio;
8015f948 434 struct kern_target *kt;
1f3d196a 435 int error, xlen;
341568e0 436 char strbuf[KSTRING];
341568e0 437
c3f7dc68
JSP
438 if (vp->v_type == VDIR)
439 return (EOPNOTSUPP);
8015f948
KM
440
441 kt = VTOKERN(vp)->kf_kt;
442
341568e0
JSP
443 if (uio->uio_offset != 0)
444 return (EINVAL);
445
446 xlen = min(uio->uio_resid, KSTRING-1);
c3f7dc68 447 if (error = uiomove(strbuf, xlen, uio))
341568e0
JSP
448 return (error);
449
450 if (uio->uio_resid != 0)
451 return (EIO);
452
453 strbuf[xlen] = '\0';
650e78ba 454 xlen = strlen(strbuf);
341568e0
JSP
455 return (kernfs_xwrite(kt, strbuf, xlen));
456}
457
341568e0
JSP
458kernfs_readdir(ap)
459 struct vop_readdir_args /* {
460 struct vnode *a_vp;
461 struct uio *a_uio;
462 struct ucred *a_cred;
94b29fae
KM
463 int *a_eofflag;
464 u_long *a_cookies;
465 int a_ncookies;
341568e0
JSP
466 } */ *ap;
467{
c3f7dc68 468 int error, i;
341568e0 469 struct uio *uio = ap->a_uio;
c3f7dc68
JSP
470 struct kern_target *kt;
471 struct dirent d;
472
473 if (ap->a_vp->v_type != VDIR)
474 return (ENOTDIR);
341568e0 475
94b29fae
KM
476 /*
477 * We don't allow exporting kernfs mounts, and currently local
478 * requests do not need cookies.
479 */
c3f7dc68 480 if (ap->a_ncookies != NULL)
94b29fae
KM
481 panic("kernfs_readdir: not hungry");
482
341568e0
JSP
483 i = uio->uio_offset / UIO_MX;
484 error = 0;
c3f7dc68
JSP
485 for (kt = &kern_targets[i];
486 uio->uio_resid >= UIO_MX && i < nkern_targets; kt++, i++) {
341568e0 487 struct dirent *dp = &d;
341568e0
JSP
488#ifdef KERNFS_DIAGNOSTIC
489 printf("kernfs_readdir: i = %d\n", i);
490#endif
491
c3f7dc68
JSP
492 if (kt->kt_tag == KTT_DEVICE) {
493 dev_t *dp = kt->kt_data;
494 struct vnode *fvp;
341568e0 495
c3f7dc68
JSP
496 if (*dp == NODEV || !vfinddev(*dp, kt->kt_vtype, &fvp))
497 continue;
498 }
499
500 bzero((caddr_t)dp, UIO_MX);
501 dp->d_namlen = kt->kt_namlen;
502 bcopy(kt->kt_name, dp->d_name, kt->kt_namlen+1);
341568e0
JSP
503
504#ifdef KERNFS_DIAGNOSTIC
505 printf("kernfs_readdir: name = %s, len = %d\n",
506 dp->d_name, dp->d_namlen);
507#endif
508 /*
509 * Fill in the remaining fields
510 */
511 dp->d_reclen = UIO_MX;
512 dp->d_fileno = i + 3;
c3f7dc68 513 dp->d_type = kt->kt_type;
341568e0
JSP
514 /*
515 * And ship to userland
516 */
c3f7dc68 517 if (error = uiomove((caddr_t)dp, UIO_MX, uio))
341568e0 518 break;
341568e0
JSP
519 }
520
521 uio->uio_offset = i * UIO_MX;
522
523 return (error);
524}
525
526kernfs_inactive(ap)
527 struct vop_inactive_args /* {
528 struct vnode *a_vp;
529 } */ *ap;
530{
531 struct vnode *vp = ap->a_vp;
532
c3f7dc68
JSP
533#ifdef KERNFS_DIAGNOSTIC
534 printf("kernfs_inactive(%x)\n", vp);
535#endif
341568e0
JSP
536 /*
537 * Clear out the v_type field to avoid
538 * nasty things happening in vgone().
539 */
540 vp->v_type = VNON;
341568e0
JSP
541 return (0);
542}
543
544kernfs_reclaim(ap)
545 struct vop_reclaim_args /* {
546 struct vnode *a_vp;
547 } */ *ap;
548{
549 struct vnode *vp = ap->a_vp;
c3f7dc68 550
ae51ce7d 551#ifdef KERNFS_DIAGNOSTIC
341568e0 552 printf("kernfs_reclaim(%x)\n", vp);
ae51ce7d 553#endif
341568e0
JSP
554 if (vp->v_data) {
555 FREE(vp->v_data, M_TEMP);
556 vp->v_data = 0;
557 }
558 return (0);
559}
560
0020ca6e
JSP
561/*
562 * Return POSIX pathconf information applicable to special devices.
563 */
564kernfs_pathconf(ap)
565 struct vop_pathconf_args /* {
566 struct vnode *a_vp;
567 int a_name;
568 int *a_retval;
569 } */ *ap;
570{
571
572 switch (ap->a_name) {
573 case _PC_LINK_MAX:
574 *ap->a_retval = LINK_MAX;
575 return (0);
576 case _PC_MAX_CANON:
577 *ap->a_retval = MAX_CANON;
578 return (0);
579 case _PC_MAX_INPUT:
580 *ap->a_retval = MAX_INPUT;
581 return (0);
582 case _PC_PIPE_BUF:
583 *ap->a_retval = PIPE_BUF;
584 return (0);
585 case _PC_CHOWN_RESTRICTED:
586 *ap->a_retval = 1;
587 return (0);
588 case _PC_VDISABLE:
589 *ap->a_retval = _POSIX_VDISABLE;
590 return (0);
591 default:
592 return (EINVAL);
593 }
594 /* NOTREACHED */
595}
596
341568e0
JSP
597/*
598 * Print out the contents of a /dev/fd vnode.
599 */
600/* ARGSUSED */
601kernfs_print(ap)
602 struct vop_print_args /* {
603 struct vnode *a_vp;
604 } */ *ap;
605{
606
46a14367 607 printf("tag VT_KERNFS, kernfs vnode\n");
341568e0
JSP
608 return (0);
609}
610
611/*void*/
612kernfs_vfree(ap)
613 struct vop_vfree_args /* {
614 struct vnode *a_pvp;
615 ino_t a_ino;
616 int a_mode;
617 } */ *ap;
618{
619
620 return (0);
621}
622
341568e0
JSP
623/*
624 * /dev/fd "should never get here" operation
625 */
626kernfs_badop()
627{
628
629 panic("kernfs: bad op");
630 /* NOTREACHED */
631}
632
633/*
fea856fc 634 * kernfs vnode null operation
341568e0
JSP
635 */
636kernfs_nullop()
637{
638
639 return (0);
640}
641
728dcff6
KM
642#define kernfs_create ((int (*) __P((struct vop_create_args *)))eopnotsupp)
643#define kernfs_mknod ((int (*) __P((struct vop_mknod_args *)))eopnotsupp)
341568e0 644#define kernfs_close ((int (*) __P((struct vop_close_args *)))nullop)
728dcff6
KM
645#define kernfs_ioctl ((int (*) __P((struct vop_ioctl_args *)))eopnotsupp)
646#define kernfs_select ((int (*) __P((struct vop_select_args *)))eopnotsupp)
647#define kernfs_revoke vop_revoke
648#define kernfs_mmap ((int (*) __P((struct vop_mmap_args *)))eopnotsupp)
341568e0
JSP
649#define kernfs_fsync ((int (*) __P((struct vop_fsync_args *)))nullop)
650#define kernfs_seek ((int (*) __P((struct vop_seek_args *)))nullop)
728dcff6
KM
651#define kernfs_remove ((int (*) __P((struct vop_remove_args *)))eopnotsupp)
652#define kernfs_link ((int (*) __P((struct vop_link_args *)))eopnotsupp)
653#define kernfs_rename ((int (*) __P((struct vop_rename_args *)))eopnotsupp)
654#define kernfs_mkdir ((int (*) __P((struct vop_mkdir_args *)))eopnotsupp)
655#define kernfs_rmdir ((int (*) __P((struct vop_rmdir_args *)))eopnotsupp)
656#define kernfs_symlink ((int (*) __P((struct vop_symlink_args *)))eopnotsupp)
657#define kernfs_readlink ((int (*) __P((struct vop_readlink_args *)))eopnotsupp)
341568e0
JSP
658#define kernfs_abortop ((int (*) __P((struct vop_abortop_args *)))nullop)
659#define kernfs_lock ((int (*) __P((struct vop_lock_args *)))nullop)
660#define kernfs_unlock ((int (*) __P((struct vop_unlock_args *)))nullop)
661#define kernfs_bmap ((int (*) __P((struct vop_bmap_args *)))kernfs_badop)
728dcff6
KM
662#define kernfs_strategy \
663 ((int (*) __P((struct vop_strategy_args *)))kernfs_badop)
341568e0 664#define kernfs_islocked ((int (*) __P((struct vop_islocked_args *)))nullop)
728dcff6
KM
665#define kernfs_advlock ((int (*) __P((struct vop_advlock_args *)))eopnotsupp)
666#define kernfs_blkatoff ((int (*) __P((struct vop_blkatoff_args *)))eopnotsupp)
341568e0
JSP
667#define kernfs_valloc ((int(*) __P(( \
668 struct vnode *pvp, \
669 int mode, \
670 struct ucred *cred, \
728dcff6
KM
671 struct vnode **vpp))) eopnotsupp)
672#define kernfs_truncate ((int (*) __P((struct vop_truncate_args *)))eopnotsupp)
673#define kernfs_update ((int (*) __P((struct vop_update_args *)))eopnotsupp)
674#define kernfs_bwrite ((int (*) __P((struct vop_bwrite_args *)))eopnotsupp)
341568e0
JSP
675
676int (**kernfs_vnodeop_p)();
677struct vnodeopv_entry_desc kernfs_vnodeop_entries[] = {
678 { &vop_default_desc, vn_default_error },
679 { &vop_lookup_desc, kernfs_lookup }, /* lookup */
680 { &vop_create_desc, kernfs_create }, /* create */
681 { &vop_mknod_desc, kernfs_mknod }, /* mknod */
0020ca6e 682 { &vop_open_desc, kernfs_open }, /* open */
341568e0
JSP
683 { &vop_close_desc, kernfs_close }, /* close */
684 { &vop_access_desc, kernfs_access }, /* access */
685 { &vop_getattr_desc, kernfs_getattr }, /* getattr */
686 { &vop_setattr_desc, kernfs_setattr }, /* setattr */
0020ca6e 687 { &vop_read_desc, kernfs_read }, /* read */
341568e0
JSP
688 { &vop_write_desc, kernfs_write }, /* write */
689 { &vop_ioctl_desc, kernfs_ioctl }, /* ioctl */
690 { &vop_select_desc, kernfs_select }, /* select */
728dcff6 691 { &vop_revoke_desc, kernfs_revoke }, /* revoke */
0020ca6e 692 { &vop_mmap_desc, kernfs_mmap }, /* mmap */
341568e0 693 { &vop_fsync_desc, kernfs_fsync }, /* fsync */
0020ca6e 694 { &vop_seek_desc, kernfs_seek }, /* seek */
341568e0 695 { &vop_remove_desc, kernfs_remove }, /* remove */
0020ca6e 696 { &vop_link_desc, kernfs_link }, /* link */
341568e0
JSP
697 { &vop_rename_desc, kernfs_rename }, /* rename */
698 { &vop_mkdir_desc, kernfs_mkdir }, /* mkdir */
699 { &vop_rmdir_desc, kernfs_rmdir }, /* rmdir */
700 { &vop_symlink_desc, kernfs_symlink }, /* symlink */
701 { &vop_readdir_desc, kernfs_readdir }, /* readdir */
0020ca6e 702 { &vop_readlink_desc, kernfs_readlink },/* readlink */
341568e0 703 { &vop_abortop_desc, kernfs_abortop }, /* abortop */
0020ca6e 704 { &vop_inactive_desc, kernfs_inactive },/* inactive */
341568e0 705 { &vop_reclaim_desc, kernfs_reclaim }, /* reclaim */
0020ca6e 706 { &vop_lock_desc, kernfs_lock }, /* lock */
341568e0 707 { &vop_unlock_desc, kernfs_unlock }, /* unlock */
0020ca6e
JSP
708 { &vop_bmap_desc, kernfs_bmap }, /* bmap */
709 { &vop_strategy_desc, kernfs_strategy },/* strategy */
341568e0 710 { &vop_print_desc, kernfs_print }, /* print */
0020ca6e
JSP
711 { &vop_islocked_desc, kernfs_islocked },/* islocked */
712 { &vop_pathconf_desc, kernfs_pathconf },/* pathconf */
341568e0 713 { &vop_advlock_desc, kernfs_advlock }, /* advlock */
0020ca6e 714 { &vop_blkatoff_desc, kernfs_blkatoff },/* blkatoff */
341568e0
JSP
715 { &vop_valloc_desc, kernfs_valloc }, /* valloc */
716 { &vop_vfree_desc, kernfs_vfree }, /* vfree */
0020ca6e 717 { &vop_truncate_desc, kernfs_truncate },/* truncate */
341568e0
JSP
718 { &vop_update_desc, kernfs_update }, /* update */
719 { &vop_bwrite_desc, kernfs_bwrite }, /* bwrite */
720 { (struct vnodeop_desc*)NULL, (int(*)())NULL }
721};
722struct vnodeopv_desc kernfs_vnodeop_opv_desc =
723 { &kernfs_vnodeop_p, kernfs_vnodeop_entries };