xref: /netbsd-src/sys/miscfs/deadfs/dead_vfsops.c (revision 26784725eeed8e5fc5898ec384aab2af43e2e264)
1*26784725Sriastradh /*	$NetBSD: dead_vfsops.c,v 1.13 2022/10/26 23:39:43 riastradh Exp $	*/
2d940ddccShannken 
3d940ddccShannken /*-
4d940ddccShannken  * Copyright (c) 2014 The NetBSD Foundation, Inc.
5d940ddccShannken  * All rights reserved.
6d940ddccShannken  *
7d940ddccShannken  * This code is derived from software contributed to The NetBSD Foundation
8d940ddccShannken  * by Juergen Hannken-Illjes.
9d940ddccShannken  *
10d940ddccShannken  * Redistribution and use in source and binary forms, with or without
11d940ddccShannken  * modification, are permitted provided that the following conditions
12d940ddccShannken  * are met:
13d940ddccShannken  * 1. Redistributions of source code must retain the above copyright
14d940ddccShannken  *    notice, this list of conditions and the following disclaimer.
15d940ddccShannken  * 2. Redistributions in binary form must reproduce the above copyright
16d940ddccShannken  *    notice, this list of conditions and the following disclaimer in the
17d940ddccShannken  *    documentation and/or other materials provided with the distribution.
18d940ddccShannken  *
19d940ddccShannken  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20d940ddccShannken  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21d940ddccShannken  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22d940ddccShannken  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23d940ddccShannken  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24d940ddccShannken  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25d940ddccShannken  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26d940ddccShannken  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27d940ddccShannken  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28d940ddccShannken  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29d940ddccShannken  * POSSIBILITY OF SUCH DAMAGE.
30d940ddccShannken  */
31d940ddccShannken 
32d940ddccShannken #include <sys/cdefs.h>
33*26784725Sriastradh __KERNEL_RCSID(0, "$NetBSD: dead_vfsops.c,v 1.13 2022/10/26 23:39:43 riastradh Exp $");
34d940ddccShannken 
35d940ddccShannken #include <sys/param.h>
36d940ddccShannken #include <sys/systm.h>
37d940ddccShannken #include <sys/vnode.h>
38d940ddccShannken #include <sys/mount.h>
39d940ddccShannken 
40*26784725Sriastradh #include <miscfs/deadfs/deadfs.h>
41142e4ca5Shannken #include <miscfs/specfs/specdev.h>
42142e4ca5Shannken 
43142e4ca5Shannken VFS_PROTOS(dead);
44142e4ca5Shannken 
45142e4ca5Shannken static void dead_panic(void);
46142e4ca5Shannken 
47d940ddccShannken static const struct vnodeopv_desc * const dead_vnodeopv_descs[] = {
48d940ddccShannken 	&dead_vnodeop_opv_desc,
49d940ddccShannken 	NULL
50d940ddccShannken };
51d940ddccShannken 
52142e4ca5Shannken struct mount *dead_rootmount;
53d940ddccShannken 
54d940ddccShannken struct vfsops dead_vfsops = {
556d285189Shannken 	.vfs_name = "dead",
566d285189Shannken 	.vfs_min_mount_data = 0,
576d285189Shannken 	.vfs_mount = (void *)dead_panic,
586d285189Shannken 	.vfs_start = (void *)dead_panic,
596d285189Shannken 	.vfs_unmount = (void *)dead_panic,
606d285189Shannken 	.vfs_root = (void *)dead_panic,
616d285189Shannken 	.vfs_quotactl = (void *)dead_panic,
624c6398a9Shannken 	.vfs_statvfs = (void *)eopnotsupp,
636d285189Shannken 	.vfs_sync = (void *)dead_panic,
646d285189Shannken 	.vfs_vget = (void *)dead_panic,
654e19d4c7Shannken 	.vfs_loadvnode = (void *)dead_panic,
664e19d4c7Shannken 	.vfs_newvnode = dead_newvnode,
676d285189Shannken 	.vfs_fhtovp = (void *)dead_panic,
684c6398a9Shannken 	.vfs_vptofh = (void *)eopnotsupp,
696d285189Shannken 	.vfs_init = (void *)dead_panic,
706d285189Shannken 	.vfs_reinit = (void *)dead_panic,
716d285189Shannken 	.vfs_done = (void *)dead_panic,
726d285189Shannken 	.vfs_mountroot = (void *)dead_panic,
736d285189Shannken 	.vfs_snapshot = (void *)dead_panic,
746d285189Shannken 	.vfs_extattrctl = (void *)dead_panic,
756d285189Shannken 	.vfs_suspendctl = (void *)dead_panic,
766d285189Shannken 	.vfs_renamelock_enter = (void *)dead_panic,
776d285189Shannken 	.vfs_renamelock_exit = (void *)dead_panic,
786d285189Shannken 	.vfs_fsync = (void *)eopnotsupp,
796d285189Shannken 	.vfs_opv_descs = dead_vnodeopv_descs
80d940ddccShannken };
81142e4ca5Shannken 
82142e4ca5Shannken static void
dead_panic(void)83142e4ca5Shannken dead_panic(void)
84142e4ca5Shannken {
85142e4ca5Shannken 
86142e4ca5Shannken 	panic("dead fs operation used");
87142e4ca5Shannken }
884e19d4c7Shannken 
894e19d4c7Shannken /*
904e19d4c7Shannken  * Create a new anonymous device vnode.
914e19d4c7Shannken  */
924e19d4c7Shannken int
dead_newvnode(struct mount * mp,struct vnode * dvp,struct vnode * vp,struct vattr * vap,kauth_cred_t cred,void * extra,size_t * key_len,const void ** new_key)934e19d4c7Shannken dead_newvnode(struct mount *mp, struct vnode *dvp, struct vnode *vp,
94b689ec0fShannken     struct vattr *vap, kauth_cred_t cred, void *extra,
954e19d4c7Shannken     size_t *key_len, const void **new_key)
964e19d4c7Shannken {
974e19d4c7Shannken 
984e19d4c7Shannken 	KASSERT(mp == dead_rootmount);
994e19d4c7Shannken 	KASSERT(dvp == NULL);
1004e19d4c7Shannken 	KASSERT(vap->va_type == VCHR || vap->va_type == VBLK);
1014e19d4c7Shannken 	KASSERT(vap->va_rdev != VNOVAL);
1024e19d4c7Shannken 
1034e19d4c7Shannken 	vp->v_tag = VT_NON;
1044e19d4c7Shannken 	vp->v_type = vap->va_type;
1054e19d4c7Shannken 	vp->v_op = spec_vnodeop_p;
1069ea3b23dShannken 	vp->v_vflag |= VV_MPSAFE;
1074e19d4c7Shannken 	uvm_vnp_setsize(vp, 0);
1084e19d4c7Shannken 	spec_node_init(vp, vap->va_rdev);
1094e19d4c7Shannken 
1107801661cShannken 	*key_len = 0;
1117801661cShannken 	*new_key = NULL;
1124e19d4c7Shannken 
1134e19d4c7Shannken 	return 0;
1144e19d4c7Shannken }
115