[Ocfs2-tools-devel] ocfs2-test patch for testing backup superblocks.
tao.ma
tao.ma at oracle.com
Wed Dec 13 01:03:58 PST 2006
Hi all,
I write a script for testing the implementations of backup
superblocks. Any suggestions, please let me know.
-------------- next part --------------
Index: programs/backup_super/test.sh
===================================================================
--- programs/backup_super/test.sh (revision 0)
+++ programs/backup_super/test.sh (revision 0)
@@ -0,0 +1,267 @@
+#!/bin/bash
+
+MKFS_OLD=./mkfs.ocfs2.old
+MKFS=./mkfs.ocfs2
+FSCK=./fsck.ocfs2
+DEBUGFS=./debugfs.ocfs2
+TUNEFS=./tunefs.ocfs2
+
+DEVICE=$1
+FIRST_BACKUP_OFF=1073741824 #1G
+MAX_NUM=6
+
+if [ -z "$DEVICE" ]; then
+ echo "$0 device"
+ exit 1
+fi
+
+echo "checking the programs we need in the test..."
+for PROGRAM in $MKFS_OLD $MKFS $FSCK $DEBUGFS $TUNEFS
+do
+ type $PROGRAM
+ if [ $? != "0" ]; then
+ #if [ -x $PROGRAM ]; then
+ echo "$PROGRAM not exist"
+ exit 1
+ fi
+done
+
+exec 3>&1
+exec 2>/dev/null
+exec 1>/dev/null
+
+#$1 is the result to check
+#$2 is the result we want
+#$3 is the error messge
+#$4 is the line num of the error
+check_result()
+{
+ if [ $1 != $2 ]; then
+ echo $3" at line "$4 >&3
+ exit 1
+ fi
+}
+
+#clear all the backup blocks in the device
+clear_backup_blocks()
+{
+ backup_off=$FIRST_BACKUP_OFF
+
+ while [ `expr $backup_off + 512` -le `expr $byte_total` ];
+ do
+ #clear the last blocksize
+ seek_block=`expr $backup_off / 512`
+ dd if=/dev/zero of=$DEVICE bs=512 count=1 seek=$seek_block
+
+ backup_off=`expr $backup_off \* 4`
+ done
+}
+
+test_mkfs()
+{
+ echo "testing mkfs.ocfs2..." >&3
+ #mkfs and debugfs test.
+ #vol_byte_size is always set to be one of the backup
+ #superblock offset, say 1G, 4G, 16G...
+ #see the main loop for more details.
+
+ #in order to speed up the process of mkfs,
+ #we empty the first block first.
+ #we also need to clear all the backup blocks in the device
+ #in case they are written by prevoius format.
+ dd if=/dev/zero of=$DEVICE bs=4096 count=3
+ clear_backup_blocks
+
+ msg="debugfs shouldn't be sucess"
+ msg1="debugfs should be sucess"
+
+ blkcount=`expr $vol_byte_size / $blocksize`
+ $MKFS -b $blocksize -C $clustersize -N 4 $DEVICE $blkcount
+ #first check whether mkfs is success
+ echo "ls //"|$DEBUGFS $DEVICE|grep global_bitmap
+ check_result $? 0 $msg $LINENO
+
+ #this time there is the block represented by the last_backup_num isn't
+ #in the volume, so we can't open the device by the num.
+ echo "ls //"|$DEBUGFS $DEVICE -s $last_backup_num|grep global_bitmap
+ check_result $? 1 $msg1 $LINENO
+
+ #increase the blkcount so that the blocks represented by the last_backup_num
+ #can be used to store the backup block.
+ bpc=`expr $clustersize / $blocksize`
+ blkcount=`expr $blkcount + $bpc`
+
+ dd if=/dev/zero of=$DEVICE bs=4096 count=3
+ clear_backup_blocks
+ $MKFS -b $blocksize -C $clustersize -N 4 $DEVICE $blkcount
+ #first check whether mkfs is success
+ echo "ls //"|$DEBUGFS $DEVICE|grep global_bitmap
+ check_result $? 0 $msg1 $LINENO
+
+ #check whether all the backup blocks including last_backup_num
+ #can be opened.
+ i=1
+ while [ `expr $i` -le `expr $last_backup_num` ];
+ do
+ cmd="$DEBUGFS $DEVICE -s $i"
+ echo "ls //"|$cmd|grep global_bitmap
+ check_result $? 0 $msg1 $LINENO
+ echo $cmd " is ok." >&3
+ i=`expr $i + 1`
+ done
+}
+
+#test fsck.ocfs2 -r
+test_fsck()
+{
+ echo "testing fsck.ocfs2..." >&3
+
+ dd if=/dev/zero of=$DEVICE bs=4096 count=3
+ clear_backup_blocks
+
+ $MKFS -b $blocksize -C $clustersize -N 4 $DEVICE $blkcount
+ #corrupt the superblock
+ dd if=/dev/zero of=$DEVICE bs=$blocksize count=3
+ $FSCK $DEVICE #This should failed.
+ check_result $? 8 "fsck.ocfs2" $LINENO
+
+ #recover the superblock
+ cmd="$FSCK -y -r $last_backup_num $DEVICE"
+ $cmd
+ check_result $? 0 "fsck.ocfs2" $LINENO
+ echo $cmd "is ok" >&3
+
+ #go on the normal process to see whether the recovery is sucess.
+ $FSCK -f $DEVICE #This should failed.
+ check_result $? 0 "fsck.ocfs2" $LINENO
+}
+
+#test whether tunefs will add new backup superblocks during resizing
+test_tunefs_resize()
+{
+ dd if=/dev/zero of=$DEVICE bs=4096 count=3
+ clear_backup_blocks
+
+ #mkfs a volume with no backup superblock
+ $MKFS -b $blocksize -C $clustersize -N 4 $DEVICE $blkcount
+
+ bpc=`expr $clustersize / $blocksize`
+ blkcount=`expr $blkcount + $bpc`
+ #tunefs a volume to add a cluster which will have a backup superblock.
+ cmd="$TUNEFS -S $DEVICE $blkcount"
+ echo "y"|$cmd
+ check_result $? 0 "tunefs.ocfs2" $LINENO
+ echo $cmd "is ok" >&3
+ cmd="$DEBUGFS $DEVICE -s $last_backup_num"
+ echo "ls //"|$cmd|grep global_bitmap
+ check_result $? 0 "tunefs.ocfs2" $LINENO #we can open with a backup block
+ echo $cmd "is ok." >&3
+}
+
+#test whether tunefs will add backup superblocks for an old ocfs2 volume
+test_tunefs_add_backup()
+{
+ dd if=/dev/zero of=$DEVICE bs=4096 count=3
+ clear_backup_blocks
+
+ #mkfs a volume with no backup superblock supported
+ $MKFS_OLD -b $blocksize -C $clustersize -N 4 $DEVICE $blkcount
+
+ #tunefs a volume to add backup superblocks
+ $TUNEFS -b -L "test" $DEVICE #we don't allow change volume with backup
+ check_result $? 1 "tunefs.ocfs2" $LINENO
+ $TUNEFS -b -N 8 $DEVICE #we don't allow change slots with backup
+ check_result $? 1 "tunefs.ocfs2" $LINENO
+
+ cmd="$TUNEFS -b $DEVICE"
+ echo "y"|$cmd
+ check_result $? 0 "tunefs.ocfs2" LINENO
+ echo $cmd "is ok" >&3
+ echo "ls //"|$DEBUGFS $DEVICE -s 1|grep global_bitmap
+ check_result $? 0 "tunefs.ocfs2" $LINENO #we can open with a backup block
+}
+
+check_vol()
+{
+ fsck_result=`$FSCK $DEVICE|grep label`
+ label_name=`echo $fsck_result | awk '{print $2}'`
+
+ if [ $label_name != $1 ]; then
+ echo "check volume name [$1]failed">&3
+ exit 1
+ fi
+}
+
+#test whether tunefs will refresh backup block when updating the superblock
+test_tunefs_refresh()
+{
+ dd if=/dev/zero of=$DEVICE bs=4096 count=3
+ clear_backup_blocks
+
+ old_vol_name="old_ocfs2"
+ new_vol_name="new_ocfs2"
+ $MKFS -b $blocksize -C $clustersize -N 4 -L $old_vol_name $DEVICE $blkcount
+ check_vol $old_vol_name
+
+ #change the volume name
+ echo "y"|$TUNEFS -L $new_vol_name $DEVICE
+ #corrupt the superblock
+ dd if=/dev/zero of=$DEVICE bs=$blocksize count=3
+ cmd="$FSCK -fy -r $last_backup_num $DEVICE"
+ check_result $? 0 $cmd $LINENO
+ echo $cmd " is ok" >&3
+ #check whether the recover superblock has the new vol name
+ check_vol $new_vol_name
+}
+
+for blocksize in 512 #1024 2048 4096
+do
+ for clustersize in \
+ 4096 #8192 16384 32768 65536 131072 262144 524288 1048576
+ do
+ sect_total=`blockdev --getsize $DEVICE`
+ byte_total=`expr $sect_total \* 512`
+
+ vol_byte_size=$FIRST_BACKUP_OFF
+ #last_backup_num is set according to the vol_byte_size
+ #for 1 for 1G, and 2 for 4G, 3 for 16G etc.
+ last_backup_num=1
+
+ while [ `expr $vol_byte_size` -le `expr $byte_total` ] ;
+ do
+ echo "vol_size = $vol_byte_size, blocksize = $blocksize," \
+ " clustersize = $clustersize" >&3
+
+ bpc=`expr $clustersize / $blocksize`
+
+ test_mkfs
+
+ #for fsck, we must increase vol_byte_size to include
+ #the backup block.
+ blkcount=`expr $vol_byte_size / $blocksize + $bpc`
+ test_fsck
+
+ #for resize, the initial blkcount should not include
+ #the backup block.
+ blkcount=`expr $vol_byte_size / $blocksize`
+ test_tunefs_resize
+
+ #for add backup blocks, we must increase vol_byte_size
+ #to include the backup block.
+ blkcount=`expr $vol_byte_size / $blocksize + $bpc`
+ #test_tunefs_add_backup
+
+ #for refresh backup blocks, we must increase
+ #vol_byte_size to include the backup block.
+ blkcount=`expr $vol_byte_size / $blocksize + $bpc`
+ test_tunefs_refresh
+
+ vol_byte_size=`expr $vol_byte_size \* 4`
+ last_backup_num=`expr $last_backup_num + 1`
+
+ if [ `expr $last_backup_num` -gt `expr $MAX_NUM` ]; then
+ break
+ fi
+ done
+ done
+done
More information about the Ocfs2-tools-devel
mailing list