X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..e8c3f78193f1895ea514044358b93b1add9322f3:/bsd/vfs/vfs_conf.c diff --git a/bsd/vfs/vfs_conf.c b/bsd/vfs/vfs_conf.c index 353224c5a..af7ba7c5b 100644 --- a/bsd/vfs/vfs_conf.c +++ b/bsd/vfs/vfs_conf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2014 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -60,6 +60,12 @@ * * @(#)vfs_conf.c 8.11 (Berkeley) 5/10/95 */ +/* + * NOTICE: This file was modified by SPARTA, Inc. in 2005 to introduce + * support for mandatory and extensible security protections. This notice + * is included in support of clause 2.2 (b) of the Apple Public License, + * Version 2.0. + */ #include #include @@ -71,113 +77,92 @@ */ struct mount *rootfs; struct vnode *rootvnode; -int (*mountroot)() = NULL; + +#ifdef CONFIG_IMGSRC_ACCESS +struct vnode *imgsrc_rootvnodes[MAX_IMAGEBOOT_NESTING]; /* [0] -> source volume, [1] -> first disk image */ +#endif /* CONFIG_IMGSRC_ACCESS */ + +int (*mountroot)(void) = NULL; /* * Set up the initial array of known filesystem types. */ -extern struct vfsops ufs_vfsops; -#if FFS -extern int ffs_mountroot(); -#endif extern struct vfsops mfs_vfsops; -extern int mfs_mountroot(); -extern struct vfsops hfs_vfsops; -extern int hfs_mountroot(); -extern struct vfsops volfs_vfsops; -extern struct vfsops cd9660_vfsops; -extern int cd9660_mountroot(); +extern int mfs_mountroot(mount_t, vnode_t, vfs_context_t); /* dead */ extern struct vfsops nfs_vfsops; -extern int nfs_mountroot(); +extern int nfs_mountroot(void); extern struct vfsops afs_vfsops; extern struct vfsops null_vfsops; -extern struct vfsops union_vfsops; -extern struct vfsops fdesc_vfsops; extern struct vfsops devfs_vfsops; +extern struct vfsops routefs_vfsops; +extern struct vfsops nullfs_vfsops; + +#if MOCKFS +extern struct vfsops mockfs_vfsops; +extern int mockfs_mountroot(mount_t, vnode_t, vfs_context_t); +#endif /* MOCKFS */ /* - * Set up the filesystem operations for vnodes. + * For nfs_mountroot(void) cast. nfs_mountroot ignores its parameters, if + * invoked through this table. */ -static struct vfstable vfsconflist[] = { - /* HFS/HFS+ Filesystem */ -#if HFS - { &hfs_vfsops, "hfs", 17, 0, MNT_LOCAL | MNT_DOVOLFS, hfs_mountroot, NULL, 0, {0}, VFC_VFSLOCALARGS, 0, 0 }, -#endif - - /* Fast Filesystem */ -#if FFS - { &ufs_vfsops, "ufs", 1, 0, MNT_LOCAL, ffs_mountroot, NULL, 0, {0}, VFC_VFSLOCALARGS, 0, 0 }, -#endif - - /* ISO9660 (aka CDROM) Filesystem */ -#if CD9660 - { &cd9660_vfsops, "cd9660", 14, 0, MNT_LOCAL, cd9660_mountroot, NULL, 0, {0}, VFC_VFSLOCALARGS, 0, 0 }, -#endif - - /* Memory-based Filesystem */ -#if MFS - { &mfs_vfsops, "mfs", 3, 0, MNT_LOCAL, mfs_mountroot, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, -#endif +typedef int (*mountroot_t)(mount_t, vnode_t, vfs_context_t); + +enum fs_type_num { + FT_NFS = 2, + FT_DEVFS = 19, + FT_SYNTHFS = 20, + FT_ROUTEFS = 21, + FT_NULLFS = 22, + FT_MOCKFS = 0x6D6F636B +}; +/* + * Set up the filesystem operations for vnodes. + */ +static struct vfstable vfstbllist[] = { /* Sun-compatible Network Filesystem */ #if NFSCLIENT - { &nfs_vfsops, "nfs", 2, 0, 0, nfs_mountroot, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, -#endif - - /* Andrew Filesystem */ -#if AFS - { &afs_vfsops, "andrewfs", 13, 0, 0, afs_mountroot, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, -#endif - - /* Loopback (Minimal) Filesystem Layer */ -#if NULLFS - { &null_vfsops, "loopback", 9, 0, 0, NULL, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, -#endif - - /* Union (translucent) Filesystem */ -#if UNION - { &union_vfsops, "union", 15, 0, 0, NULL, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, -#endif - - /* File Descriptor Filesystem */ -#if FDESC - { &fdesc_vfsops, "fdesc", 7, 0, 0, NULL, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, -#endif - - /* Volume ID Filesystem */ -#if VOLFS - { &volfs_vfsops, "volfs", 18, 0, 0, NULL, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, + { &nfs_vfsops, "nfs", FT_NFS, 0, 0, NULL, NULL, 0, 0, VFC_VFSGENERICARGS | VFC_VFSPREFLIGHT | VFC_VFS64BITREADY | VFC_VFSREADDIR_EXTENDED, NULL, 0, NULL}, #endif /* Device Filesystem */ #if DEVFS - { &devfs_vfsops, "devfs", 19, 0, 0, NULL, NULL, 0, {0}, VFC_VFSGENERICARGS , 0, 0}, +#if CONFIG_MACF + { &devfs_vfsops, "devfs", FT_DEVFS, 0, MNT_MULTILABEL, NULL, NULL, 0, 0, VFC_VFSGENERICARGS | VFC_VFS64BITREADY, NULL, 0, NULL}, +#else + { &devfs_vfsops, "devfs", FT_DEVFS, 0, 0, NULL, NULL, 0, 0, VFC_VFSGENERICARGS | VFC_VFS64BITREADY, NULL, 0, NULL}, +#endif /* MAC */ #endif - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0}, - {0} +#ifndef __LP64__ +#endif /* __LP64__ */ + +#if NULLFS + { &nullfs_vfsops, "nullfs", FT_NULLFS, 0, (MNT_DONTBROWSE | MNT_RDONLY), NULL, NULL, 0, 0, VFC_VFS64BITREADY, NULL, 0, NULL}, +#endif /* NULLFS */ + +#if MOCKFS + /* If we are configured for it, mockfs should always be the last standard entry (and thus the last FS we attempt mountroot with) */ + { &mockfs_vfsops, "mockfs", FT_MOCKFS, 0, MNT_LOCAL, mockfs_mountroot, NULL, 0, 0, VFC_VFSGENERICARGS, NULL, 0, NULL}, +#endif /* MOCKFS */ + +#if ROUTEFS + /* If we are configured for it, mockfs should always be the last standard entry (and thus the last FS we attempt mountroot with) */ + { &routefs_vfsops, "routefs", FT_ROUTEFS, 0, MNT_LOCAL, NULL, NULL, 0, 0, VFC_VFSGENERICARGS | VFC_VFS64BITREADY, NULL, 0, NULL}, +#endif /* ROUTEFS */ + {NULL, "", 0, 0, 0, NULL, NULL, 0, 0, 0, NULL, 0, NULL}, + {NULL, "", 0, 0, 0, NULL, NULL, 0, 0, 0, NULL, 0, NULL}, }; /* - * Initially the size of the list, vfs_init will set maxvfsconf - * to the highest defined type number. + * vfs_init will set maxvfstypenum to the highest defined type number. */ -int maxvfsslots = sizeof(vfsconflist) / sizeof (struct vfsconf); +const int maxvfsslots = sizeof(vfstbllist) / sizeof (struct vfstable); int numused_vfsslots = 0; -int maxvfsconf = sizeof(vfsconflist) / sizeof (struct vfsconf); -struct vfstable *vfsconf = vfsconflist; +int numregistered_fses = 0; +int maxvfstypenum = VT_NON + 1; +struct vfstable *vfsconf = vfstbllist; /* * @@ -186,42 +171,35 @@ struct vfstable *vfsconf = vfsconflist; * vectors. It is NULL terminated. * */ -#if FFS -extern struct vnodeopv_desc ffs_vnodeop_opv_desc; -extern struct vnodeopv_desc ffs_specop_opv_desc; -extern struct vnodeopv_desc ffs_fifoop_opv_desc; -#endif extern struct vnodeopv_desc mfs_vnodeop_opv_desc; extern struct vnodeopv_desc dead_vnodeop_opv_desc; +#if FIFO && SOCKETS extern struct vnodeopv_desc fifo_vnodeop_opv_desc; +#endif /* SOCKETS */ extern struct vnodeopv_desc spec_vnodeop_opv_desc; extern struct vnodeopv_desc nfsv2_vnodeop_opv_desc; extern struct vnodeopv_desc spec_nfsv2nodeop_opv_desc; extern struct vnodeopv_desc fifo_nfsv2nodeop_opv_desc; -extern struct vnodeopv_desc fdesc_vnodeop_opv_desc; +extern struct vnodeopv_desc nfsv4_vnodeop_opv_desc; +extern struct vnodeopv_desc spec_nfsv4nodeop_opv_desc; +extern struct vnodeopv_desc fifo_nfsv4nodeop_opv_desc; extern struct vnodeopv_desc null_vnodeop_opv_desc; -extern struct vnodeopv_desc hfs_vnodeop_opv_desc; -extern struct vnodeopv_desc hfs_specop_opv_desc; -extern struct vnodeopv_desc hfs_fifoop_opv_desc; -extern struct vnodeopv_desc volfs_vnodeop_opv_desc; -extern struct vnodeopv_desc cd9660_vnodeop_opv_desc; -extern struct vnodeopv_desc cd9660_cdxaop_opv_desc; -extern struct vnodeopv_desc cd9660_specop_opv_desc; -extern struct vnodeopv_desc cd9660_fifoop_opv_desc; -extern struct vnodeopv_desc union_vnodeop_opv_desc; extern struct vnodeopv_desc devfs_vnodeop_opv_desc; extern struct vnodeopv_desc devfs_spec_vnodeop_opv_desc; +#if FDESC +extern struct vnodeopv_desc devfs_devfd_vnodeop_opv_desc; +extern struct vnodeopv_desc devfs_fdesc_vnodeop_opv_desc; +#endif /* FDESC */ + +#if MOCKFS +extern struct vnodeopv_desc mockfs_vnodeop_opv_desc; +#endif /* MOCKFS */ + +extern struct vnodeopv_desc nullfs_vnodeop_opv_desc; struct vnodeopv_desc *vfs_opv_descs[] = { -#if FFS - &ffs_vnodeop_opv_desc, - &ffs_specop_opv_desc, -#if FIFO - &ffs_fifoop_opv_desc, -#endif -#endif &dead_vnodeop_opv_desc, -#if FIFO +#if FIFO && SOCKETS &fifo_vnodeop_opv_desc, #endif &spec_vnodeop_opv_desc, @@ -231,40 +209,26 @@ struct vnodeopv_desc *vfs_opv_descs[] = { #if NFSCLIENT &nfsv2_vnodeop_opv_desc, &spec_nfsv2nodeop_opv_desc, + &nfsv4_vnodeop_opv_desc, + &spec_nfsv4nodeop_opv_desc, #if FIFO &fifo_nfsv2nodeop_opv_desc, + &fifo_nfsv4nodeop_opv_desc, #endif #endif -#if FDESC - &fdesc_vnodeop_opv_desc, -#endif -#if NULLFS - &null_vnodeop_opv_desc, -#endif -#if HFS - &hfs_vnodeop_opv_desc, - &hfs_specop_opv_desc, -#if FIFO - &hfs_fifoop_opv_desc, -#endif -#endif -#if CD9660 - &cd9660_vnodeop_opv_desc, - &cd9660_cdxaop_opv_desc, - &cd9660_specop_opv_desc, -#if FIFO - &cd9660_fifoop_opv_desc, -#endif -#endif -#if UNION - &union_vnodeop_opv_desc, -#endif -#if VOLFS - &volfs_vnodeop_opv_desc, -#endif #if DEVFS &devfs_vnodeop_opv_desc, &devfs_spec_vnodeop_opv_desc, -#endif +#if FDESC + &devfs_devfd_vnodeop_opv_desc, + &devfs_fdesc_vnodeop_opv_desc, +#endif /* FDESC */ +#endif /* DEVFS */ +#if NULLFS + &nullfs_vnodeop_opv_desc, +#endif /* NULLFS */ +#if MOCKFS + &mockfs_vnodeop_opv_desc, +#endif /* MOCKFS */ NULL };