mdconfig revision 208307
1289284Srpaulo#!/bin/sh
2289284Srpaulo#
3289284Srpaulo# Copyright (c) 2006  The FreeBSD Project
4289284Srpaulo# All rights reserved.
5289284Srpaulo#
6289284Srpaulo# Redistribution and use in source and binary forms, with or without
7289284Srpaulo# modification, are permitted provided that the following conditions
8289284Srpaulo# are met:
9289284Srpaulo# 1. Redistributions of source code must retain the above copyright
10289284Srpaulo#    notice, this list of conditions and the following disclaimer.
11289284Srpaulo# 2. Redistributions in binary form must reproduce the above copyright
12289284Srpaulo#    notice, this list of conditions and the following disclaimer in the
13289284Srpaulo#    documentation and/or other materials provided with the distribution.
14289284Srpaulo#
15289284Srpaulo# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16289284Srpaulo# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17289284Srpaulo# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18337817Scy# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19289284Srpaulo# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20289284Srpaulo# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21289284Srpaulo# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22289284Srpaulo# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23289284Srpaulo# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24289284Srpaulo# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25289284Srpaulo# SUCH DAMAGE.
26289284Srpaulo#
27289284Srpaulo# $FreeBSD: head/etc/rc.d/mdconfig 208307 2010-05-19 19:03:19Z dougb $
28289284Srpaulo#
29289284Srpaulo
30289284Srpaulo# PROVIDE: mdconfig
31289284Srpaulo# REQUIRE: localswap root
32289284Srpaulo
33289284Srpaulo. /etc/rc.subr
34289284Srpaulo
35289284Srpauloname="mdconfig"
36289284Srpaulostop_cmd="mdconfig_stop"
37289284Srpaulostart_cmd="mdconfig_start"
38289284Srpaulostart_precmd='[ -n "${_mdconfig_list}" ]'
39289284Srpaulorequired_modules="geom_md:g_md"
40289284Srpaulo
41289284Srpaulois_readonly()
42289284Srpaulo{
43289284Srpaulo	local _mp _ret
44289284Srpaulo
45289284Srpaulo	_mp=$1
46289284Srpaulo	_ret=`mount | while read _line; do
47289284Srpaulo		case ${_line} in
48289284Srpaulo		*" ${_mp} "*read-only*)
49289284Srpaulo			echo "yes"
50289284Srpaulo			;;
51289284Srpaulo
52289284Srpaulo		*)
53289284Srpaulo			;;
54289284Srpaulo		esac;
55289284Srpaulo	done`
56289284Srpaulo
57289284Srpaulo	if [ -n "${_ret}" ]; then
58289284Srpaulo		return 0
59289284Srpaulo	else
60289284Srpaulo		return 1
61289284Srpaulo	fi
62289284Srpaulo}
63289284Srpaulo
64289284Srpauloinit_variables()
65289284Srpaulo{
66289284Srpaulo	local _i
67289284Srpaulo
68289284Srpaulo	_fs=""
69289284Srpaulo	_mp=""
70289284Srpaulo	_dev="/dev/${_md}"
71289284Srpaulo	eval _config=\$mdconfig_${_md}
72289284Srpaulo	eval _newfs=\$mdconfig_${_md}_newfs
73289284Srpaulo
74289284Srpaulo	_type=${_config##*-t\ }
75289284Srpaulo	_type=${_type%%\ *}
76289284Srpaulo	if [ -z "${_type}" ]; then
77289284Srpaulo		err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
78289284Srpaulo	fi
79289284Srpaulo
80289284Srpaulo	if [ "${_type}" = "vnode" ]; then
81289284Srpaulo		_file=${_config##*-f\ }
82289284Srpaulo		_file=${_file%%\ *}
83289284Srpaulo		if [ -z "${_file}" ]; then
84289284Srpaulo			err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
85289284Srpaulo		fi
86289284Srpaulo		if [ "${_file}" != "${_file%.uzip}" ]; then
87289284Srpaulo			_dev="/dev/${_md}.uzip"
88289284Srpaulo		fi
89289284Srpaulo		for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
90289284Srpaulo	fi
91289284Srpaulo
92289284Srpaulo	# Debugging help.
93289284Srpaulo	debug "${_md} config: ${_config}"
94289284Srpaulo	debug "${_md} type: ${_type}"
95289284Srpaulo	debug "${_md} dev: ${_dev}"
96289284Srpaulo	debug "${_md} file: ${_file}"
97289284Srpaulo	debug "${_md} fs: ${_fs}"
98289284Srpaulo	debug "${_md} newfs flags: ${_newfs}"
99289284Srpaulo}
100289284Srpaulo
101289284Srpaulomdconfig_start()
102289284Srpaulo{
103289284Srpaulo	local _md _mp _config _type _dev _file _fs _newfs _fsck_cmd
104289284Srpaulo
105289284Srpaulo	for _md in ${_mdconfig_list}; do
106289284Srpaulo		init_variables ${_md}
107289284Srpaulo		# Create md(4) devices of types swap, malloc and vnode if the
108289284Srpaulo		# file is on the root partition.
109289284Srpaulo		if [ "${_type}" != "vnode" -o "${_fs}" = "/" ]; then
110337817Scy			if [ "${_type}" = "vnode" ]; then
111289284Srpaulo				if is_readonly ${_fs}; then
112289284Srpaulo					warn "${_fs} is mounted read-only, skipping ${_md}."
113289284Srpaulo					continue
114289284Srpaulo				fi
115289284Srpaulo				if [ "${_file}" != "${_file%.uzip}" ]; then
116289284Srpaulo					load_kld -m g_uzip geom_uzip || return 3
117289284Srpaulo					# sleep a bit to allow creation of /dev/mdX.uzip
118289284Srpaulo					sleep 2
119289284Srpaulo				fi
120337817Scy			fi
121337817Scy			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
122337817Scy				err 3 "${_md} already exists"
123289284Srpaulo			fi
124289284Srpaulo			echo "Creating ${_md} device (${_type})."
125289284Srpaulo			if ! mdconfig -a ${_config} -u ${_md}; then
126289284Srpaulo				echo "Creating ${_md} device failed, moving on."
127289284Srpaulo				continue
128289284Srpaulo			fi
129289284Srpaulo			# Skip fsck for uzip devices.
130337817Scy			if [ "${_type}" = "vnode" ]; then
131289284Srpaulo				if [ "${_file}" != "${_file%.uzip}" ]; then
132289284Srpaulo					_fsck_cmd=":"
133289284Srpaulo				elif checkyesno background_fsck; then
134289284Srpaulo					_fsck_cmd="fsck -F"
135289284Srpaulo				else
136289284Srpaulo					_fsck_cmd="fsck"
137289284Srpaulo				fi
138289284Srpaulo				if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
139289284Srpaulo					echo "Fsck failed on ${_dev}, not mounting the filesystem."
140289284Srpaulo					continue
141289284Srpaulo
142289284Srpaulo				fi
143289284Srpaulo			else
144289284Srpaulo				newfs ${_newfs} ${_dev} >/dev/null
145289284Srpaulo			fi
146289284Srpaulo			if mount -d ${_dev} 2>&1 >/dev/null; then
147289284Srpaulo				echo "Mounting ${_dev}."
148289284Srpaulo				mount ${_dev}
149289284Srpaulo			fi
150289284Srpaulo		fi
151289284Srpaulo	done
152289284Srpaulo}
153289284Srpaulo
154289284Srpaulomdconfig_stop()
155289284Srpaulo{
156289284Srpaulo	local _md _mp _config _type _dev _file _fs _newfs _i
157289284Srpaulo
158289284Srpaulo	for _md in ${_mdconfig_list}; do
159289284Srpaulo		init_variables ${_md}
160289284Srpaulo		if [ "${_type}" != "vnode" -o "${_fs}" = "/" ]; then
161289284Srpaulo			for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
162289284Srpaulo			if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
163289284Srpaulo				echo "Device ${_dev} isn't mounted."
164289284Srpaulo			else
165289284Srpaulo				echo "Umounting ${_dev}."
166289284Srpaulo				umount ${_dev}
167289284Srpaulo			fi
168289284Srpaulo			if mdconfig -l -u ${_md} >/dev/null 2>&1; then
169337817Scy				echo "Destroying ${_md}."
170289284Srpaulo				mdconfig -d -u ${_md}
171289284Srpaulo			fi
172289284Srpaulo		fi
173289284Srpaulo	done
174289284Srpaulo}
175289284Srpaulo
176289284Srpaulo_mdconfig_cmd="$1"
177289284Srpauloif [ $# -gt 0 ]; then
178289284Srpaulo        shift
179289284Srpaulofi
180289284Srpaulo[ -n "$*" ] && _mdconfig_list="$*"
181289284Srpaulo
182289284Srpauloload_rc_config $name
183289284Srpaulo
184289284Srpaulo_mdconfig_unit=0
185289284Srpauloif [ -z "${_mdconfig_list}" ]; then
186289284Srpaulo	while :; do
187289284Srpaulo		eval _mdconfig_config=\$mdconfig_md${_mdconfig_unit}
188289284Srpaulo		if [ -z "${_mdconfig_config}" ]; then
189289284Srpaulo			break
190289284Srpaulo		else
191289284Srpaulo			_mdconfig_list="${_mdconfig_list}${_mdconfig_list:+ }md${_mdconfig_unit}"
192289284Srpaulo			_mdconfig_unit=$((${_mdconfig_unit} + 1))
193289284Srpaulo		fi
194289284Srpaulo	done
195289284Srpaulofi
196289284Srpaulo
197289284Srpaulorun_rc_command "${_mdconfig_cmd}"
198289284Srpaulo