From 0c2eb3f54075c1ef0fb06b8ce3ca68c2978f99d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=BD=D0=B0=D0=B1?= Date: Wed, 31 Mar 2021 19:49:56 +0200 Subject: [PATCH] fsck.zfs: implement 4/8 exit codes as suggested in manpage MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Ahelenia Ziemiańska Closes #11806 --- cmd/fsck_zfs/.gitignore | 1 + cmd/fsck_zfs/Makefile.am | 4 ++++ cmd/fsck_zfs/fsck.zfs | 9 -------- cmd/fsck_zfs/fsck.zfs.in | 44 ++++++++++++++++++++++++++++++++++++++++ man/man8/fsck.zfs.8 | 26 ++++++++++++++---------- 5 files changed, 64 insertions(+), 20 deletions(-) create mode 100644 cmd/fsck_zfs/.gitignore delete mode 100755 cmd/fsck_zfs/fsck.zfs create mode 100755 cmd/fsck_zfs/fsck.zfs.in diff --git a/cmd/fsck_zfs/.gitignore b/cmd/fsck_zfs/.gitignore new file mode 100644 index 0000000000..0edf0309e9 --- /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 2380f56fa4..67583ac759 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 129a7f39c3..0000000000 --- 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 0000000000..32c8043e68 --- /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 f681c2502e..934abc6772 100644 --- a/man/man8/fsck.zfs.8 +++ b/man/man8/fsck.zfs.8 @@ -22,24 +22,27 @@ .\" .\" Copyright 2013 Darik Horn . 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"