2  * Copyright (c) 2000-2019 Apple Inc. All rights reserved. 
   4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 
   6  * This file contains Original Code and/or Modifications of Original Code 
   7  * as defined in and that are subject to the Apple Public Source License 
   8  * Version 2.0 (the 'License'). You may not use this file except in 
   9  * compliance with the License. The rights granted to you under the License 
  10  * may not be used to create, or enable the creation or redistribution of, 
  11  * unlawful or unlicensed copies of an Apple operating system, or to 
  12  * circumvent, violate, or enable the circumvention or violation of, any 
  13  * terms of an Apple operating system software license agreement. 
  15  * Please obtain a copy of the License at 
  16  * http://www.opensource.apple.com/apsl/ and read it before using this file. 
  18  * The Original Code and all software distributed under the License are 
  19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
  22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  23  * Please see the License for the specific language governing rights and 
  24  * limitations under the License. 
  26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 
  28 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */ 
  30  * Copyright (c) 1989, 1993, 1995 
  31  *      The Regents of the University of California.  All rights reserved. 
  33  * Redistribution and use in source and binary forms, with or without 
  34  * modification, are permitted provided that the following conditions 
  36  * 1. Redistributions of source code must retain the above copyright 
  37  *    notice, this list of conditions and the following disclaimer. 
  38  * 2. Redistributions in binary form must reproduce the above copyright 
  39  *    notice, this list of conditions and the following disclaimer in the 
  40  *    documentation and/or other materials provided with the distribution. 
  41  * 3. All advertising materials mentioning features or use of this software 
  42  *    must display the following acknowledgement: 
  43  *      This product includes software developed by the University of 
  44  *      California, Berkeley and its contributors. 
  45  * 4. Neither the name of the University nor the names of its contributors 
  46  *    may be used to endorse or promote products derived from this software 
  47  *    without specific prior written permission. 
  49  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 
  50  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
  51  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
  52  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 
  53  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
  54  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
  55  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
  56  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
  57  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
  58  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
  61  *      @(#)vfs_conf.c  8.11 (Berkeley) 5/10/95 
  64  * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce 
  65  * support for mandatory and extensible security protections.  This notice 
  66  * is included in support of clause 2.2 (b) of the Apple Public License, 
  70 #include <sys/param.h> 
  71 #include <sys/systm.h> 
  72 #include <sys/mount_internal.h> 
  73 #include <sys/vnode_internal.h> 
  75 #include <nfs/nfs_conf.h> 
  78  * These define the root filesystem, device, and root filesystem type. 
  81 struct vnode 
*rootvnode
; 
  83 #ifdef CONFIG_IMGSRC_ACCESS 
  84 struct vnode 
*imgsrc_rootvnodes
[MAX_IMAGEBOOT_NESTING
]; /* [0] -> source volume, [1] -> first disk image */ 
  85 #endif /* CONFIG_IMGSRC_ACCESS */ 
  87 int (*mountroot
)(void) = NULL
; 
  90  * Set up the initial array of known filesystem types. 
  92 extern  struct vfsops mfs_vfsops
; 
  93 extern  int mfs_mountroot(mount_t
, vnode_t
, vfs_context_t
);     /* dead */ 
  94 extern  struct vfsops nfs_vfsops
; 
  95 extern  int nfs_mountroot(void); 
  96 extern  struct vfsops afs_vfsops
; 
  97 extern  struct vfsops null_vfsops
; 
  98 extern  struct vfsops devfs_vfsops
; 
  99 extern  const struct vfsops routefs_vfsops
; 
 100 extern  struct vfsops nullfs_vfsops
; 
 101 extern struct vfsops bindfs_vfsops
; 
 104 extern  struct vfsops mockfs_vfsops
; 
 105 extern  int mockfs_mountroot(mount_t
, vnode_t
, vfs_context_t
); 
 109  * For nfs_mountroot(void) cast.  nfs_mountroot ignores its parameters, if 
 110  * invoked through this table. 
 112 typedef int (*mountroot_t
)(mount_t
, vnode_t
, vfs_context_t
); 
 121         FT_MOCKFS  
= 0x6D6F636B 
 125  * Set up the filesystem operations for vnodes. 
 127 static struct vfstable vfstbllist
[] = { 
 128         /* Sun-compatible Network Filesystem */ 
 129 #if CONFIG_NFS_CLIENT 
 131                 .vfc_vfsops 
= &nfs_vfsops
, 
 133                 .vfc_typenum 
= FT_NFS
, 
 136                 .vfc_mountroot 
= NULL
, 
 140                 .vfc_vfsflags 
= VFC_VFSGENERICARGS 
| VFC_VFSPREFLIGHT 
| VFC_VFS64BITREADY 
| VFC_VFSREADDIR_EXTENDED
, 
 145 #endif /* CONFIG_NFS_CLIENT */ 
 147         /* Device Filesystem */ 
 151                 .vfc_vfsops 
= &devfs_vfsops
, 
 153                 .vfc_typenum 
= FT_DEVFS
, 
 155                 .vfc_flags 
= MNT_MULTILABEL
, 
 156                 .vfc_mountroot 
= NULL
, 
 160                 .vfc_vfsflags 
= VFC_VFSGENERICARGS 
| VFC_VFS64BITREADY
, 
 165 #else /* !CONFIG_MAC */ 
 167                 .vfc_vfsops 
= &devfs_vfsops
, 
 169                 .vfc_typenum 
= FT_DEVFS
, 
 172                 .vfc_mountroot 
= NULL
, 
 176                 .vfc_vfsflags 
= VFC_VFSGENERICARGS 
| VFC_VFS64BITREADY
, 
 181 #endif /* CONFIG_MAC */ 
 185 #endif /* __LP64__ */ 
 189                 .vfc_vfsops 
= &nullfs_vfsops
, 
 190                 .vfc_name 
= "nullfs", 
 191                 .vfc_typenum 
= FT_NULLFS
, 
 193                 .vfc_flags 
= MNT_DONTBROWSE 
| MNT_RDONLY
, 
 194                 .vfc_mountroot 
= NULL
, 
 198                 .vfc_vfsflags 
= VFC_VFS64BITREADY
, 
 207                 .vfc_vfsops 
= &bindfs_vfsops
, 
 208                 .vfc_name 
= "bindfs", 
 209                 .vfc_typenum 
= FT_BINDFS
, 
 211                 .vfc_flags 
= MNT_DONTBROWSE 
| MNT_RDONLY
, 
 212                 .vfc_mountroot 
= NULL
, 
 216                 .vfc_vfsflags 
= VFC_VFS64BITREADY
, 
 224         /* If we are configured for it, mockfs should always be the last standard entry (and thus the last FS we attempt mountroot with) */ 
 226                 .vfc_vfsops 
= &mockfs_vfsops
, 
 227                 .vfc_name 
= "mockfs", 
 228                 .vfc_typenum 
= FT_MOCKFS
, 
 230                 .vfc_flags 
= MNT_LOCAL
, 
 231                 .vfc_mountroot 
= mockfs_mountroot
, 
 235                 .vfc_vfsflags 
= VFC_VFSGENERICARGS
, 
 243         /* If we are configured for it, mockfs should always be the last standard entry (and thus the last FS we attempt mountroot with) */ 
 245                 .vfc_vfsops 
= &routefs_vfsops
, 
 246                 .vfc_name 
= "routefs", 
 247                 .vfc_typenum 
= FT_ROUTEFS
, 
 249                 .vfc_flags 
= MNT_LOCAL
, 
 250                 .vfc_mountroot 
= NULL
, 
 254                 .vfc_vfsflags 
= VFC_VFSGENERICARGS 
| VFC_VFS64BITREADY
, 
 263                 .vfc_name 
= "<unassigned>", 
 267                 .vfc_mountroot 
= NULL
, 
 278                 .vfc_name 
= "<unassigned>", 
 282                 .vfc_mountroot 
= NULL
, 
 294  * vfs_init will set maxvfstypenum to the highest defined type number. 
 296 const int maxvfsslots 
= sizeof(vfstbllist
) / sizeof(struct vfstable
); 
 297 int numused_vfsslots 
= 0; 
 298 int numregistered_fses 
= 0; 
 299 int maxvfstypenum 
= VT_NON 
+ 1; 
 300 struct vfstable 
*vfsconf 
= vfstbllist
; 
 304  * vfs_opv_descs enumerates the list of vnode classes, each with it's own 
 305  * vnode operation vector.  It is consulted at system boot to build operation 
 306  * vectors.  It is NULL terminated. 
 309 extern struct vnodeopv_desc mfs_vnodeop_opv_desc
; 
 310 extern const struct vnodeopv_desc dead_vnodeop_opv_desc
; 
 312 extern const struct vnodeopv_desc fifo_vnodeop_opv_desc
; 
 314 extern const struct vnodeopv_desc spec_vnodeop_opv_desc
; 
 315 extern const struct vnodeopv_desc nfsv2_vnodeop_opv_desc
; 
 316 extern const struct vnodeopv_desc spec_nfsv2nodeop_opv_desc
; 
 317 extern const struct vnodeopv_desc fifo_nfsv2nodeop_opv_desc
; 
 319 extern const struct vnodeopv_desc nfsv4_vnodeop_opv_desc
; 
 320 extern const struct vnodeopv_desc spec_nfsv4nodeop_opv_desc
; 
 321 extern const struct vnodeopv_desc fifo_nfsv4nodeop_opv_desc
; 
 323 extern struct vnodeopv_desc null_vnodeop_opv_desc
; 
 324 extern struct vnodeopv_desc devfs_vnodeop_opv_desc
; 
 325 extern struct vnodeopv_desc devfs_spec_vnodeop_opv_desc
; 
 327 extern struct vnodeopv_desc devfs_devfd_vnodeop_opv_desc
; 
 328 extern const struct vnodeopv_desc devfs_fdesc_vnodeop_opv_desc
; 
 332 extern const struct vnodeopv_desc mockfs_vnodeop_opv_desc
; 
 335 extern const struct vnodeopv_desc nullfs_vnodeop_opv_desc
; 
 336 extern const struct vnodeopv_desc bindfs_vnodeop_opv_desc
; 
 338 const struct vnodeopv_desc 
*vfs_opv_descs
[] = { 
 339         &dead_vnodeop_opv_desc
, 
 341         &fifo_vnodeop_opv_desc
, 
 343         &spec_vnodeop_opv_desc
, 
 345         &mfs_vnodeop_opv_desc
, 
 347 #if CONFIG_NFS_CLIENT 
 348         &nfsv2_vnodeop_opv_desc
, 
 349         &spec_nfsv2nodeop_opv_desc
, 
 351         &nfsv4_vnodeop_opv_desc
, 
 352         &spec_nfsv4nodeop_opv_desc
, 
 355         &fifo_nfsv2nodeop_opv_desc
, 
 357         &fifo_nfsv4nodeop_opv_desc
, 
 358 #endif /* CONFIG_NFS4 */ 
 360 #endif /* CONFIG_NFS_CLIENT */ 
 362         &devfs_vnodeop_opv_desc
, 
 363         &devfs_spec_vnodeop_opv_desc
, 
 365         &devfs_devfd_vnodeop_opv_desc
, 
 366         &devfs_fdesc_vnodeop_opv_desc
, 
 370         &nullfs_vnodeop_opv_desc
, 
 373         &bindfs_vnodeop_opv_desc
, 
 376         &mockfs_vnodeop_opv_desc
,