]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
fsck.xfs: allow forced repairs using xfs_repair
authorJan Tulak <jtulak@redhat.com>
Tue, 27 Mar 2018 02:27:31 +0000 (21:27 -0500)
committerEric Sandeen <sandeen@redhat.com>
Tue, 27 Mar 2018 02:27:31 +0000 (21:27 -0500)
The fsck.xfs script did nothing, because xfs doesn't need a fsck to be
run on every unclean shutdown. However, sometimes it may happen that the
root filesystem really requires the usage of xfs_repair and then it is a
hassle. This patch makes the situation a bit easier by detecting forced
checks (/forcefsck or fsck.mode=force) and invoking xfs_repair.

Signed-off-by: Jan Tulak <jtulak@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
fsck/xfs_fsck.sh
man/man8/fsck.xfs.8

index e52969e4b8893f0fb5883fa3555d591df19a8cf3..c9fc3eb35fc9281b84faedd750266d5b5d36a80a 100755 (executable)
@@ -3,11 +3,35 @@
 # Copyright (c) 2006 Silicon Graphics, Inc.  All Rights Reserved.
 #
 
+NAME=$0
+
+# get the right return code for fsck
+function repair2fsck_code() {
+       case $1 in
+       0)  return 0 # everything is ok
+               ;;
+       1)  echo "$NAME error: xfs_repair could not fix the filesystem." 1>&2
+               return 4 # errors left uncorrected
+               ;;
+       2)  echo "$NAME error: The filesystem log is dirty, mount it to recover" \
+                    "the log. If that fails, refer to the section DIRTY LOGS in the" \
+                    "xfs_repair manual page." 1>&2
+               return 4 # dirty log, don't do anything and let the user solve it
+               ;;
+       4)  return 1 # The fs has been fixed
+               ;;
+       *)  echo "$NAME error: An unknown return code from xfs_repair '$1'" 1>&2
+               return 4 # something went wrong with xfs_repair
+       esac
+}
+
 AUTO=false
-while getopts ":aApy" c
+FORCE=false
+while getopts ":aApyf" c
 do
        case $c in
        a|A|p|y)        AUTO=true;;
+       f)              FORCE=true;;
        esac
 done
 eval DEV=\${$#}
@@ -15,6 +39,37 @@ if [ ! -e $DEV ]; then
        echo "$0: $DEV does not exist"
        exit 8
 fi
+
+# The flag -f is added by systemd/init scripts when /forcefsck file is present
+# or fsck.mode=force is used during boot; an unclean shutdown won't trigger
+# this check, user has to explicitly require a forced fsck.
+# But first of all, test if it is a non-interactive session.
+# Invoking xfs_repair via fsck.xfs is only intended to happen via initscripts.
+# Normal administrative filesystem repairs should always invoke xfs_repair
+# directly.
+#
+# Use multiple methods to capture most of the cases:
+# The case for *i* and -n "$PS1" are commonly suggested in bash manual
+# and the -t 0 test checks stdin
+case $- in
+       *i*) FORCE=false ;;
+esac
+if [ -n "$PS1" -o -t 0 ]; then
+       FORCE=false
+fi
+
+if $FORCE; then
+       XFS_REPAIR=`command -v xfs_repair`
+       if [ ! -x "$XFS_REPAIR" ] ; then
+               echo "$NAME error: xfs_repair was not found!" 1>&2
+               exit 4
+       fi
+
+       $XFS_REPAIR -e $DEV
+       repair2fsck_code $?
+       exit $?
+fi
+
 if $AUTO; then
        echo "$0: XFS file system."
 else
index ace7252d392acf2de5fac67443ed6b7cb17d3662..a51baf7cccb350ae5b728ace0679f1590bc240ca 100644 (file)
@@ -21,6 +21,13 @@ If you wish to check the consistency of an XFS filesystem,
 or repair a damaged or corrupt XFS filesystem,
 see
 .BR xfs_repair (8).
+.PP
+However, the system administrator can force
+.B fsck.xfs
+to run
+.BR xfs_repair (8)
+at boot time by creating a /forcefsck file or booting the system with
+"fsck.mode=force" on the kernel command line.
 .
 .SH FILES
 .IR /etc/fstab .