178344Sobrien#!/bin/sh
278344Sobrien#
398184Sgordon# $FreeBSD: stable/11/etc/rc.d/fsck 331216 2018-03-19 17:37:51Z dab $
478344Sobrien#
578344Sobrien
678344Sobrien# PROVIDE: fsck
7252310Shrs# REQUIRE: swap
8136224Smtm# KEYWORD: nojail
978344Sobrien
1078344Sobrien. /etc/rc.subr
1178344Sobrien
1278344Sobrienname="fsck"
13298514Slmedesc="Run file system checks"
1478344Sobrienstart_cmd="fsck_start"
1578344Sobrienstop_cmd=":"
1678344Sobrien
1778344Sobrienfsck_start()
1878344Sobrien{
1998184Sgordon	if [ "$autoboot" = no ]; then
2078344Sobrien		echo "Fast boot: skipping disk checks."
21126862Skientzle	elif [ ! -r /etc/fstab ]; then
22126862Skientzle		echo "Warning! No /etc/fstab: skipping disk checks."
2378344Sobrien	elif [ "$autoboot" = yes ]; then
24289186Svangyzen		# During fsck ignore SIGQUIT
2578344Sobrien		trap : 3
2678344Sobrien
27197947Sdougb		check_startmsgs && echo "Starting file system checks:"
28124618Smtm		if checkyesno background_fsck; then
29124618Smtm			fsck -F -p
30124618Smtm		else
3198184Sgordon			fsck -p
32124618Smtm		fi
3398184Sgordon
34299349Strasz		err=$?
35299349Strasz		if [ ${err} -eq 3 ]; then
36299349Strasz			echo "Warning! Some of the devices might not be" \
37299349Strasz			    "available; retrying"
38299349Strasz			root_hold_wait
39299349Strasz			check_startmsgs && echo "Restarting file system checks:"
40299349Strasz			if checkyesno background_fsck; then
41299349Strasz				fsck -F -p
42299349Strasz			else
43299349Strasz				fsck -p
44299349Strasz			fi
45299349Strasz			err=$?
46299349Strasz		fi
47299349Strasz
48299349Strasz		case ${err} in
4978344Sobrien		0)
5078344Sobrien			;;
5178344Sobrien		2)
5278344Sobrien			stop_boot
5378344Sobrien			;;
5478344Sobrien		4)
5578344Sobrien			echo "Rebooting..."
5678344Sobrien			reboot
5778344Sobrien			echo "Reboot failed; help!"
5878344Sobrien			stop_boot
5978344Sobrien			;;
60331216Sdab		8|16)
6198184Sgordon			if checkyesno fsck_y_enable; then
62193944Savg				echo "File system preen failed, trying fsck -y ${fsck_y_flags}"
63193944Savg				fsck -y ${fsck_y_flags}
6498184Sgordon				case $? in
6598184Sgordon				0)
6698184Sgordon					;;
6798184Sgordon				*)
6898184Sgordon				echo "Automatic file system check failed; help!"
6998184Sgordon					stop_boot
7098184Sgordon					;;
7198184Sgordon				esac
7298184Sgordon			else
7398184Sgordon				echo "Automatic file system check failed; help!"
7498184Sgordon				stop_boot
7598184Sgordon			fi
7698184Sgordon			;;
7778344Sobrien		12)
7878344Sobrien			echo "Boot interrupted."
7978344Sobrien			stop_boot
8078344Sobrien			;;
8178344Sobrien		130)
8278344Sobrien			stop_boot
8378344Sobrien			;;
8478344Sobrien		*)
85299349Strasz			echo "Unknown error ${err}; help!"
8678344Sobrien			stop_boot
8778344Sobrien			;;
8878344Sobrien		esac
8978344Sobrien	fi
9078344Sobrien}
9178344Sobrien
9278344Sobrienload_rc_config $name
9378344Sobrienrun_rc_command "$1"
94