#!/bin/bash
+# -*- mode: Bash; tab-width: 4; indent-tabs-mode: t; -*-
+# vim:shiftwidth=4:softtabstop=4:tabstop=4:
#
# test e2fsck and lfsck to detect and fix filesystem corruption
#
[ -d "$SHARED_DIRECTORY" ] || \
{ skip "SHARED_DIRECTORY should be specified with a shared directory \
which can be accessable on all of the nodes" && exit 0; }
+[[ $(facet_fstype $SINGLEMDS) != ldiskfs ]] &&
+ skip "Only applicable to ldiskfs-based MDTs" && exit 0
+[[ $(facet_fstype OST) != ldiskfs ]] &&
+ skip "Only applicable to ldiskfs-based OST" && exit 0
-which getfattr > /dev/null 2>&1 || { skip "could not find getfattr" && exit 0; }
-which setfattr > /dev/null 2>&1 || { skip "could not find setfattr" && exit 0; }
+which getfattr &>/dev/null || { skip_env "could not find getfattr" && exit 0; }
+which setfattr &>/dev/null || { skip_env "could not find setfattr" && exit 0; }
+
+if [ ! -x `which $LFSCK_BIN` ]; then
+ log "$($E2FSCK -V)"
+ error "e2fsprogs does not support lfsck"
+fi
MOUNT_2=""
check_and_setup_lustre
local ost_node
local node
- ost_uuid=$($LFS osts | grep "^$obdidx: " | cut -d' ' -f2 | head -n1)
+ ost_uuid=$(ostuuid_from_index $obdidx)
for node in $(osts_nodes); do
do_node $node "lctl get_param -n obdfilter.*.uuid" | grep -q $ost_uuid
# Get the OST target device (given the OST facet name and OST index).
get_ost_dev() {
- local node=$1
- local obdidx=$2
- local ost_name
- local ost_dev
-
- ost_name=$($LFS osts | grep "^$obdidx: " | cut -d' ' -f2 | \
- head -n1 | sed -e 's/_UUID$//')
-
- ost_dev=$(do_node $node "lctl get_param -n obdfilter.$ost_name.mntdev")
- [ ${PIPESTATUS[0]} -ne 0 ] && \
- echo "failed to find the OST device with index $obdidx on $facet" && \
- return 1
+ local node=$1
+ local obdidx=$2
+ local ost_name
+ local ost_dev
+
+ ost_name=$(ostname_from_index $obdidx)
+ ost_dev=$(get_obdfilter_param $node $ost_name mntdev)
+ if [ $? -ne 0 ]; then
+ printf "unable to find OST%04x on $facet\n" $obdidx
+ return 1
+ fi
- if [[ $ost_dev = *loop* ]]; then
- ost_dev=$(do_node $node "losetup $ost_dev" | \
- sed -e "s/.*(//" -e "s/).*//")
- fi
+ if [[ $ost_dev = *loop* ]]; then
+ ost_dev=$(do_node $node "losetup $ost_dev" | \
+ sed -e "s/.*(//" -e "s/).*//")
+ fi
- echo $ost_dev
+ echo $ost_dev
}
# Get the file names to be duplicated or removed on the MDS.
# get the server target devices
get_svr_devs
-if [ "$SKIP_LFSCK" = "no" ] && is_empty_fs $MOUNT; then
+if is_empty_fs $MOUNT; then
# create test directory
TESTDIR=$DIR/d0.$TESTSUITE
mkdir -p $TESTDIR || error "mkdir $TESTDIR failed"
duplicate_files $SINGLEMDS $MDTDEV $MDS_DUPE || \
error "duplicating files failed"
FSCK_MAX_ERR=1 # file system errors corrected
-else # I_MOUNTED=no
+else # is_empty_fs $MOUNT
FSCK_MAX_ERR=4 # file system errors left uncorrected
fi
# lfsck will return 1 if the filesystem had errors fixed
# run e2fsck to generate databases used for lfsck
generate_db
-if [ "$SKIP_LFSCK" != "no" ]; then
- echo "skip lfsck"
+
+# remount filesystem
+REFORMAT=""
+check_and_setup_lustre
+
+# run lfsck
+rc=0
+run_lfsck || rc=$?
+if [ $rc -eq 0 ]; then
+ echo "clean after the first check"
else
- # remount filesystem
- REFORMAT=""
- check_and_setup_lustre
+ # run e2fsck again to generate databases used for lfsck
+ generate_db
- # run lfsck
+ # run lfsck again
rc=0
run_lfsck || rc=$?
if [ $rc -eq 0 ]; then
- echo "clean after the first check"
+ echo "clean after the second check"
else
- # run e2fsck again to generate databases used for lfsck
- generate_db
-
- # run lfsck again
- rc=0
- run_lfsck || rc=$?
- if [ $rc -eq 0 ]; then
- echo "clean after the second check"
- else
- error "lfsck test 2 - finished with rc=$rc"
- fi
+ error "lfsck test 2 - finished with rc=$rc"
fi
fi
-equals_msg $(basename $0): test complete, cleaning up
-
-LFSCK_ALWAYS=no
+complete $(basename $0) $SECONDS
check_and_cleanup_lustre
-[ -f "$TESTSUITELOG" ] && cat $TESTSUITELOG && \
- grep -q FAIL $TESTSUITELOG && exit 1 || true
-
-echo "$0: completed"
+exit_status