summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorнаб <[email protected]>2021-03-31 19:49:56 +0200
committerBrian Behlendorf <[email protected]>2021-04-07 13:24:18 -0700
commitdc52c0d725eeef366eb0259ae48da9f445d52d26 (patch)
tree2ffbfa6da4f85f742b7c685be96cbea53d262d01
parentbfdd001679e235e910cc0f85273cc580c7ffd607 (diff)
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 <[email protected]> Signed-off-by: Ahelenia Ziemiańska <[email protected]> Closes #11806
-rw-r--r--cmd/fsck_zfs/.gitignore1
-rw-r--r--cmd/fsck_zfs/Makefile.am4
-rwxr-xr-xcmd/fsck_zfs/fsck.zfs9
-rwxr-xr-xcmd/fsck_zfs/fsck.zfs.in44
-rw-r--r--man/man8/fsck.zfs.826
5 files changed, 64 insertions, 20 deletions
diff --git a/cmd/fsck_zfs/.gitignore b/cmd/fsck_zfs/.gitignore
new file mode 100644
index 000000000..0edf0309e
--- /dev/null
+++ b/cmd/fsck_zfs/.gitignore
@@ -0,0 +1 @@
+/fsck.zfs
diff --git a/cmd/fsck_zfs/Makefile.am b/cmd/fsck_zfs/Makefile.am
index 2380f56fa..67583ac75 100644
--- a/cmd/fsck_zfs/Makefile.am
+++ b/cmd/fsck_zfs/Makefile.am
@@ -1 +1,5 @@
+include $(top_srcdir)/config/Substfiles.am
+
dist_sbin_SCRIPTS = fsck.zfs
+
+SUBSTFILES += $(dist_sbin_SCRIPTS)
diff --git a/cmd/fsck_zfs/fsck.zfs b/cmd/fsck_zfs/fsck.zfs
deleted file mode 100755
index 129a7f39c..000000000
--- a/cmd/fsck_zfs/fsck.zfs
+++ /dev/null
@@ -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
diff --git a/cmd/fsck_zfs/fsck.zfs.in b/cmd/fsck_zfs/fsck.zfs.in
new file mode 100755
index 000000000..32c8043e6
--- /dev/null
+++ b/cmd/fsck_zfs/fsck.zfs.in
@@ -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"
diff --git a/man/man8/fsck.zfs.8 b/man/man8/fsck.zfs.8
index f681c2502..934abc677 100644
--- a/man/man8/fsck.zfs.8
+++ b/man/man8/fsck.zfs.8
@@ -22,24 +22,27 @@
.\"
.\" Copyright 2013 Darik Horn <[email protected]>. 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"