xref: /freebsd/sys/contrib/openzfs/cmd/fsck.zfs.in (revision 7ef62cebc2f965b0f640263e179276928885e33d)
1#!/bin/sh
2#
3# fsck.zfs: A fsck helper to accommodate distributions that expect
4# to be able to execute a fsck on all filesystem types.
5#
6# This script simply bubbles up some already-known-about errors,
7# see fsck.zfs(8)
8#
9
10if [ $# -eq 0 ]; then
11	echo "Usage: $0 [options] dataset…" >&2
12	exit 16
13fi
14
15ret=0
16for dataset; do
17	case "$dataset" in
18		-*)
19			continue
20			;;
21		*)
22			;;
23	esac
24
25	pool="${dataset%%/*}"
26
27	case "$(@sbindir@/zpool list -Ho health "$pool")" in
28		DEGRADED)
29			ret=$(( ret | 4 ))
30			;;
31		FAULTED)
32			awk '!/^([[:space:]]*#.*)?$/ && $1 == "'"$dataset"'" && $3 == "zfs" {exit 1}' /etc/fstab || \
33				ret=$(( ret | 8 ))
34			;;
35		"")
36			# Pool not found, error printed by zpool(8)
37			ret=$(( ret | 8 ))
38			;;
39		*)
40			;;
41	esac
42done
43
44exit "$ret"
45