Whamcloud - gitweb
LU-2694 test: fix is_empty_fs in t-f
[fs/lustre-release.git] / lustre / tests / lfsck.sh
index 2c58f5f..8d2ad27 100644 (file)
@@ -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