fsck.zfs: implement 4/8 exit codes as suggested in manpage

Update the fsck.zfs helper to bubble up some already-known-about 
errors if they are detected in the pool.

health=degraded => 4/"Filesystem errors left uncorrected"
health=faulted && dataset in /etc/fstab => 8/"Operational error"
pool not found => 8/"Operational error"
everything else => 0

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Closes #11806
This commit is contained in:
наб 2021-03-31 19:49:56 +02:00 committed by Brian Behlendorf
parent bfdd001679
commit dc52c0d725
5 changed files with 64 additions and 20 deletions

1
cmd/fsck_zfs/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/fsck.zfs

View File

@ -1 +1,5 @@
include $(top_srcdir)/config/Substfiles.am
dist_sbin_SCRIPTS = fsck.zfs dist_sbin_SCRIPTS = fsck.zfs
SUBSTFILES += $(dist_sbin_SCRIPTS)

View File

@ -1,9 +0,0 @@
#!/bin/sh
#
# fsck.zfs: A fsck helper to accommodate distributions that expect
# to be able to execute a fsck on all filesystem types. Currently
# this script does nothing but it could be extended to act as a
# compatibility wrapper for 'zpool scrub'.
#
exit 0

44
cmd/fsck_zfs/fsck.zfs.in Executable file
View File

@ -0,0 +1,44 @@
#!/bin/sh
#
# fsck.zfs: A fsck helper to accommodate distributions that expect
# to be able to execute a fsck on all filesystem types.
#
# This script simply bubbles up some already-known-about errors,
# see fsck.zfs(8)
#
if [ "$#" = "0" ]; then
echo "Usage: $0 [options] dataset…" >&2
exit 16
fi
ret=0
for dataset in "$@"; do
case "$dataset" in
-*)
continue
;;
*)
;;
esac
pool="${dataset%%/*}"
case "$(@sbindir@/zpool list -Ho health "$pool")" in
DEGRADED)
ret=$(( $ret | 4 ))
;;
FAULTED)
awk '!/^([[:space:]]*#.*)?$/ && $1 == "'"$dataset"'" && $3 == "zfs" {exit 1}' /etc/fstab || \
ret=$(( $ret | 8 ))
;;
"")
# Pool not found, error printed by zpool(8)
ret=$(( $ret | 8 ))
;;
*)
;;
esac
done
exit "$ret"

View File

@ -22,24 +22,27 @@
.\" .\"
.\" Copyright 2013 Darik Horn <dajhorn@vanadac.com>. All rights reserved. .\" Copyright 2013 Darik Horn <dajhorn@vanadac.com>. All rights reserved.
.\" .\"
.TH FSCK.ZFS 8 "Aug 24, 2020" OpenZFS .TH FSCK.ZFS 8 "Mar 27, 2021" OpenZFS
.SH NAME .SH NAME
fsck.zfs \- Dummy ZFS filesystem checker. fsck.zfs \- Dummy ZFS filesystem checker.
.SH SYNOPSIS .SH SYNOPSIS
.LP .LP
.BI "fsck.zfs [" "options" "] <" "dataset" ">" .BI "fsck.zfs [" "options" "] <" "dataset" ">"
.SH DESCRIPTION .SH DESCRIPTION
.LP .LP
\fBfsck.zfs\fR is a shell stub that does nothing and always returns \fBfsck.zfs\fR is a thin shell wrapper that at most checks the status of a
true. It is installed by ZoL because some Linux distributions expect dataset's container pool. It is installed by OpenZFS because some Linux
a fsck helper for all filesystems. distributions expect a fsck helper for all filesystems.
.LP
If more than one \fIdataset\fR is specified, each is checked in turn
and results binary ored.
.SH OPTIONS .SH OPTIONS
.HP .HP
All \fIoptions\fR and the \fIdataset\fR are ignored. All \fIoptions\fR are ignored.
.SH "NOTES" .SH "NOTES"
.LP .LP
@ -47,14 +50,15 @@ ZFS datasets are checked by running \fBzpool scrub\fR on the
containing pool. An individual ZFS dataset is never checked containing pool. An individual ZFS dataset is never checked
independently of its pool, which is unlike a regular filesystem. independently of its pool, which is unlike a regular filesystem.
.SH "BUGS"
.LP .LP
On some systems, if the \fIdataset\fR is in a degraded pool, then it However, the
might be appropriate for \fBfsck.zfs\fR to return exit code 4 to .BR fsck (8)
indicate an uncorrected filesystem error. interface still allows it to communicate some errors:
if the \fIdataset\fR is in a degraded pool, then \fBfsck.zfs\fR will
return exit code 4 to indicate an uncorrected filesystem error.
.LP .LP
Similarly, if the \fIdataset\fR is in a faulted pool and has a legacy Similarly, if the \fIdataset\fR is in a faulted pool and has a legacy
/etc/fstab record, then \fBfsck.zfs\fR should return exit code 8 to /etc/fstab record, then \fBfsck.zfs\fR will return exit code 8 to
indicate a fatal operational error. indicate a fatal operational error.
.SH "AUTHORS" .SH "AUTHORS"