1/*	$NetBSD: sysvbfs.c,v 1.19 2021/06/29 22:34:07 dholland Exp $	*/
2
3/*-
4 * Copyright (c) 2004 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by UCHIYAMA Yasushi.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#include <sys/cdefs.h>
33__KERNEL_RCSID(0, "$NetBSD: sysvbfs.c,v 1.19 2021/06/29 22:34:07 dholland Exp $");
34
35#include <sys/resource.h>
36#include <sys/param.h>
37#include <sys/vnode.h>
38#include <sys/mount.h>
39#include <sys/module.h>
40#include <miscfs/genfs/genfs.h>
41#include <miscfs/genfs/genfs_node.h>
42#include <fs/sysvbfs/sysvbfs.h>
43
44MODULE(MODULE_CLASS_VFS, sysvbfs, NULL);
45
46/* External interfaces */
47
48int (**sysvbfs_vnodeop_p)(void *);	/* filled by getnewvnode (vnode.h) */
49
50const struct vnodeopv_entry_desc sysvbfs_vnodeop_entries[] = {
51	{ &vop_default_desc, vn_default_error },
52	{ &vop_parsepath_desc, genfs_parsepath },	/* parsepath */
53	{ &vop_lookup_desc, sysvbfs_lookup },		/* lookup */
54	{ &vop_create_desc, sysvbfs_create },		/* create */
55	{ &vop_mknod_desc, genfs_eopnotsupp },		/* mknod */
56	{ &vop_open_desc, sysvbfs_open },		/* open */
57	{ &vop_close_desc, sysvbfs_close },		/* close */
58	{ &vop_access_desc, sysvbfs_access },		/* access */
59	{ &vop_accessx_desc, genfs_accessx },		/* accessx */
60	{ &vop_getattr_desc, sysvbfs_getattr },		/* getattr */
61	{ &vop_setattr_desc, sysvbfs_setattr },		/* setattr */
62	{ &vop_read_desc, sysvbfs_read },		/* read */
63	{ &vop_write_desc, sysvbfs_write },		/* write */
64	{ &vop_fallocate_desc, genfs_eopnotsupp },	/* fallocate */
65	{ &vop_fdiscard_desc, genfs_eopnotsupp },	/* fdiscard */
66	{ &vop_fcntl_desc, genfs_fcntl },		/* fcntl */
67	{ &vop_ioctl_desc, genfs_enoioctl },		/* ioctl */
68	{ &vop_poll_desc, genfs_poll },			/* poll */
69	{ &vop_kqfilter_desc, genfs_kqfilter },		/* kqfilter */
70	{ &vop_revoke_desc, genfs_revoke },		/* revoke */
71	{ &vop_mmap_desc, genfs_mmap },			/* mmap */
72	{ &vop_fsync_desc, sysvbfs_fsync },		/* fsync */
73	{ &vop_seek_desc, genfs_seek },			/* seek */
74	{ &vop_remove_desc, sysvbfs_remove },		/* remove */
75	{ &vop_link_desc, genfs_eopnotsupp },		/* link */
76	{ &vop_rename_desc, sysvbfs_rename },		/* rename */
77	{ &vop_mkdir_desc, genfs_eopnotsupp },		/* mkdir */
78	{ &vop_rmdir_desc, genfs_eopnotsupp },		/* rmdir */
79	{ &vop_symlink_desc, genfs_eopnotsupp },	/* symlink */
80	{ &vop_readdir_desc, sysvbfs_readdir },		/* readdir */
81	{ &vop_readlink_desc, genfs_eopnotsupp },	/* readlink */
82	{ &vop_abortop_desc, genfs_abortop },		/* abortop */
83	{ &vop_inactive_desc, sysvbfs_inactive },	/* inactive */
84	{ &vop_reclaim_desc, sysvbfs_reclaim },		/* reclaim */
85	{ &vop_lock_desc, genfs_lock },			/* lock */
86	{ &vop_unlock_desc, genfs_unlock },		/* unlock */
87	{ &vop_bmap_desc, sysvbfs_bmap },		/* bmap */
88	{ &vop_strategy_desc, sysvbfs_strategy },	/* strategy */
89	{ &vop_print_desc, sysvbfs_print },		/* print */
90	{ &vop_islocked_desc, genfs_islocked },		/* islocked */
91	{ &vop_pathconf_desc, sysvbfs_pathconf },	/* pathconf */
92	{ &vop_advlock_desc, sysvbfs_advlock },		/* advlock */
93	{ &vop_bwrite_desc, vn_bwrite },		/* bwrite */
94	{ &vop_getpages_desc, genfs_getpages },		/* getpages */
95	{ &vop_putpages_desc, genfs_putpages },		/* putpages */
96	{ NULL, NULL }
97};
98
99const struct vnodeopv_desc sysvbfs_vnodeop_opv_desc = {
100	&sysvbfs_vnodeop_p,
101	sysvbfs_vnodeop_entries
102};
103
104const struct vnodeopv_desc *sysvbfs_vnodeopv_descs[] = {
105	&sysvbfs_vnodeop_opv_desc,
106	NULL,
107};
108
109const struct genfs_ops sysvbfs_genfsops = {
110	.gop_size = genfs_size,
111	.gop_alloc = sysvbfs_gop_alloc,
112	.gop_write = genfs_gop_write,
113	.gop_putrange = genfs_gop_putrange,
114};
115
116struct vfsops sysvbfs_vfsops = {
117	.vfs_name = MOUNT_SYSVBFS,
118	.vfs_min_mount_data = sizeof (struct sysvbfs_args),
119	.vfs_mount = sysvbfs_mount,
120	.vfs_start = sysvbfs_start,
121	.vfs_unmount = sysvbfs_unmount,
122	.vfs_root = sysvbfs_root,
123	.vfs_quotactl = (void *)eopnotsupp,
124	.vfs_statvfs = sysvbfs_statvfs,
125	.vfs_sync = sysvbfs_sync,
126	.vfs_vget = sysvbfs_vget,
127	.vfs_loadvnode = sysvbfs_loadvnode,
128	.vfs_fhtovp = sysvbfs_fhtovp,
129	.vfs_vptofh = sysvbfs_vptofh,
130	.vfs_init = sysvbfs_init,
131	.vfs_reinit = sysvbfs_reinit,
132	.vfs_done = sysvbfs_done,
133	.vfs_snapshot = (void *)eopnotsupp,
134	.vfs_extattrctl = vfs_stdextattrctl,
135	.vfs_suspendctl = genfs_suspendctl,
136	.vfs_renamelock_enter = genfs_renamelock_enter,
137	.vfs_renamelock_exit = genfs_renamelock_exit,
138	.vfs_fsync = (void *)eopnotsupp,
139	.vfs_opv_descs = sysvbfs_vnodeopv_descs
140};
141
142static int
143sysvbfs_modcmd(modcmd_t cmd, void *arg)
144{
145
146	switch (cmd) {
147	case MODULE_CMD_INIT:
148		return vfs_attach(&sysvbfs_vfsops);
149	case MODULE_CMD_FINI:
150		return vfs_detach(&sysvbfs_vfsops);
151	default:
152		return ENOTTY;
153	}
154}
155