X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Flfsck.sh;h=8d2ad27827199fb74ea5f23d8e44dce248606319;hb=48c78f609fb3dd8f20f8a49a22a16dbb956b3f04;hp=2c58f5f0e1f5dd15179c97ca58e7d2fada3b8d08;hpb=5d37670e8507563db556879041c7992936aefa56;p=fs%2Flustre-release.git diff --git a/lustre/tests/lfsck.sh b/lustre/tests/lfsck.sh index 2c58f5f..8d2ad27 100644 --- a/lustre/tests/lfsck.sh +++ b/lustre/tests/lfsck.sh @@ -20,6 +20,10 @@ OBJGRP=${OBJGRP:-0} # the OST object group [ -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 || { skip_env "could not find getfattr" && exit 0; } which setfattr &>/dev/null || { skip_env "could not find setfattr" && exit 0; } @@ -34,7 +38,7 @@ check_and_setup_lustre assert_DIR -SAMPLE_FILE=$TMP/$(basename $0 .sh).junk +SAMPLE_FILE=$TMP/$TESTSUITE.junk dd if=/dev/urandom of=$SAMPLE_FILE bs=1M count=1 # Create some dirs and files on the filesystem. @@ -121,23 +125,24 @@ get_ost_node() { # 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=$(ostname_from_index $obdidx) - 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 - - if [[ $ost_dev = *loop* ]]; then - ost_dev=$(do_node $node "losetup $ost_dev" | \ - sed -e "s/.*(//" -e "s/).*//") - fi - - echo $ost_dev + local node=$1 + local obdidx=$2 + local ost_name + local ost_dev + + ost_name=$(ostname_from_index $obdidx) + ost_dev=$(get_osd_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 + + echo $ost_dev } # Get the file names to be duplicated or removed on the MDS. @@ -172,28 +177,29 @@ get_files() { # Remove objects associated with files. remove_objects() { - local node=$1 - shift - local ostdev=$1 - shift - local group=$1 - shift - local objids="$@" - local tmp - local i - local rc - - echo "removing objects from $ostdev on $facet: $objids" - tmp=$(mktemp $SHARED_DIRECTORY/debugfs.XXXXXXXXXX) - for i in $objids; do - echo "rm O/$group/d$((i % 32))/$i" >> $tmp - done - - do_node $node "$DEBUGFS -w -f $tmp $ostdev" - rc=${PIPESTATUS[0]} - rm -f $tmp - - return $rc + local ostdev=$1 + shift + local group=$1 + shift + local objids="$@" + local facet=ost$((OSTIDX + 1)) + local mntpt=$(facet_mntpt $facet) + local opts=$OST_MOUNT_OPTS + local i + local rc + + echo "removing objects from $ostdev on $facet: $objids" + if ! do_facet $facet test -b $ostdev; then + opts=$(csa_add "$opts" -o loop) + fi + mount -t $(facet_fstype $facet) $opts $ostdev $mntpt || + return $? + rc=0; + for i in $objids; do + rm $mntpt/O/$group/d$((i % 32))/$i || { rc=$?; break; } + done + umount -f $mntpt || return $? + return $rc } # Remove files from MDS. @@ -227,7 +233,7 @@ if is_empty_fs $MOUNT; then # get the node name and target device for the OST with index $OSTIDX OSTNODE=$(get_ost_node $OSTIDX) || error "get_ost_node by index $OSTIDX failed" - OSTDEV=$(get_ost_dev $OSTNODE $OSTIDX) || \ + OSTDEV=$(get_ost_dev $OSTNODE $OSTIDX) || error "get_ost_dev $OSTNODE $OSTIDX failed" # get the file names to be duplicated on the MDS @@ -239,14 +245,14 @@ if is_empty_fs $MOUNT; then # remove objects associated with files in group $OBJGRP # on the OST with index $OSTIDX - remove_objects $OSTNODE $OSTDEV $OBJGRP $OST_REMOVE || \ + remove_objects $OSTDEV $OBJGRP $OST_REMOVE || error "removing objects failed" # remove files from MDS remove_files $SINGLEMDS $MDTDEV $MDS_REMOVE || error "removing files failed" # create EAs on files so objects are referenced from different files - duplicate_files $SINGLEMDS $MDTDEV $MDS_DUPE || \ + duplicate_files $SINGLEMDS $MDTDEV $MDS_DUPE || error "duplicating files failed" FSCK_MAX_ERR=1 # file system errors corrected else # is_empty_fs $MOUNT @@ -259,8 +265,10 @@ fi generate_db # remount filesystem +ORIG_REFORMAT=$REFORMAT REFORMAT="" check_and_setup_lustre +REFORMAT=$ORIG_REFORMAT # run lfsck rc=0 @@ -281,6 +289,6 @@ else fi fi -complete $(basename $0) $SECONDS +complete $SECONDS check_and_cleanup_lustre exit_status