vfs_mount.c revision 31403
1/* 2 * Copyright (c) 1989, 1993, 1995 3 * The Regents of the University of California. All rights reserved. 4 * Copyright (c) 1995 Artisoft, Inc. All Rights Reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by the University of 17 * California, Berkeley and its contributors. 18 * 4. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * @(#)vfs_conf.c 8.8 (Berkeley) 3/31/94 35 * $Id: vfs_conf.c,v 1.17 1997/11/07 08:53:10 phk Exp $ 36 */ 37 38/* 39 * PURPOSE: This file abstracts the root mounting interface from 40 * the per file system semantics for handling mounts, 41 * the overall intent of which is to move the BSD 42 * internals dependence out of the FS code, both to 43 * make the FS code more portable and to free up some 44 * of the BSD internals so that they may more easily 45 * be changed. 46 * 47 * NOTE1: Code is single entry/single exit to aid debugging 48 * and conversion for kernel multithreading. 49 * 50 * NOTE2: Code notes lock state in headers on entry and exit 51 * as an aid to conversion for kernel multithreading 52 * on SMP reentrancy 53 */ 54#include <sys/param.h> /* dev_t (types.h)*/ 55#include <sys/kernel.h> 56#include <sys/systm.h> /* rootvp*/ 57#include <sys/proc.h> /* curproc*/ 58#include <sys/vnode.h> /* NULLVP*/ 59#include <sys/mount.h> /* struct mount*/ 60#include <sys/malloc.h> /* M_MOUNT*/ 61 62/* 63 * GLOBALS 64 */ 65 66MALLOC_DEFINE(M_MOUNT, "mount", "vfs mount struct"); 67 68/* 69 * These define the root filesystem, device, and root filesystem type. 70 */ 71struct mount *rootfs; 72struct vnode *rootvnode; 73char *mountrootfsname; 74 75/* 76 * vfs_init() will set maxvfsconf 77 * to the highest defined type number. 78 */ 79int maxvfsconf; 80struct vfsconf *vfsconf; 81 82/* 83 * Common root mount code shared by all filesystems 84 */ 85#define ROOTNAME "root_device" 86 87/* 88 * vfs_mountrootfs 89 * 90 * Common entry point for root mounts 91 * 92 * PARAMETERS: 93 * fsname name of the filesystem 94 * 95 * RETURNS: 0 Success 96 * !0 error number (errno.h) 97 * 98 * LOCK STATE: 99 * ENTRY 100 * <no locks held> 101 * EXIT 102 * <no locks held> 103 * 104 * NOTES: 105 * This code is currently supported only for use for 106 * the FFS file system type. This is a matter of 107 * fixing the other file systems, not this code! 108 */ 109static int 110vfs_mountrootfs(fsname) 111 char *fsname; 112{ 113 struct mount *mp; 114 int err = 0; 115 struct proc *p = curproc; /* XXX */ 116 117 /* 118 * New root mount structure 119 */ 120 err = vfs_rootmountalloc(fsname, ROOTNAME, &mp); 121 if (err) 122 return (err); 123 mp->mnt_flag |= MNT_ROOTFS; 124 125 /* 126 * Attempt the mount 127 */ 128 err = VFS_MOUNT(mp, NULL, NULL, NULL, p); 129 if (err) 130 goto error_2; 131 132 simple_lock(&mountlist_slock); 133 /* Add fs to list of mounted file systems*/ 134 CIRCLEQ_INSERT_HEAD(&mountlist, mp, mnt_list); 135 simple_unlock(&mountlist_slock); 136 137 vfs_unbusy(mp, p); 138 139 /* root mount, update system time from FS specific data*/ 140 inittodr(mp->mnt_time); 141 142 goto success; 143 144 145error_2: /* mount error*/ 146 147 vfs_unbusy(mp, p); 148 149 /* free mount struct before failing*/ 150 free( mp, M_MOUNT); 151 152success: 153 return( err); 154} 155 156/* ARGSUSED*/ 157static void xxx_vfs_mountroot __P((void *fsnamep)); 158#ifdef BOOTP 159extern void bootpc_init __P((void)); 160#endif 161static void 162xxx_vfs_mountroot(fsnamep) 163 void *fsnamep; 164{ 165 /* XXX Add a separate SYSINIT entry */ 166#ifdef BOOTP 167 bootpc_init(); 168#endif 169 /* Mount the root file system. */ 170 if (vfs_mountrootfs(*((char **) fsnamep))) 171 panic("cannot mount root"); 172} 173SYSINIT(mountroot, SI_SUB_MOUNT_ROOT, SI_ORDER_FIRST, xxx_vfs_mountroot, 174 &mountrootfsname) 175 176