vfs_mount.c revision 30354
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.14 1997/02/22 09:39:32 peter 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/systm.h>		/* rootvp*/
56#include <sys/proc.h>		/* curproc*/
57#include <sys/vnode.h>		/* NULLVP*/
58#include <sys/mount.h>		/* struct mount*/
59#include <sys/malloc.h>		/* M_MOUNT*/
60
61/*
62 * GLOBALS
63 */
64
65MALLOC_DEFINE(M_MOUNT, "mount", "vfs mount struct");
66
67/*
68 *  These define the root filesystem, device, and root filesystem type.
69 */
70struct mount *rootfs;
71struct vnode *rootvnode;
72char *mountrootfsname;
73
74/*
75 * vfs_init() will set maxvfsconf
76 * to the highest defined type number.
77 */
78int maxvfsconf;
79struct vfsconf *vfsconf;
80
81/*
82 * Common root mount code shared by all filesystems
83 */
84#define ROOTNAME	"root_device"
85
86/*
87 * vfs_mountrootfs
88 *
89 * Common entry point for root mounts
90 *
91 * PARAMETERS:
92 *		fsname	name of the filesystem
93 *
94 * RETURNS:	0	Success
95 *		!0	error number (errno.h)
96 *
97 * LOCK STATE:
98 *		ENTRY
99 *			<no locks held>
100 *		EXIT
101 *			<no locks held>
102 *
103 * NOTES:
104 *		This code is currently supported only for use for
105 *		the FFS file system type.  This is a matter of
106 *		fixing the other file systems, not this code!
107 */
108int
109vfs_mountrootfs(fsname)
110	char			*fsname;
111{
112	struct mount		*mp;
113	int			err = 0;
114	struct proc		*p = curproc;	/* XXX */
115
116	/*
117	 *  New root mount structure
118	 */
119	err = vfs_rootmountalloc(fsname, ROOTNAME, &mp);
120	if (err)
121		return (err);
122	mp->mnt_flag		|= MNT_ROOTFS;
123
124	/*
125	 * Attempt the mount
126	 */
127	err = VFS_MOUNT(mp, NULL, NULL, NULL, p);
128	if (err)
129		goto error_2;
130
131	simple_lock(&mountlist_slock);
132	/* Add fs to list of mounted file systems*/
133	CIRCLEQ_INSERT_TAIL(&mountlist, mp, mnt_list);
134	simple_unlock(&mountlist_slock);
135
136	vfs_unbusy(mp, p);
137
138	/* root mount, update system time from FS specific data*/
139	inittodr(mp->mnt_time);
140
141	goto success;
142
143
144error_2:	/* mount error*/
145
146	vfs_unbusy(mp, p);
147
148error_1:	/* lock error*/
149
150	/* free mount struct before failing*/
151	free( mp, M_MOUNT);
152
153success:
154	return( err);
155}
156