diff options
Diffstat (limited to 'init.d/checkfs')
| -rwxr-xr-x | init.d/checkfs | 77 | 
1 files changed, 77 insertions, 0 deletions
| diff --git a/init.d/checkfs b/init.d/checkfs new file mode 100755 index 00000000..2f9ead02 --- /dev/null +++ b/init.d/checkfs @@ -0,0 +1,77 @@ +#!/sbin/runscript +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +depend() { +	need checkroot +	use volumes +	after modules +} + +do_checkfs() { +	local retval=0 + +	ebegin "Checking all filesystems" +	if [ "${RC_UNAME}" = "Linux" ] ; then +		if get_bootparam "forcefsck" ; then +			ewarn "A full fsck has been forced" +			fsck -C0 -T -R -A -a -f +		else +			fsck -C0 -T -R -A -a +		fi +		retval=$? +	else +		local parts="$(fstabinfo --passno ">1")" +		if [ -n "${parts}" ] ; then +			fsck -p ${parts} +			retval=$? +		fi +	fi +	if [ ${retval} -eq 0 ] ; then +		eend 0 +	elif [ ${retval} -eq 1 ] ; then +		ewend 1 "Filesystem errors corrected." +		retval=0 +	elif [ ${retval} -eq 2 ] ; then +		ewend 1 "System should be rebooted" +	elif [ ${retval} -eq 8 ] ; then +		ewend 1 "Operational error, continuing" +		retval=0 +	else +		if [ "${RC_FORCE_AUTO}" = "yes" ] ; then +			eend 2 "Fsck could not correct all errors, rerunning" +			if [ "${RC_UNAME}" = "Linux" ] ; then +				fsck -C0 -T -R -A -y +			else +				fsck -y +			fi +			retval=$? +			eend $? +		fi + +		if [ ${retval} -gt 3 ] ; then +			eend 2 "Fsck could not correct all errors, manual repair needed" +			if [ "${RC_SYS}" = "VPS" ] ; then +				halt -f +			elif [ -x /sbin/sulogin ] ; then +				sulogin "${CONSOLE}" +			else +				return 1 +			fi +		fi +	fi +	 +	return ${retval} +} + +start() { +	do_checkfs +} + +stop() { +	# fsck on shutdown if we need to +	[ "${FSCK_SHUTDOWN}" = "yes" -a ! -f /forcefsck ] && do_checkfs +	return 0 +} + +# vim: set ts=4 : | 
