public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2] fsck.xfs: mount/umount xfs fs to replay log before running xfs_repair
@ 2022-11-02 14:29 Srikanth C S
  2022-11-02 17:49 ` Darrick J. Wong
  2022-11-02 20:43 ` Dave Chinner
  0 siblings, 2 replies; 4+ messages in thread
From: Srikanth C S @ 2022-11-02 14:29 UTC (permalink / raw)
  To: linux-xfs
  Cc: srikanth.c.s, darrick.wong, rajesh.sivaramasubramaniom,
	junxiao.bi

After a recent data center crash, we had to recover root filesystems
on several thousands of VMs via a boot time fsck. Since these
machines are remotely manageable, support can inject the kernel
command line with 'fsck.mode=force fsck.repair=yes' to kick off
xfs_repair if the machine won't come up or if they suspect there
might be deeper issues with latent errors in the fs metadata, which
is what they did to try to get everyone running ASAP while
anticipating any future problems. But, fsck.xfs does not address the
journal replay in case of a crash.

fsck.xfs does xfs_repair -e if fsck.mode=force is set. It is
possible that when the machine crashes, the fs is in inconsistent
state with the journal log not yet replayed. This can put the
machine into rescue shell. To address this problem, mount and
umount the fs before running xfs_repair.

Run xfs_repair -e when fsck.mode=force and repair=auto or yes.
Replay the logs only if fsck.mode=force and fsck.repair=yes. For
other option -fa and -f drop to the resuce shell if repair detects
any corruptions

Signed-off-by: Srikanth C S <srikanth.c.s@oracle.com>
---
 fsck/xfs_fsck.sh | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/fsck/xfs_fsck.sh b/fsck/xfs_fsck.sh
index 6af0f22..4ef61db 100755
--- a/fsck/xfs_fsck.sh
+++ b/fsck/xfs_fsck.sh
@@ -31,10 +31,12 @@ repair2fsck_code() {

 AUTO=false
 FORCE=false
+REPAIR=false
 while getopts ":aApyf" c
 do
        case $c in
-       a|A|p|y)        AUTO=true;;
+       a|A|p)          AUTO=true;;
+       y)              REPAIR=true;;
        f)              FORCE=true;;
        esac
 done
@@ -64,7 +66,24 @@ fi

 if $FORCE; then
        xfs_repair -e $DEV
-       repair2fsck_code $?
+       error=$?
+       if [ $error -eq 2 ] && [ -n "$REPAIR" ]; then
+               echo "Replaying log for $DEV"
+               mkdir -p /tmp/repair_mnt || exit 1
+               for x in $(cat /proc/cmdline); do
+                       case $x in
+                               rootflags=*)
+                                       ROOTFLAGS="-o ${x#rootflags=}"
+                               ;;
+                       esac
+               done
+               mount $DEV /tmp/repair_mnt $ROOTFLAGS || exit 1
+               umount /tmp/repair_mnt
+               xfs_repair -e $DEV
+               error=$?
+               rm -d /tmp/repair_mnt
+       fi
+       repair2fsck_code $error
        exit $?
 fi

--
1.8.3.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread
[parent not found: <MWHPR10MB1486F72607AE8681E25BA0D0A3299@MWHPR10MB1486.namprd10.prod.outlook.com>]

end of thread, other threads:[~2022-11-02 20:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-11-02 14:29 [PATCH V2] fsck.xfs: mount/umount xfs fs to replay log before running xfs_repair Srikanth C S
2022-11-02 17:49 ` Darrick J. Wong
2022-11-02 20:43 ` Dave Chinner
     [not found] <MWHPR10MB1486F72607AE8681E25BA0D0A3299@MWHPR10MB1486.namprd10.prod.outlook.com>
2022-10-17 17:23 ` Darrick Wong

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox