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 GitHub
parent 67859aedd1
commit 0c2eb3f540
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
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
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.
.\"
.TH FSCK.ZFS 8 "Aug 24, 2020" OpenZFS
.TH FSCK.ZFS 8 "Mar 27, 2021" OpenZFS
.SH NAME
fsck.zfs \- Dummy ZFS filesystem checker.
.SH SYNOPSIS
.LP
.BI "fsck.zfs [" "options" "] <" "dataset" ">"
.BI "fsck.zfs [" "options" "] <" "dataset" ">"
.SH DESCRIPTION
.LP
\fBfsck.zfs\fR is a shell stub that does nothing and always returns
true. It is installed by ZoL because some Linux distributions expect
a fsck helper for all filesystems.
\fBfsck.zfs\fR is a thin shell wrapper that at most checks the status of a
dataset's container pool. It is installed by OpenZFS because some Linux
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
.HP
All \fIoptions\fR and the \fIdataset\fR are ignored.
All \fIoptions\fR are ignored.
.SH "NOTES"
.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
independently of its pool, which is unlike a regular filesystem.
.SH "BUGS"
.LP
On some systems, if the \fIdataset\fR is in a degraded pool, then it
might be appropriate for \fBfsck.zfs\fR to return exit code 4 to
indicate an uncorrected filesystem error.
However, the
.BR fsck (8)
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
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.
.SH "AUTHORS"