#!/bin/bash # xfs_check start # xfs_check status # xfs_check cancel # xfs_check zero_log # Exit codes: # 0 - No corruption detected or process not found. # 1 - Corruption detected. # 2 - Dirty log. # 4 - File system corruption fixed. # 8 - No check has been run yet. # 9 - Process is still running. # Using /var/lib because that's where btrfs puts status mkdir -p /var/lib/xfs case "$1" in 'start') # Start the xfs_repair process in the background and log output /sbin/xfs_repair $4 $2 &> /var/lib/xfs/check.status.$3 & pid=$! echo $pid > /var/lib/xfs/check.pid.$3 # Wait for xfs_repair to complete synchronously wait "$pid" # Capture the exit code of xfs_repair echo $? > /var/lib/xfs/check.status.$3.exit exit 0 ;; 'status') # Check if the process is still running if [ -f /var/lib/xfs/check.pid.$3 ]; then pid=$(cat /var/lib/xfs/check.pid.$3) if kill -0 $pid 2>/dev/null; then # Process is running, return status and exit code 9 cat /var/lib/xfs/check.status.$3 exit 9 else # Process is not running, read the exit status if available if [ -f /var/lib/xfs/check.status.$3.exit ]; then exit_status=$(cat /var/lib/xfs/check.status.$3.exit) cat /var/lib/xfs/check.status.$3 rm -f /var/lib/xfs/check.pid.$3 if [[ $exit_status -eq 0 || $exit_status -eq 1 || $exit_status -eq 2 || $exit_status -eq 4 ]]; then exit $exit_status else exit 0 fi else # Exit status file does not exist, but return status file if available if [ -f /var/lib/xfs/check.status.$3 ]; then cat /var/lib/xfs/check.status.$3 fi exit 8 fi fi else # No PID file found, check for existing status if [ -f /var/lib/xfs/check.status.$3 ]; then cat /var/lib/xfs/check.status.$3 # If no exit status file, assume process completed successfully if [ -f /var/lib/xfs/check.status.$3.exit ]; then exit_status=$(cat /var/lib/xfs/check.status.$3.exit) if [[ $exit_status -eq 0 || $exit_status -eq 1 || $exit_status -eq 2 || $exit_status -eq 4 ]]; then exit $exit_status else exit 0 fi else exit 8 fi else # No status file found echo "Not available" exit 8 fi fi ;; 'cancel') # Cancel the xfs_repair process if [ -f /var/lib/xfs/check.pid.$3 ]; then pid=$(cat /var/lib/xfs/check.pid.$3) kill $pid while kill -0 $pid 2>/dev/null; do sleep 1 done echo -e "\nCancelled" >> /var/lib/xfs/check.status.$3 rm -f /var/lib/xfs/check.pid.$3 else echo "No process to cancel" fi exit 0 ;; *) # Handle invalid commands echo "Invalid command" exit 0 ;; esac