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