|  | #! /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 |