X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/8f6c56a50524aa785f7e596d52dddfb331e18961..ca66cea69e6e866fd781ae2260d9474bdd48f2ca:/bsd/vfs/vfs_init.c?ds=sidebyside diff --git a/bsd/vfs/vfs_init.c b/bsd/vfs/vfs_init.c index 78790e025..fe9c904c5 100644 --- a/bsd/vfs/vfs_init.c +++ b/bsd/vfs/vfs_init.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2004 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2000-2007 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -65,6 +65,12 @@ * * @(#)vfs_init.c 8.5 (Berkeley) 5/11/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 @@ -78,6 +84,14 @@ #include #include +#include /* journal_init() */ +#if CONFIG_MACF +#include +#include +#endif +#if QUOTA +#include +#endif /* * Sigh, such primitive tools are these... @@ -88,7 +102,8 @@ #define DODEBUG(A) #endif -extern uid_t console_user; +__private_extern__ void vntblinit(void) __attribute__((section("__TEXT, initcode"))); + extern struct vnodeopv_desc *vfs_opv_descs[]; /* a list of lists of vnodeops defns */ extern struct vnodeop_desc *vfs_op_descs[]; @@ -101,14 +116,14 @@ extern struct vnodeop_desc *vfs_op_descs[]; */ int vfs_opv_numops; -typedef (*PFI)(); /* the standard Pointer to a Function returning an Int */ +typedef int (*PFIvp)(void *); /* * A miscellaneous routine. * A generic "default" routine that just returns an error. */ int -vn_default_error() +vn_default_error(void) { return (ENOTSUP); @@ -131,7 +146,7 @@ vn_default_error() * that is a(whole)nother story.) This is a feature. */ void -vfs_opv_init() +vfs_opv_init(void) { int i, j, k; int (***opv_desc_vector_p)(void *); @@ -148,9 +163,9 @@ vfs_opv_init() * Also handle backwards compatibility. */ if (*opv_desc_vector_p == NULL) { - MALLOC(*opv_desc_vector_p, PFI*, - vfs_opv_numops*sizeof(PFI), M_TEMP, M_WAITOK); - bzero (*opv_desc_vector_p, vfs_opv_numops*sizeof(PFI)); + MALLOC(*opv_desc_vector_p, PFIvp*, + vfs_opv_numops*sizeof(PFIvp), M_TEMP, M_WAITOK); + bzero (*opv_desc_vector_p, vfs_opv_numops*sizeof(PFIvp)); DODEBUG(printf("vector at %x allocated\n", opv_desc_vector_p)); } @@ -214,7 +229,7 @@ vfs_opv_init() * Initialize known vnode operations vectors. */ void -vfs_op_init() +vfs_op_init(void) { int i; @@ -251,11 +266,8 @@ lck_attr_t * vnode_lck_attr; lck_grp_t * vnode_list_lck_grp; lck_grp_attr_t * vnode_list_lck_grp_attr; lck_attr_t * vnode_list_lck_attr; -lck_mtx_t * vnode_list_mtx_lock; +lck_spin_t * vnode_list_spin_lock; lck_mtx_t * spechash_mtx_lock; -/* Routine to lock and unlock the vnode lists */ -void vnode_list_lock(void); -void vnode_list_unlock(void); /* vars for vfsconf lock */ lck_grp_t * fsconf_lck_grp; @@ -274,67 +286,56 @@ lck_grp_attr_t * mnt_list_lck_grp_attr; lck_attr_t * mnt_list_lck_attr; lck_mtx_t * mnt_list_mtx_lock; -extern void journal_init(); - struct mount * dead_mountp; /* * Initialize the vnode structures and initialize each file system type. */ void -vfsinit() +vfsinit(void) { struct vfstable *vfsp; int i, maxtypenum; struct mount * mp; /* Allocate vnode list lock group attribute and group */ - vnode_list_lck_grp_attr= lck_grp_attr_alloc_init(); - lck_grp_attr_setstat(vnode_list_lck_grp_attr); + vnode_list_lck_grp_attr = lck_grp_attr_alloc_init(); vnode_list_lck_grp = lck_grp_alloc_init("vnode list", vnode_list_lck_grp_attr); /* Allocate vnode list lock attribute */ vnode_list_lck_attr = lck_attr_alloc_init(); - //lck_attr_setdebug(vnode_list_lck_attr); /* Allocate vnode list lock */ - vnode_list_mtx_lock = lck_mtx_alloc_init(vnode_list_lck_grp, vnode_list_lck_attr); + vnode_list_spin_lock = lck_spin_alloc_init(vnode_list_lck_grp, vnode_list_lck_attr); /* Allocate spec hash list lock */ spechash_mtx_lock = lck_mtx_alloc_init(vnode_list_lck_grp, vnode_list_lck_attr); /* allocate vnode lock group attribute and group */ vnode_lck_grp_attr= lck_grp_attr_alloc_init(); - lck_grp_attr_setstat(vnode_lck_grp_attr); vnode_lck_grp = lck_grp_alloc_init("vnode", vnode_lck_grp_attr); /* Allocate vnode lock attribute */ vnode_lck_attr = lck_attr_alloc_init(); - //lck_attr_setdebug(vnode_lck_attr); /* Allocate fs config lock group attribute and group */ fsconf_lck_grp_attr= lck_grp_attr_alloc_init(); - lck_grp_attr_setstat(fsconf_lck_grp_attr); fsconf_lck_grp = lck_grp_alloc_init("fs conf", fsconf_lck_grp_attr); /* Allocate fs config lock attribute */ fsconf_lck_attr = lck_attr_alloc_init(); - //lck_attr_setdebug(fsconf_lck_attr); - /* Allocate mount point related lock structures */ /* Allocate mount list lock group attribute and group */ mnt_list_lck_grp_attr= lck_grp_attr_alloc_init(); - lck_grp_attr_setstat(mnt_list_lck_grp_attr); mnt_list_lck_grp = lck_grp_alloc_init("mount list", mnt_list_lck_grp_attr); /* Allocate mount list lock attribute */ mnt_list_lck_attr = lck_attr_alloc_init(); - //lck_attr_setdebug(mnt_list_lck_attr); /* Allocate mount list lock */ mnt_list_mtx_lock = lck_mtx_alloc_init(mnt_list_lck_grp, mnt_list_lck_attr); @@ -342,19 +343,12 @@ vfsinit() /* allocate mount lock group attribute and group */ mnt_lck_grp_attr= lck_grp_attr_alloc_init(); - lck_grp_attr_setstat(mnt_lck_grp_attr); mnt_lck_grp = lck_grp_alloc_init("mount", mnt_lck_grp_attr); /* Allocate mount lock attribute */ mnt_lck_attr = lck_attr_alloc_init(); - //lck_attr_setdebug(mnt_lck_attr); - /* - * Initialize the "console user" for access purposes: - */ - console_user = (uid_t)0; - /* * Initialize the vnode table */ @@ -367,10 +361,14 @@ vfsinit() * Initialize the vnode name cache */ nchinit(); + +#if JOURNALING /* * Initialize the journaling locks */ journal_init(); +#endif + /* * Build vnode operation vectors. */ @@ -381,13 +379,14 @@ vfsinit() * until the first NULL ->vfs_vfsops is encountered. */ numused_vfsslots = maxtypenum = 0; - for (vfsp = vfsconf, i = 0; i < maxvfsconf; i++, vfsp++) { + for (vfsp = vfsconf, i = 0; i < maxvfsslots; i++, vfsp++) { if (vfsp->vfc_vfsops == (struct vfsops *)0) break; if (i) vfsconf[i-1].vfc_next = vfsp; if (maxtypenum <= vfsp->vfc_typenum) maxtypenum = vfsp->vfc_typenum + 1; - (*vfsp->vfc_vfsops->vfs_init)(vfsp); + /* a vfsconf is a prefix subset of a vfstable... */ + (*vfsp->vfc_vfsops->vfs_init)((struct vfsconf *)vfsp); lck_mtx_init(&vfsp->vfc_lock, fsconf_lck_grp, fsconf_lck_attr); @@ -400,6 +399,13 @@ vfsinit() * Initialize the vnop authorization scope. */ vnode_authorize_init(); + + /* + * Initialiize the quota system. + */ +#if QUOTA + dqinit(); +#endif /* * create a mount point for dead vnodes @@ -413,6 +419,10 @@ vfsinit() mp->mnt_maxsegreadsize = mp->mnt_maxreadcnt; mp->mnt_maxsegwritesize = mp->mnt_maxwritecnt; mp->mnt_devblocksize = DEV_BSIZE; + mp->mnt_alignmentmask = PAGE_MASK; + mp->mnt_ioflags = 0; + mp->mnt_realrootvp = NULLVP; + mp->mnt_authcache_ttl = CACHED_LOOKUP_RIGHT_TTL; TAILQ_INIT(&mp->mnt_vnodelist); TAILQ_INIT(&mp->mnt_workerqueue); @@ -420,29 +430,34 @@ vfsinit() mp->mnt_flag = MNT_LOCAL; mp->mnt_lflag = MNT_LDEAD; mount_lock_init(mp); + +#if CONFIG_MACF + mac_mount_label_init(mp); + mac_mount_label_associate(vfs_context_kernel(), mp); +#endif dead_mountp = mp; } void -vnode_list_lock() +vnode_list_lock(void) { - lck_mtx_lock(vnode_list_mtx_lock); + lck_spin_lock(vnode_list_spin_lock); } void -vnode_list_unlock() +vnode_list_unlock(void) { - lck_mtx_unlock(vnode_list_mtx_lock); + lck_spin_unlock(vnode_list_spin_lock); } void -mount_list_lock() +mount_list_lock(void) { lck_mtx_lock(mnt_list_mtx_lock); } void -mount_list_unlock() +mount_list_unlock(void) { lck_mtx_unlock(mnt_list_mtx_lock); }