X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/6d2010ae8f7a6078e10b361c6962983bab233e0f..ea3f04195ba4a5034c9c8e9b726d4f7ce96f1832:/bsd/miscfs/devfs/devfs_vfsops.c diff --git a/bsd/miscfs/devfs/devfs_vfsops.c b/bsd/miscfs/devfs/devfs_vfsops.c index f34edc2c5..3498ffc04 100644 --- a/bsd/miscfs/devfs/devfs_vfsops.c +++ b/bsd/miscfs/devfs/devfs_vfsops.c @@ -2,7 +2,7 @@ * Copyright (c) 2000-2010 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * This file contains Original Code and/or Modifications of Original Code * as defined in and that are subject to the Apple Public Source License * Version 2.0 (the 'License'). You may not use this file except in @@ -11,10 +11,10 @@ * unlawful or unlicensed copies of an Apple operating system, or to * circumvent, violate, or enable the circumvention or violation of, any * terms of an Apple operating system software license agreement. - * + * * Please obtain a copy of the License at * http://www.opensource.apple.com/apsl/ and read it before using this file. - * + * * The Original Code and all software distributed under the License are * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, @@ -22,13 +22,13 @@ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. * Please see the License for the specific language governing rights and * limitations under the License. - * + * * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ */ /*- * Copyright 1997,1998 Julian Elischer. All rights reserved. * julian@freebsd.org - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: @@ -37,7 +37,7 @@ * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -49,7 +49,7 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * * devfs_vfsops.c * */ @@ -75,8 +75,9 @@ #include #include #include - +#include #include +#include #if CONFIG_MACF #include @@ -93,15 +94,14 @@ static int devfs_statfs( struct mount *mp, struct vfsstatfs *sbp, vfs_context_t ctx); static int devfs_vfs_getattr(mount_t mp, struct vfs_attr *fsap, vfs_context_t ctx); -#if !defined(SECURE_KERNEL) -extern int setup_kmem; -__private_extern__ void devfs_setup_kmem(void); +#if CONFIG_DEV_KMEM +extern boolean_t dev_kmem_enabled; #endif /*- * Called from the generic VFS startups. * This is the second stage of DEVFS initialisation. - * The probed devices have already been loaded and the + * The probed devices have already been loaded and the * basic structure of the DEVFS created. * We take the oportunity to mount the hidden DEVFS layer, so that * devices from devfs get sync'd. @@ -109,42 +109,50 @@ __private_extern__ void devfs_setup_kmem(void); static int devfs_init(__unused struct vfsconf *vfsp) { - if (devfs_sinit()) - return (ENOTSUP); - devfs_make_node(makedev(0, 0), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0622, "console"); - devfs_make_node(makedev(2, 0), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0666, "tty"); -#if !defined(SECURE_KERNEL) - if (setup_kmem) { - devfs_setup_kmem(); - } + if (devfs_sinit()) { + return ENOTSUP; + } + devfs_make_node(makedev(0, 0), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0622, "console"); + devfs_make_node(makedev(2, 0), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0666, "tty"); +#if CONFIG_DEV_KMEM + if (dev_kmem_enabled) { + /* (3,0) reserved for /dev/mem physical memory */ + devfs_make_node(makedev(3, 1), DEVFS_CHAR, + UID_ROOT, GID_KMEM, 0640, "kmem"); + } #endif - devfs_make_node(makedev(3, 2), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0666, "null"); - devfs_make_node(makedev(3, 3), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0666, "zero"); - devfs_make_node(makedev(6, 0), DEVFS_CHAR, - UID_ROOT, GID_WHEEL, 0600, "klog"); + devfs_make_node(makedev(3, 2), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0666, "null"); + devfs_make_node(makedev(3, 3), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0666, "zero"); + uint32_t logging_config = atm_get_diagnostic_config(); + + devfs_make_node(makedev(6, 0), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0600, "klog"); + + if (!(logging_config & ATM_TRACE_DISABLE)) { + devfs_make_node(makedev(7, 0), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0600, "oslog"); + if (cdevsw_setkqueueok(7, (&(cdevsw[7])), 0) == -1) { + return ENOTSUP; + } + + devfs_make_node(makedev(8, 0), DEVFS_CHAR, + UID_ROOT, GID_WHEEL, 0600, "oslog_stream"); + if (cdevsw_setkqueueok(8, (&(cdevsw[8])), 0) == -1) { + return ENOTSUP; + } + } + #if FDESC - devfs_fdesc_init(); + devfs_fdesc_init(); #endif - return 0; -} - -#if !defined(SECURE_KERNEL) -__private_extern__ void -devfs_setup_kmem(void) -{ - devfs_make_node(makedev(3, 0), DEVFS_CHAR, - UID_ROOT, GID_KMEM, 0640, "mem"); - devfs_make_node(makedev(3, 1), DEVFS_CHAR, - UID_ROOT, GID_KMEM, 0640, "kmem"); + return 0; } -#endif - /*- * mp - pointer to 'mount' structure @@ -163,14 +171,13 @@ devfs_setup_kmem(void) int devfs_mount(struct mount *mp, __unused vnode_t devvp, __unused user_addr_t data, vfs_context_t ctx) { - struct devfsmount *devfs_mp_p; /* devfs specific mount info */ + struct devfsmount *devfs_mp_p; /* devfs specific mount info */ int error; /*- * If they just want to update, we don't need to do anything. */ - if (mp->mnt_flag & MNT_UPDATE) - { + if (mp->mnt_flag & MNT_UPDATE) { return 0; } @@ -184,17 +191,18 @@ devfs_mount(struct mount *mp, __unused vnode_t devvp, __unused user_addr_t data, */ MALLOC(devfs_mp_p, struct devfsmount *, sizeof(struct devfsmount), - M_DEVFSMNT, M_WAITOK); - if (devfs_mp_p == NULL) - return (ENOMEM); - bzero(devfs_mp_p,sizeof(*devfs_mp_p)); + M_DEVFSMNT, M_WAITOK); + if (devfs_mp_p == NULL) { + return ENOMEM; + } + bzero(devfs_mp_p, sizeof(*devfs_mp_p)); devfs_mp_p->mount = mp; /*- * Fill out some fields */ - mp->mnt_data = (qaddr_t)devfs_mp_p; - mp->mnt_vfsstat.f_fsid.val[0] = (int32_t)(uintptr_t)devfs_mp_p; + __IGNORE_WCASTALIGN(mp->mnt_data = (qaddr_t)devfs_mp_p); + mp->mnt_vfsstat.f_fsid.val[0] = (int32_t)VM_KERNEL_ADDRHASH(devfs_mp_p); mp->mnt_vfsstat.f_fsid.val[1] = vfs_typenum(mp); mp->mnt_flag |= MNT_LOCAL; @@ -204,10 +212,11 @@ devfs_mount(struct mount *mp, __unused vnode_t devvp, __unused user_addr_t data, if (error) { mp->mnt_data = (qaddr_t)0; - FREE((caddr_t)devfs_mp_p, M_DEVFSMNT); - return (error); - } else - DEVFS_INCR_MOUNTS(); + FREE(devfs_mp_p, M_DEVFSMNT); + return error; + } else { + DEVFS_INCR_MOUNTS(); + } /*- * Copy in the name of the directory the filesystem @@ -215,9 +224,9 @@ devfs_mount(struct mount *mp, __unused vnode_t devvp, __unused user_addr_t data, * And we clear the remainder of the character strings * to be tidy. */ - + bzero(mp->mnt_vfsstat.f_mntfromname, MAXPATHLEN); - bcopy("devfs",mp->mnt_vfsstat.f_mntfromname, 5); + bcopy("devfs", mp->mnt_vfsstat.f_mntfromname, 5); (void)devfs_statfs(mp, &mp->mnt_vfsstat, ctx); return 0; @@ -240,14 +249,15 @@ devfs_unmount( struct mount *mp, int mntflags, __unused vfs_context_t ctx) int flags = 0; int force = 0; int error; - + if (mntflags & MNT_FORCE) { flags |= FORCECLOSE; force = 1; } error = vflush(mp, NULLVP, flags); - if (error && !force) + if (error && !force) { return error; + } DEVFS_LOCK(); devfs_free_plane(devfs_mp_p); @@ -255,7 +265,7 @@ devfs_unmount( struct mount *mp, int mntflags, __unused vfs_context_t ctx) DEVFS_DECR_MOUNTS(); - FREE((caddr_t)devfs_mp_p, M_DEVFSMNT); + FREE(devfs_mp_p, M_DEVFSMNT); mp->mnt_data = (qaddr_t)0; mp->mnt_flag &= ~MNT_LOCAL; @@ -286,19 +296,19 @@ devfs_statfs( struct mount *mp, struct vfsstatfs *sbp, __unused vfs_context_t ct * Fill in the stat block. */ //sbp->f_type = mp->mnt_vfsstat.f_type; - sbp->f_flags = 0; /* XXX */ + sbp->f_flags = 0; /* XXX */ sbp->f_bsize = 512; sbp->f_iosize = 512; sbp->f_blocks = (devfs_stats.mounts * sizeof(struct devfsmount) - + devfs_stats.nodes * sizeof(devnode_t) - + devfs_stats.entries * sizeof(devdirent_t) - + devfs_stats.stringspace - ) / sbp->f_bsize; + + devfs_stats.nodes * sizeof(devnode_t) + + devfs_stats.entries * sizeof(devdirent_t) + + devfs_stats.stringspace + ) / sbp->f_bsize; sbp->f_bfree = 0; sbp->f_bavail = 0; sbp->f_files = devfs_stats.nodes; sbp->f_ffree = 0; - sbp->f_fsid.val[0] = (int32_t)(uintptr_t)devfs_mp_p; + sbp->f_fsid.val[0] = (int32_t)VM_KERNEL_ADDRHASH(devfs_mp_p); sbp->f_fsid.val[1] = vfs_typenum(mp); return 0; @@ -313,10 +323,10 @@ devfs_vfs_getattr(__unused mount_t mp, struct vfs_attr *fsap, __unused vfs_conte VFSATTR_RETURN(fsap, f_iosize, 512); if (VFSATTR_IS_ACTIVE(fsap, f_blocks) || VFSATTR_IS_ACTIVE(fsap, f_bused)) { fsap->f_blocks = (devfs_stats.mounts * sizeof(struct devfsmount) - + devfs_stats.nodes * sizeof(devnode_t) - + devfs_stats.entries * sizeof(devdirent_t) - + devfs_stats.stringspace - ) / fsap->f_bsize; + + devfs_stats.nodes * sizeof(devnode_t) + + devfs_stats.entries * sizeof(devdirent_t) + + devfs_stats.stringspace + ) / fsap->f_bsize; fsap->f_bused = fsap->f_blocks; VFSATTR_SET_SUPPORTED(fsap, f_blocks); VFSATTR_SET_SUPPORTED(fsap, f_bused); @@ -326,116 +336,116 @@ devfs_vfs_getattr(__unused mount_t mp, struct vfs_attr *fsap, __unused vfs_conte VFSATTR_RETURN(fsap, f_files, devfs_stats.nodes); VFSATTR_RETURN(fsap, f_ffree, 0); VFSATTR_RETURN(fsap, f_fssubtype, 0); - + if (VFSATTR_IS_ACTIVE(fsap, f_capabilities)) { fsap->f_capabilities.capabilities[VOL_CAPABILITIES_FORMAT] = - VOL_CAP_FMT_SYMBOLICLINKS | - VOL_CAP_FMT_HARDLINKS | - VOL_CAP_FMT_NO_ROOT_TIMES | - VOL_CAP_FMT_CASE_SENSITIVE | - VOL_CAP_FMT_CASE_PRESERVING | - VOL_CAP_FMT_FAST_STATFS | - VOL_CAP_FMT_2TB_FILESIZE | - VOL_CAP_FMT_HIDDEN_FILES; + VOL_CAP_FMT_SYMBOLICLINKS | + VOL_CAP_FMT_HARDLINKS | + VOL_CAP_FMT_NO_ROOT_TIMES | + VOL_CAP_FMT_CASE_SENSITIVE | + VOL_CAP_FMT_CASE_PRESERVING | + VOL_CAP_FMT_FAST_STATFS | + VOL_CAP_FMT_2TB_FILESIZE | + VOL_CAP_FMT_HIDDEN_FILES; fsap->f_capabilities.capabilities[VOL_CAPABILITIES_INTERFACES] = - VOL_CAP_INT_ATTRLIST ; + VOL_CAP_INT_ATTRLIST; fsap->f_capabilities.capabilities[VOL_CAPABILITIES_RESERVED1] = 0; fsap->f_capabilities.capabilities[VOL_CAPABILITIES_RESERVED2] = 0; - + fsap->f_capabilities.valid[VOL_CAPABILITIES_FORMAT] = - VOL_CAP_FMT_PERSISTENTOBJECTIDS | - VOL_CAP_FMT_SYMBOLICLINKS | - VOL_CAP_FMT_HARDLINKS | - VOL_CAP_FMT_JOURNAL | - VOL_CAP_FMT_JOURNAL_ACTIVE | - VOL_CAP_FMT_NO_ROOT_TIMES | - VOL_CAP_FMT_SPARSE_FILES | - VOL_CAP_FMT_ZERO_RUNS | - VOL_CAP_FMT_CASE_SENSITIVE | - VOL_CAP_FMT_CASE_PRESERVING | - VOL_CAP_FMT_FAST_STATFS | - VOL_CAP_FMT_2TB_FILESIZE | - VOL_CAP_FMT_OPENDENYMODES | - VOL_CAP_FMT_HIDDEN_FILES | - VOL_CAP_FMT_PATH_FROM_ID | - VOL_CAP_FMT_NO_VOLUME_SIZES; + VOL_CAP_FMT_PERSISTENTOBJECTIDS | + VOL_CAP_FMT_SYMBOLICLINKS | + VOL_CAP_FMT_HARDLINKS | + VOL_CAP_FMT_JOURNAL | + VOL_CAP_FMT_JOURNAL_ACTIVE | + VOL_CAP_FMT_NO_ROOT_TIMES | + VOL_CAP_FMT_SPARSE_FILES | + VOL_CAP_FMT_ZERO_RUNS | + VOL_CAP_FMT_CASE_SENSITIVE | + VOL_CAP_FMT_CASE_PRESERVING | + VOL_CAP_FMT_FAST_STATFS | + VOL_CAP_FMT_2TB_FILESIZE | + VOL_CAP_FMT_OPENDENYMODES | + VOL_CAP_FMT_HIDDEN_FILES | + VOL_CAP_FMT_PATH_FROM_ID | + VOL_CAP_FMT_NO_VOLUME_SIZES; fsap->f_capabilities.valid[VOL_CAPABILITIES_INTERFACES] = - VOL_CAP_INT_SEARCHFS | - VOL_CAP_INT_ATTRLIST | - VOL_CAP_INT_NFSEXPORT | - VOL_CAP_INT_READDIRATTR | - VOL_CAP_INT_EXCHANGEDATA | - VOL_CAP_INT_COPYFILE | - VOL_CAP_INT_ALLOCATE | - VOL_CAP_INT_VOL_RENAME | - VOL_CAP_INT_ADVLOCK | - VOL_CAP_INT_FLOCK | - VOL_CAP_INT_EXTENDED_SECURITY | - VOL_CAP_INT_USERACCESS | - VOL_CAP_INT_MANLOCK | - VOL_CAP_INT_EXTENDED_ATTR | - VOL_CAP_INT_NAMEDSTREAMS; + VOL_CAP_INT_SEARCHFS | + VOL_CAP_INT_ATTRLIST | + VOL_CAP_INT_NFSEXPORT | + VOL_CAP_INT_READDIRATTR | + VOL_CAP_INT_EXCHANGEDATA | + VOL_CAP_INT_COPYFILE | + VOL_CAP_INT_ALLOCATE | + VOL_CAP_INT_VOL_RENAME | + VOL_CAP_INT_ADVLOCK | + VOL_CAP_INT_FLOCK | + VOL_CAP_INT_EXTENDED_SECURITY | + VOL_CAP_INT_USERACCESS | + VOL_CAP_INT_MANLOCK | + VOL_CAP_INT_EXTENDED_ATTR | + VOL_CAP_INT_NAMEDSTREAMS; fsap->f_capabilities.valid[VOL_CAPABILITIES_RESERVED1] = 0; fsap->f_capabilities.valid[VOL_CAPABILITIES_RESERVED2] = 0; - + VFSATTR_SET_SUPPORTED(fsap, f_capabilities); } - + if (VFSATTR_IS_ACTIVE(fsap, f_attributes)) { fsap->f_attributes.validattr.commonattr = - ATTR_CMN_NAME | ATTR_CMN_DEVID | ATTR_CMN_FSID | - ATTR_CMN_OBJTYPE | ATTR_CMN_OBJTAG | ATTR_CMN_OBJID | - ATTR_CMN_PAROBJID | - ATTR_CMN_MODTIME | ATTR_CMN_CHGTIME | ATTR_CMN_ACCTIME | - ATTR_CMN_OWNERID | ATTR_CMN_GRPID | ATTR_CMN_ACCESSMASK | - ATTR_CMN_FLAGS | ATTR_CMN_USERACCESS | ATTR_CMN_FILEID; + ATTR_CMN_NAME | ATTR_CMN_DEVID | ATTR_CMN_FSID | + ATTR_CMN_OBJTYPE | ATTR_CMN_OBJTAG | ATTR_CMN_OBJID | + ATTR_CMN_PAROBJID | + ATTR_CMN_MODTIME | ATTR_CMN_CHGTIME | ATTR_CMN_ACCTIME | + ATTR_CMN_OWNERID | ATTR_CMN_GRPID | ATTR_CMN_ACCESSMASK | + ATTR_CMN_FLAGS | ATTR_CMN_USERACCESS | ATTR_CMN_FILEID; fsap->f_attributes.validattr.volattr = - ATTR_VOL_FSTYPE | ATTR_VOL_SIZE | ATTR_VOL_SPACEFREE | - ATTR_VOL_SPACEAVAIL | ATTR_VOL_MINALLOCATION | - ATTR_VOL_OBJCOUNT | ATTR_VOL_MAXOBJCOUNT | - ATTR_VOL_MOUNTPOINT | ATTR_VOL_MOUNTFLAGS | - ATTR_VOL_MOUNTEDDEVICE | ATTR_VOL_CAPABILITIES | - ATTR_VOL_ATTRIBUTES; + ATTR_VOL_FSTYPE | ATTR_VOL_SIZE | ATTR_VOL_SPACEFREE | + ATTR_VOL_SPACEAVAIL | ATTR_VOL_MINALLOCATION | + ATTR_VOL_OBJCOUNT | ATTR_VOL_MAXOBJCOUNT | + ATTR_VOL_MOUNTPOINT | ATTR_VOL_MOUNTFLAGS | + ATTR_VOL_MOUNTEDDEVICE | ATTR_VOL_CAPABILITIES | + ATTR_VOL_ATTRIBUTES; fsap->f_attributes.validattr.dirattr = - ATTR_DIR_LINKCOUNT | ATTR_DIR_MOUNTSTATUS; + ATTR_DIR_LINKCOUNT | ATTR_DIR_MOUNTSTATUS; fsap->f_attributes.validattr.fileattr = - ATTR_FILE_LINKCOUNT | ATTR_FILE_TOTALSIZE | - ATTR_FILE_IOBLOCKSIZE | ATTR_FILE_DEVTYPE | - ATTR_FILE_DATALENGTH; + ATTR_FILE_LINKCOUNT | ATTR_FILE_TOTALSIZE | + ATTR_FILE_IOBLOCKSIZE | ATTR_FILE_DEVTYPE | + ATTR_FILE_DATALENGTH; fsap->f_attributes.validattr.forkattr = 0; - + fsap->f_attributes.nativeattr.commonattr = - ATTR_CMN_NAME | ATTR_CMN_DEVID | ATTR_CMN_FSID | - ATTR_CMN_OBJTYPE | ATTR_CMN_OBJTAG | ATTR_CMN_OBJID | - ATTR_CMN_PAROBJID | - ATTR_CMN_MODTIME | ATTR_CMN_CHGTIME | ATTR_CMN_ACCTIME | - ATTR_CMN_OWNERID | ATTR_CMN_GRPID | ATTR_CMN_ACCESSMASK | - ATTR_CMN_FLAGS | ATTR_CMN_USERACCESS | ATTR_CMN_FILEID; + ATTR_CMN_NAME | ATTR_CMN_DEVID | ATTR_CMN_FSID | + ATTR_CMN_OBJTYPE | ATTR_CMN_OBJTAG | ATTR_CMN_OBJID | + ATTR_CMN_PAROBJID | + ATTR_CMN_MODTIME | ATTR_CMN_CHGTIME | ATTR_CMN_ACCTIME | + ATTR_CMN_OWNERID | ATTR_CMN_GRPID | ATTR_CMN_ACCESSMASK | + ATTR_CMN_FLAGS | ATTR_CMN_USERACCESS | ATTR_CMN_FILEID; fsap->f_attributes.nativeattr.volattr = - ATTR_VOL_FSTYPE | ATTR_VOL_SIZE | ATTR_VOL_SPACEFREE | - ATTR_VOL_SPACEAVAIL | ATTR_VOL_MINALLOCATION | - ATTR_VOL_OBJCOUNT | ATTR_VOL_MAXOBJCOUNT | - ATTR_VOL_MOUNTPOINT | ATTR_VOL_MOUNTFLAGS | - ATTR_VOL_MOUNTEDDEVICE | ATTR_VOL_CAPABILITIES | - ATTR_VOL_ATTRIBUTES; + ATTR_VOL_FSTYPE | ATTR_VOL_SIZE | ATTR_VOL_SPACEFREE | + ATTR_VOL_SPACEAVAIL | ATTR_VOL_MINALLOCATION | + ATTR_VOL_OBJCOUNT | ATTR_VOL_MAXOBJCOUNT | + ATTR_VOL_MOUNTPOINT | ATTR_VOL_MOUNTFLAGS | + ATTR_VOL_MOUNTEDDEVICE | ATTR_VOL_CAPABILITIES | + ATTR_VOL_ATTRIBUTES; fsap->f_attributes.nativeattr.dirattr = - ATTR_DIR_MOUNTSTATUS; + ATTR_DIR_MOUNTSTATUS; fsap->f_attributes.nativeattr.fileattr = - ATTR_FILE_LINKCOUNT | ATTR_FILE_TOTALSIZE | - ATTR_FILE_IOBLOCKSIZE | ATTR_FILE_DEVTYPE | - ATTR_FILE_DATALENGTH; + ATTR_FILE_LINKCOUNT | ATTR_FILE_TOTALSIZE | + ATTR_FILE_IOBLOCKSIZE | ATTR_FILE_DEVTYPE | + ATTR_FILE_DATALENGTH; fsap->f_attributes.nativeattr.forkattr = 0; VFSATTR_SET_SUPPORTED(fsap, f_attributes); } - + return 0; } static int devfs_sync(__unused struct mount *mp, __unused int waitfor, __unused vfs_context_t ctx) { - return (0); + return 0; } @@ -451,24 +461,24 @@ devfs_vget(__unused struct mount *mp, __unused ino64_t ino, __unused struct vnod */ static int -devfs_fhtovp (__unused struct mount *mp, __unused int fhlen, __unused unsigned char *fhp, __unused struct vnode **vpp, __unused vfs_context_t ctx) +devfs_fhtovp(__unused struct mount *mp, __unused int fhlen, __unused unsigned char *fhp, __unused struct vnode **vpp, __unused vfs_context_t ctx) { - return (EINVAL); + return EINVAL; } static int -devfs_vptofh (__unused struct vnode *vp, __unused int *fhlenp, __unused unsigned char *fhp, __unused vfs_context_t ctx) +devfs_vptofh(__unused struct vnode *vp, __unused int *fhlenp, __unused unsigned char *fhp, __unused vfs_context_t ctx) { - return (EINVAL); + return EINVAL; } static int -devfs_sysctl(__unused int *name, __unused u_int namelen, __unused user_addr_t oldp, - __unused size_t *oldlenp, __unused user_addr_t newp, - __unused size_t newlen, __unused vfs_context_t ctx) +devfs_sysctl(__unused int *name, __unused u_int namelen, __unused user_addr_t oldp, + __unused size_t *oldlenp, __unused user_addr_t newp, + __unused size_t newlen, __unused vfs_context_t ctx) { - return (ENOTSUP); + return ENOTSUP; } #include @@ -481,125 +491,30 @@ devfs_sysctl(__unused int *name, __unused u_int namelen, __unused user_addr_t ol int devfs_kernel_mount(char * mntname) { - struct mount *mp; int error; - struct nameidata nd; - struct vnode * vp; vfs_context_t ctx = vfs_context_kernel(); - struct vfstable *vfsp; - - /* Find our vfstable entry */ - for (vfsp = vfsconf; vfsp; vfsp = vfsp->vfc_next) - if (!strncmp(vfsp->vfc_name, "devfs", sizeof(vfsp->vfc_name))) - break; - - if (!vfsp) { - panic("Could not find entry in vfsconf for devfs.\n"); - } - - /* - * Get vnode to be covered - */ - NDINIT(&nd, LOOKUP, OP_MOUNT, FOLLOW | LOCKLEAF, UIO_SYSSPACE, - CAST_USER_ADDR_T(mntname), ctx); - if ((error = namei(&nd))) { - printf("devfs_kernel_mount: failed to find directory '%s', %d", - mntname, error); - return (error); - } - nameidone(&nd); - vp = nd.ni_vp; - - if ((error = VNOP_FSYNC(vp, MNT_WAIT, ctx))) { - printf("devfs_kernel_mount: vnop_fsync failed: %d\n", error); - vnode_put(vp); - return (error); - } - if ((error = buf_invalidateblks(vp, BUF_WRITE_DATA, 0, 0))) { - printf("devfs_kernel_mount: buf_invalidateblks failed: %d\n", error); - vnode_put(vp); - return (error); - } - if (vnode_isdir(vp) == 0) { - printf("devfs_kernel_mount: '%s' is not a directory\n", mntname); - vnode_put(vp); - return (ENOTDIR); - } - if ((vnode_mountedhere(vp))) { - vnode_put(vp); - return (EBUSY); - } - - /* - * Allocate and initialize the filesystem. - */ - MALLOC_ZONE(mp, struct mount *, sizeof(struct mount), - M_MOUNT, M_WAITOK); - bzero((char *)mp, sizeof(struct mount)); - - /* Initialize the default IO constraints */ - mp->mnt_maxreadcnt = mp->mnt_maxwritecnt = MAXPHYS; - mp->mnt_segreadcnt = mp->mnt_segwritecnt = 32; - mp->mnt_ioflags = 0; - mp->mnt_realrootvp = NULLVP; - mp->mnt_authcache_ttl = CACHED_LOOKUP_RIGHT_TTL; - - mount_lock_init(mp); - TAILQ_INIT(&mp->mnt_vnodelist); - TAILQ_INIT(&mp->mnt_workerqueue); - TAILQ_INIT(&mp->mnt_newvnodes); - - (void)vfs_busy(mp, LK_NOWAIT); - mp->mnt_op = &devfs_vfsops; - mp->mnt_vtable = vfsp; - mp->mnt_flag = 0; - mp->mnt_flag |= vfsp->vfc_flags & MNT_VISFLAGMASK; - strlcpy(mp->mnt_vfsstat.f_fstypename, vfsp->vfc_name, MFSTYPENAMELEN); - vp->v_mountedhere = mp; - mp->mnt_vnodecovered = vp; - mp->mnt_vfsstat.f_owner = kauth_cred_getuid(kauth_cred_get()); - (void) copystr(mntname, mp->mnt_vfsstat.f_mntonname, MAXPATHLEN - 1, 0); -#if CONFIG_MACF - mac_mount_label_init(mp); - mac_mount_label_associate(ctx, mp); -#endif - - error = devfs_mount(mp, NULL, USER_ADDR_NULL, ctx); + char fsname[] = "devfs"; + error = kernel_mount(fsname, NULLVP, NULLVP, mntname, NULL, 0, MNT_DONTBROWSE, KERNEL_MOUNT_NOAUTH, ctx); if (error) { - printf("devfs_kernel_mount: mount %s failed: %d", mntname, error); - mp->mnt_vtable->vfc_refcount--; - - vfs_unbusy(mp); - - mount_lock_destroy(mp); -#if CONFIG_MACF - mac_mount_label_destroy(mp); -#endif - FREE_ZONE(mp, sizeof (struct mount), M_MOUNT); - vnode_put(vp); - return (error); + printf("devfs_kernel_mount: kernel_mount failed: %d\n", error); + return error; } - vnode_ref(vp); - vnode_put(vp); - vfs_unbusy(mp); - mount_list_add(mp); - return (0); + + return 0; } -struct vfsops devfs_vfsops = { - devfs_mount, - devfs_start, - devfs_unmount, - devfs_root, - NULL, /* quotactl */ - devfs_vfs_getattr, - devfs_sync, - devfs_vget, - devfs_fhtovp, - devfs_vptofh, - devfs_init, - devfs_sysctl, - NULL, - {NULL} +const struct vfsops devfs_vfsops = { + .vfs_mount = devfs_mount, + .vfs_start = devfs_start, + .vfs_unmount = devfs_unmount, + .vfs_root = devfs_root, + .vfs_getattr = devfs_vfs_getattr, + .vfs_sync = devfs_sync, + .vfs_vget = devfs_vget, + .vfs_fhtovp = devfs_fhtovp, + .vfs_vptofh = devfs_vptofh, + .vfs_init = devfs_init, + .vfs_sysctl = devfs_sysctl, + // There are other VFS ops that we do not support };