From 485db19e3cded2bdd5ca6e8276342a57ae795111 Mon Sep 17 00:00:00 2001 From: Eric Sandeen Date: Tue, 2 Jun 2009 22:42:21 +0200 Subject: [PATCH] enable generic filesystems to be checked This includes a fair bit of rearranging to avoid code duplication, but the goal is to allow 'fsck -n -t $FSTYP $device' to be run on any generic filesystem. Any FS for which this doesn't work will need it's own fsck routine. Signed-off-by: Eric Sandeen Signed-off-by: Christoph Hellwig --- common.rc | 183 ++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 130 insertions(+), 53 deletions(-) diff --git a/common.rc b/common.rc index c3e77e9f4..581cfbae3 100644 --- a/common.rc +++ b/common.rc @@ -707,29 +707,29 @@ _require_user() [ "$?" == "0" ] || _notrun "$qa_user user not defined." } -# check that a FS is mounted as XFS. if so, return mount point +# check that a FS on a device is mounted +# if so, return mount point # -_xfs_mounted() +_is_mounted() { if [ $# -ne 1 ] then - echo "Usage: _xfs_mounted device" 1>&2 + echo "Usage: _is_mounted device" 1>&2 exit 1 fi device=$1 - if _mount | grep "$device " | $AWK_PROG ' - /type xfs/ { print $3 ; exit 0 } - END { exit 1 } + if _mount | grep "$device " | $AWK_PROG -v pattern="type $FSTYP" ' + pattern { print $3 ; exit 0 } + END { exit 1 } ' then - echo "_xfs_mounted: $device is not a mounted XFS FS" + echo "_is_mounted: $device is not a mounted $FSTYP FS" exit 1 fi } - # remount a FS to a new mode (ro or rw) # _remount() @@ -749,14 +749,112 @@ _remount() fi } -# run xfs_check and friends on a FS. +# Run the appropriate repair/check on a filesystem # # if the filesystem is mounted, it's either remounted ro before being # checked or it's unmounted and then remounted # +# If set, we remount ro instead of unmounting for fsck USE_REMOUNT=0 +_umount_or_remount_ro() +{ + if [ $# -ne 1 ] + then + echo "Usage: _umount_or_remount_ro " 1>&2 + exit 1 + fi + + device=$1 + mountpoint=`_is_mounted $device` + + if [ $USE_REMOUNT -eq 0 ]; then + $UMOUNT_PROG $device + else + _remount $device ro + fi + echo "$mountpoint" +} + +_mount_or_remount_rw() +{ + if [ $# -ne 3 ] + then + echo "Usage: _mount_or_remount_rw " 1>&2 + exit 1 + fi + mount_opts=$1 + device=$2 + mountpoint=$3 + + if [ $USE_REMOUNT -eq 0 ] + then + if ! _mount -t $FSTYP $mount_opts $device $mountpoint + then + echo "!!! failed to remount $device on $mountpoint" + return 0 # ok=0 + fi + else + _remount $device rw + fi + + return 1 # ok=1 +} + +# Check a generic filesystem in no-op mode; this assumes that the +# underlying fsck program accepts "-n" for a no-op (check-only) run, +# and that it will still return an errno for corruption in this mode. +# +# Filesystems which don't support this will need to define their +# own check routine. +# +_check_generic_filesystem() +{ + device=$1 + + # If type is set, we're mounted + type=`_fs_type $device` + ok=1 + + if [ "$type" = "$FSTYP" ] + then + # mounted ... + mountpoint=`_umount_or_remount_ro $device` + fi + + fsck -t $FSTYP -n $device >$tmp.fsck 2>&1 + if [ $? -ne 0 ] + then + echo "_check_generic_filesystem: filesystem on $device is inconsistent (see $seq.full)" + + echo "_check_generic filesystem: filesystem on $device is inconsistent" >>$here/$seq.full + echo "*** fsck.$FSTYP output ***" >>$here/$seq.full + cat $tmp.fsck >>$here/$seq.full + echo "*** end fsck.$FSTYP output" >>$here/$seq.full + + ok=0 + fi + rm -f $tmp.fsck + + if [ $ok -eq 0 ] + then + echo "*** mount output ***" >>$here/$seq.full + _mount >>$here/$seq.full + echo "*** end mount output" >>$here/$seq.full + elif [ "$type" = "$FSTYP" ] + then + # was mounted ... + _mount_or_remount_rw "$MOUNT_OPTIONS" $device $mountpoint + ok=$? + fi + + [ $ok -eq 0 ] && exit 1 + return 0 +} + +# run xfs_check and friends on a FS. + _check_xfs_filesystem() { if [ $# -ne 3 ] @@ -787,15 +885,8 @@ _check_xfs_filesystem() if [ "$type" = "xfs" ] then - # mounted... - - if [ $USE_REMOUNT -eq 0 ] - then - mountpoint=`_xfs_mounted $device` - $UMOUNT_PROG $device - else - _remount $device ro - fi + # mounted ... + mountpoint=`_umount_or_remount_ro $device` fi $XFS_LOGPRINT_PROG -t $extra_log_options $device 2>&1 \ @@ -848,17 +939,7 @@ _check_xfs_filesystem() echo "*** end mount output" >>$here/$seq.full elif [ "$type" = "xfs" ] then - # mounted... - if [ $USE_REMOUNT -eq 0 ] - then - if ! _mount -t xfs $extra_mount_options $device $mountpoint - then - echo "!!! failed to remount $device on $mountpoint" - ok=0 - fi - else - _remount $device rw - fi + _mount_or_remount_rw "$extra_mount_options" $device $mountpoint fi [ $ok -eq 0 ] && exit 1 @@ -908,12 +989,8 @@ _check_udf_filesystem() } -_check_test_fs() +_check_xfs_test_fs() { - if [ "$FSTYP" != "xfs" ]; then - return - fi - TEST_LOG="none" TEST_RT="none" [ "$USE_EXTERNAL" = yes -a ! -z "$TEST_LOGDEV" ] && \ @@ -932,6 +1009,24 @@ _check_test_fs() fi } +_check_test_fs() +{ + case $FSTYP in + xfs) + _check_xfs_test_fs + ;; + nfs) + # no way to check consistency for nfs + ;; + udf) + # do nothing for now + ;; + *) + _check_generic_filesystem $TEST_DEV + ;; + esac +} + _check_scratch_fs() { case $FSTYP in @@ -953,6 +1048,7 @@ _check_scratch_fs() # Don't know how to check an NFS filesystem, yet. ;; *) + _check_generic_filesystem $SCRATCH_DEV ;; esac } @@ -987,25 +1083,6 @@ _full_platform_details() echo "$os/$platform $host $kernel" } -_check_testdir() -{ - case $FSTYP in - xfs) - _check_test_fs - ;; - udf) - _cleanup_testdir - _check_scratch_fs - _scratch_mount - ;; - nfs*) - # Don't know how to check an NFS filesystem, yet. - ;; - *) - ;; - esac -} - _setup_udf_scratchdir() { [ "$FSTYP" != "udf" ] \ -- 2.50.1