| #! /bin/bash | |
| # FS QA Test No. 065 | |
| # | |
| # Testing incremental dumps and cumulative restores with | |
| # "adding, deleting, renaming, linking, and unlinking files and | |
| # directories". | |
| # Do different operations for each level. | |
| # | |
| #----------------------------------------------------------------------- | |
| # Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. | |
| # | |
| # This program is free software; you can redistribute it and/or | |
| # modify it under the terms of the GNU General Public License as | |
| # published by the Free Software Foundation. | |
| # | |
| # This program is distributed in the hope that it would be useful, | |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| # GNU General Public License for more details. | |
| # | |
| # You should have received a copy of the GNU General Public License | |
| # along with this program; if not, write the Free Software Foundation, | |
| # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | |
| # | |
| #----------------------------------------------------------------------- | |
| # | |
| # creator | |
| owner=tes@sgi.com | |
| seq=`basename $0` | |
| echo "QA output created by $seq" | |
| here=`pwd` | |
| tmp=/tmp/$$ | |
| status=1 # failure is the default! | |
| trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15 | |
| # get standard environment, filters and checks | |
| . ./common.rc | |
| . ./common.filter | |
| . ./common.dump | |
| # | |
| # list recursively the directory | |
| # | |
| # e.g. lstat output: src/lstat64 31056 -rwxr-xr-x 38403,0 | |
| # Don't print out sizes of directories - which can vary - overwrite with XXX. | |
| # | |
| _list_dir() | |
| { | |
| __dir=$1 | |
| find $__dir -exec $here/src/lstat64 -t {} \; |\ | |
| sed -e 's/.*dumpdir/dumpdir/' -e '/^dumpdir /d' |\ | |
| sed -e 's/.*restoredir/restoredir/' -e '/^restoredir /d' |\ | |
| egrep -v 'housekeeping|dirattr|dirextattr|namreg|state|tree' |\ | |
| awk '$3 ~ /^d/ { $2 = "XXX" } {print}' |\ | |
| LC_COLLATE=POSIX sort | |
| } | |
| # real QA test starts here | |
| _supported_fs xfs | |
| _supported_os IRIX Linux | |
| # | |
| # too much hassle to get output matching with quotas turned on | |
| # so don't run it | |
| # | |
| umount $SCRATCH_DEV 2>/dev/null | |
| _scratch_mount | |
| $here/src/feature -U $SCRATCH_DEV && \ | |
| _notrun "UQuota enabled, test needs controlled xfsdump output" | |
| $here/src/feature -G $SCRATCH_DEV && \ | |
| _notrun "GQuota enabled, test needs controlled xfsdump output" | |
| $here/src/feature -P $SCRATCH_DEV && \ | |
| _notrun "PQuota enabled, test needs controlled xfsdump output" | |
| umount $SCRATCH_DEV | |
| # | |
| # adding - touch/echo, mkdir | |
| # deleting - rm, rmdir | |
| # renaming - mv | |
| # linking - ln | |
| # unlinking - rm | |
| # files and directories | |
| # | |
| _wipe_fs | |
| mkdir -p $dump_dir || _fail "cannot mkdir \"$dump_dir\"" | |
| cd $dump_dir | |
| echo "Do the incremental dumps" | |
| i=0 | |
| num_dumps=8 # do some extra to ensure nothing changes | |
| while [ $i -le $num_dumps ]; do | |
| cd $dump_dir | |
| case $i in | |
| 0) | |
| # adding | |
| echo 'add0' >addedfile0 | |
| echo 'add1' >addedfile1 | |
| echo 'add2' >addedfile2 | |
| echo 'add3' >addedfile3 | |
| mkdir addeddir1 | |
| mkdir addeddir2 | |
| mkdir addeddir3 | |
| mkdir addeddir4 | |
| echo 'add4' >addeddir3/addedfile4 | |
| echo 'add5' >addeddir4/addedfile5 | |
| ;; | |
| 1) | |
| # deleting | |
| rm addedfile2 | |
| rmdir addeddir2 | |
| rm -rf addeddir3 | |
| ;; | |
| 2) | |
| # renaming | |
| mv addedfile1 addedfile2 # rename to previous existing file | |
| mv addeddir4/addedfile5 addeddir4/addedfile4 | |
| mv addeddir4 addeddir6 | |
| mv addeddir1 addeddir2 # rename to previous existing dir | |
| ;; | |
| 3) | |
| # linking | |
| ln addedfile0 linkfile0 | |
| ln addedfile0 linkfile0_1 # have a 2nd link to file | |
| ln addedfile2 linkfile2 | |
| ln addeddir6/addedfile4 linkfile64 | |
| ;; | |
| 4) | |
| # unlinking | |
| rm linkfile0 # remove a link | |
| rm addedfile2 # remove original link | |
| rm linkfile64 # remove link | |
| rm addeddir6/addedfile4 # remove last link | |
| ;; | |
| 5) # link first - then onto 6) | |
| rm -rf * | |
| echo 'add6' >addedfile6 | |
| ln addedfile6 linkfile6_1 | |
| ln addedfile6 linkfile6_2 | |
| ln addedfile6 linkfile6_3 | |
| ;; | |
| 6) # then move the inode that the links point to | |
| mv addedfile6 addedfile6_mv | |
| rm linkfile6_1 | |
| rm linkfile6_2 | |
| rm linkfile6_3 | |
| ln addedfile6_mv linkfile6_mv_1 | |
| ln addedfile6_mv linkfile6_mv_2 | |
| ln addedfile6_mv linkfile6_mv_3 | |
| ;; | |
| esac | |
| cd $here | |
| sleep 2 | |
| _stable_fs | |
| echo "Listing of what files we have at level $i:" | |
| _list_dir $dump_dir | tee $tmp.ls.$i | |
| dump_file=$tmp.df.level$i | |
| _do_dump_file -l $i | |
| let i=$i+1 | |
| done | |
| echo "Look at what files are contained in the inc. dump" | |
| i=0 | |
| while [ $i -le $num_dumps ]; do | |
| echo "" | |
| echo "restoring from df.level$i" | |
| dump_file=$tmp.df.level$i | |
| _do_restore_toc | |
| let i=$i+1 | |
| done | |
| echo "Do the cumulative restores" | |
| i=0 | |
| while [ $i -le $num_dumps ]; do | |
| dump_file=$tmp.df.level$i | |
| echo "" | |
| echo "restoring from df.level$i" | |
| _do_restore_file_cum -l $i | |
| echo "list restore_dir" | |
| _list_dir $restore_dir | _check_quota_file | tee $tmp.restorals.$i | |
| let i=$i+1 | |
| done | |
| echo "" | |
| echo "Do the ls comparison" | |
| i=0 | |
| while [ $i -le $num_dumps ]; do | |
| echo "Comparing ls of FS with restored FS at level $i" | |
| diff -s $tmp.ls.$i $tmp.restorals.$i | sed "s#$tmp#TMP#g" | |
| echo "" | |
| let i=$i+1 | |
| done | |
| # success, all done | |
| status=0 | |
| exit |