]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blob - fsck/xfs_fsck.sh
xfsprogs: Release v6.8.0
[thirdparty/xfsprogs-dev.git] / fsck / xfs_fsck.sh
1 #!/bin/sh -f
2 #
3 # Copyright (c) 2006 Silicon Graphics, Inc. All Rights Reserved.
4 #
5
6 NAME=$0
7
8 # get the right return code for fsck
9 repair2fsck_code() {
10 case $1 in
11 0) return 0 # everything is ok
12 ;;
13 1) echo "$NAME error: xfs_repair could not fix the filesystem." 1>&2
14 return 4 # errors left uncorrected
15 ;;
16 2) echo "$NAME error: The filesystem log is dirty, mount it to recover" \
17 "the log. If that fails, refer to the section DIRTY LOGS in the" \
18 "xfs_repair manual page." 1>&2
19 return 4 # dirty log, don't do anything and let the user solve it
20 ;;
21 4) return 1 # The fs has been fixed
22 ;;
23 127)
24 echo "$NAME error: xfs_repair was not found!" 1>&2
25 return 4
26 ;;
27 *) echo "$NAME error: An unknown return code from xfs_repair '$1'" 1>&2
28 return 4 # something went wrong with xfs_repair
29 esac
30 }
31
32 AUTO=false
33 FORCE=false
34 REPAIR=false
35 while getopts ":aApyf" c
36 do
37 case $c in
38 a|A|p) AUTO=true;;
39 y) REPAIR=true;;
40 f) FORCE=true;;
41 esac
42 done
43 eval DEV=\${$#}
44 if [ ! -e $DEV ]; then
45 echo "$0: $DEV does not exist"
46 exit 8
47 fi
48
49 # The flag -f is added by systemd/init scripts when /forcefsck file is present
50 # or fsck.mode=force is used during boot; an unclean shutdown won't trigger
51 # this check, user has to explicitly require a forced fsck.
52 # But first of all, test if it is a non-interactive session.
53 # Invoking xfs_repair via fsck.xfs is only intended to happen via initscripts.
54 # Normal administrative filesystem repairs should always invoke xfs_repair
55 # directly.
56 #
57 # Use multiple methods to capture most of the cases:
58 # The case for *i* and -n "$PS1" are commonly suggested in bash manual
59 # and the -t 0 test checks stdin
60 case $- in
61 *i*) FORCE=false ;;
62 esac
63 if [ -n "$PS1" -o -t 0 ]; then
64 FORCE=false
65 fi
66
67 if $FORCE; then
68 xfs_repair -e $DEV
69 error=$?
70 if [ $error -eq 2 ] && [ $REPAIR = true ]; then
71 echo "Replaying log for $DEV"
72 mkdir -p /tmp/repair_mnt || exit 1
73 for x in $(cat /proc/cmdline); do
74 case $x in
75 root=*)
76 ROOT="${x#root=}"
77 ;;
78 rootflags=*)
79 ROOTFLAGS="-o ${x#rootflags=}"
80 ;;
81 esac
82 done
83 test -b "$ROOT" || ROOT=$(blkid -t "$ROOT" -o device)
84 if [ $(basename $DEV) = $(basename $ROOT) ]; then
85 mount $DEV /tmp/repair_mnt $ROOTFLAGS || exit 1
86 else
87 mount $DEV /tmp/repair_mnt || exit 1
88 fi
89 umount /tmp/repair_mnt
90 xfs_repair -e $DEV
91 error=$?
92 rm -d /tmp/repair_mnt
93 fi
94 repair2fsck_code $error
95 exit $?
96 fi
97
98 if $AUTO; then
99 echo "$0: XFS file system."
100 else
101 echo "If you wish to check the consistency of an XFS filesystem or"
102 echo "repair a damaged filesystem, see xfs_repair(8)."
103 fi
104 exit 0