3 # Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. All Rights Reserved.
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License as
7 # published by the Free Software Foundation.
9 # This program is distributed in the hope that it would be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write the Free Software Foundation,
16 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19 # Functions useful for xfsdump/xfsrestore tests
22 # --- initializations ---
25 if [ -n "$DEBUGDUMP" ]; then
30 # Use dump/restore in qa directory (copy them here) for debugging
31 export PATH="$here:$PATH"
32 export __XFSDUMP_PROG="`set_prog_path xfsdump`"
33 export XFSDUMP_PROG="$__XFSDUMP_PROG -e"
34 export XFSRESTORE_PROG="`set_prog_path xfsrestore`"
35 export XFSINVUTIL_PROG="`set_prog_path xfsinvutil`"
36 [ -x $here/xfsdump ] && echo "Using xfstests' xfsdump for debug"
37 [ -x $here/xfsrestore ] && echo "Using xfstests' xfsrestore for debug"
38 [ -x $here/xfsinvutil ] && echo "Using xfstests' xfsinvutil for debug"
41 [ "$XFSDUMP_PROG" = "" ] && _notrun "xfsdump not found"
42 [ "$XFSRESTORE_PROG" = "" ] && _notrun "xfsrestore not found"
43 [ "$XFSINVUTIL_PROG" = "" ] && _notrun "xfsinvutil not found"
45 # status returned for not run tests
48 # name those directories
49 dump_file=$tmp.dumpfile
50 # dump_file=$here/dumpfile #TEMP OVERRIDE DUMP FILE
52 dump_dir=$SCRATCH_MNT/$dump_sdir
53 restore_sdir=restoredir
54 restore_dir=$SCRATCH_MNT/$restore_sdir
57 media_label="stress_tape_media"
58 session_label="stress_$seq"
60 nobody=4 # define this uid/gid as a number
61 do_quota_check=true # do quota check if quotas enabled
66 trap "_cleanup; exit \$status" 0 1 2 3 15
68 # start inventory from a known base - move it aside for test
69 for dir in /var/xfsdump/inventory /var/lib/xfsdump/inventory; do
71 [ -d $dir.$seq ] && rm -rf $dir.$seq
77 [ `uname` = "Linux" ] && have_mtvariable=true
80 _require_multi_stream()
82 $XFSDUMP_PROG -JF -f /dev/null -f /dev/null 2> /dev/null |
83 grep -q "too many -f arguments" &&
84 _notrun "xfsdump multi-stream support required"
87 _require_legacy_v2_format()
90 grep -q "generate format 2 dump" ||
91 _notrun "xfsdump -K option required"
93 $XFSRESTORE_PROG 2>&1 |
94 grep -q "force use of format 2 generation" ||
95 _notrun "xfsrestore -K option required"
99 # do a remote/local mt
106 _rmtdev=`echo $dumptape | $AWK_PROG -F: '{print $2}'`
108 if echo $dumptape | grep '@' >/dev/null; then
109 _spec=`echo $dumptape | $AWK_PROG -F: '{print $1}'`
110 _rmtuser=`echo $_spec | $AWK_PROG -F@ '{print $1}'`
111 _rmthost=`echo $_spec | $AWK_PROG -F@ '{print $2}'`
112 rsh -n -l $_rmtuser $_rmthost "mt -t $_rmtdev $op"
114 _rmthost=`echo $dumptape | $AWK_PROG -F: '{print $1}'`
115 rsh -n $_rmthost "mt -t $_rmtdev $op"
127 while [ $i -lt $_limit ]; do
128 echo "Checking online..." >>$seqres.full
129 if _mt status >$tmp.status 2>&1; then
138 if [ $i -eq $_limit ]; then
139 echo "ERROR: mt -f $dumptape failed"
142 echo "mt -f $dumptape failed" >$seq.notrun
148 if egrep -i 'onl|ready' $tmp.status | grep -iv 'not ready' >/dev/null; then
151 echo "ERROR: $dumptape is not online"
154 echo "dumptape, $dumptape, is not online" >$seq.notrun
162 echo "Wait for tape, $dumptape, ..." >>$seqres.full
165 while [ $i -lt 20 ]; do
166 echo "Checking status..." >>$seqres.full
167 if _mt status 2>&1 | tee -a $seqres.full | egrep -i "onl|ready" >/dev/null; then
177 # Keep trying so we know we really have rewound
181 echo "Initiate rewind..." >>$seqres.full
183 _mt rewind >/dev/null
188 # Do a custom erase because:
189 # (i) some machines don't support it
190 # (ii) some machines take forever to do it
194 echo "Erasing tape" | tee -a $seqres.full
202 echo "Erasing tape" | tee -a $seqres.full
208 echo $dumptape | grep ':' >/dev/null
216 $have_mtvariable || return
222 echo "Put scsi tape driver into variable block size mode"
223 mt -f $dumptape setblk 0
231 if [ -z "$dumptape" -o "@" == "$dumptape" ]; then
232 echo "This test requires a dump tape - none was specified"
233 echo "No dump tape specified" >$seqres.notrun
246 _scratch_mkfs_xfs >>$seqres.full || _fail "mkfs failed"
247 _scratch_mount >>$seqres.full || _fail "mount failed"
251 # Cleanup created dirs and files
256 # Some tests include this before checking _supported_fs xfs
257 # and the sleeps & checks here get annoying
258 if [ "$FSTYP" != "xfs" ]; then
265 if [ -n "$DEBUGDUMP" ]; then
266 # save it for inspection
267 for dir in /var/xfsdump/inventory /var/lib/xfsdump/inventory; do
268 [ -d $dir ] || continue
269 tar -cvf $seqres.inventory.tar $dir
270 ls -nR $dir >$seqres.inventory.ls
274 # put inventory dir back
275 for dir in /var/xfsdump/inventory /var/lib/xfsdump/inventory; do
276 [ -d $dir.$seq ] || continue
277 rm -rf $dir # get rid of new one
281 if [ $status -ne $NOTRUNSTS ]; then
282 # Sleep added to stop _check_scratch_fs from complaining that the
283 # scratch_dev is still busy
291 # ensure that bulkstat data will
292 # match with incore data
293 # by forcing disk data to be written out
297 _saveddir=`pwd`; cd /
298 umount $SCRATCH_MNT >>$seqres.full || _fail "unmount failed"
299 _scratch_mount >>$seqres.full || _fail "mount failed"
304 # Run fsstress to create a mixture of
305 # files,dirs,links,symlinks
307 # Pinched from test 013.
309 _create_dumpdir_stress()
311 echo "Creating directory system to dump using fsstress."
315 _param="-f link=10 -f creat=10 -f mkdir=10 -f truncate=5 -f symlink=10"
318 if ! mkdir $dump_dir; then
319 echo " failed to mkdir $dump_dir"
324 echo "-----------------------------------------------"
325 echo "fsstress : $_param"
326 echo "-----------------------------------------------"
327 if ! $here/ltp/fsstress $_param -s 1 $FSSTRESS_AVOID -n $_count -d $dump_dir >$tmp.out 2>&1
329 echo " fsstress (count=$_count) returned $? - see $seqres.full"
331 echo "--------------------------------------" >>$seqres.full
332 echo "output from fsstress:" >>$seqres.full
333 echo "--------------------------------------" >>$seqres.full
334 cat $tmp.out >>$seqres.full
343 cat <<End-of-File >$tmp.config
344 # pathname size in bytes owner group
346 small 10 $nobody $nobody
347 big 102400 daemon sys
349 sub/big 102400 $nobody sys
351 sub/a 1 $nobody $nobody
352 sub/b 2 $nobody $nobody
353 sub/c 4 $nobody $nobody
354 sub/d 8 $nobody $nobody
355 sub/e 16 $nobody $nobody
356 sub/f 32 $nobody $nobody
357 sub/g 64 $nobody $nobody
358 sub/h 128 $nobody $nobody
359 sub/i 256 $nobody $nobody
360 sub/j 512 $nobody $nobody
361 sub/k 1024 $nobody $nobody
362 sub/l 2048 $nobody $nobody
363 sub/m 4096 $nobody $nobody
364 sub/n 8192 $nobody $nobody
366 sub/a00 100 $nobody $nobody
367 sub/b00 200 $nobody $nobody
368 sub/c00 400 $nobody $nobody
369 sub/d00 800 $nobody $nobody
370 sub/e00 1600 $nobody $nobody
371 sub/f00 3200 $nobody $nobody
372 sub/g00 6400 $nobody $nobody
373 sub/h00 12800 $nobody $nobody
374 sub/i00 25600 $nobody $nobody
375 sub/j00 51200 $nobody $nobody
376 sub/k00 102400 $nobody $nobody
377 sub/l00 204800 $nobody $nobody
378 sub/m00 409600 $nobody $nobody
379 sub/n00 819200 $nobody $nobody
381 sub/a000 1000 $nobody $nobody
382 sub/e000 16000 $nobody $nobody
383 sub/h000 128000 $nobody $nobody
384 sub/k000 1024000 $nobody $nobody
390 cat <<End-of-File >$tmp.config
391 # pathname size in bytes
393 smalll 10 $nobody $nobody
394 biggg 102400 $nobody $nobody
395 sub/smalll 10 $nobody $nobody
396 sub/biggg 102400 $nobody $nobody
400 _mk_fillconfig_perm()
402 # dir_guid: ugo=rwx,g+s on dir is for IRIX chmod(1)
404 cat <<End-of-File >$tmp.config
405 # pathname size/dir user group mode
407 file_suid 10 $nobody $nobody 04777
408 file_guid 10 $nobody $nobody 02777
409 file_sticky 10 $nobody $nobody 01777
410 file_mix1 10 $nobody $nobody 761
411 file_mix2 10 $nobody $nobody 642
412 dir_suid d $nobody $nobody 04777
413 dir_guid d $nobody $nobody ugo=rwx,g+s
414 dir_sticky d $nobody $nobody 01777
415 dir_mix1 d $nobody $nobody 761
416 dir_mix2 d $nobody $nobody 642
422 cat <<End-of-File >$tmp.config
423 # pathname size user group perm name value namespace
425 smalll 10 $nobody $nobody 777 attr1 some_text user
426 biggg 102400 $nobody $nobody 777 attr2 some_text2 root
427 sub/smalll 10 $nobody $nobody 777 attr3 some_text3 user
428 sub/biggg 102400 $nobody $nobody 777 attr4 some_text4 root
429 dir d $nobody $nobody 777 attr5 dir_text user
431 # Add more files so that there are more than the number
433 # There are bugs in dump/restore for # non-dir files < # streams
434 # It can be tested in another configuration.
435 # It is a pathalogical case.
437 sub/a 1 $nobody $nobody
438 sub/b 2 $nobody $nobody
439 sub/c 4 $nobody $nobody
440 sub/d 8 $nobody $nobody
441 sub/e 16 $nobody $nobody
442 sub/f 32 $nobody $nobody
443 sub/g 64 $nobody $nobody
444 sub/h 128 $nobody $nobody
445 sub/i 256 $nobody $nobody
446 sub/j 512 $nobody $nobody
447 sub/k 1024 $nobody $nobody
448 sub/l 2048 $nobody $nobody
449 sub/m 4096 $nobody $nobody
450 sub/n 8192 $nobody $nobody
455 # extended file attribute flags
457 _mk_fillconfig_xattr()
459 cat <<End-of-File >$tmp.config
460 # pathname size user group perm name
462 xflag_realtime 10 $nobody $nobody 777 XFS_XFLAG_REALTIME
463 xflag_prealloc 10 $nobody $nobody 777 XFS_XFLAG_PREALLOC
464 xflag_immutable 10 $nobody $nobody 777 XFS_XFLAG_IMMUTABLE
465 xflag_append 10 $nobody $nobody 777 XFS_XFLAG_APPEND
466 xflag_sync 10 $nobody $nobody 777 XFS_XFLAG_SYNC
467 xflag_noatime 10 $nobody $nobody 777 XFS_XFLAG_NOATIME
468 xflag_nodump 10 $nobody $nobody 777 XFS_XFLAG_NODUMP
469 xflag_hasattr 10 $nobody $nobody 777 XFS_XFLAG_HASATTR
474 # Create a bunch of directories/files of different sizes
477 # Pinched from test 001.
479 _do_create_dumpdir_fill()
481 echo "Creating directory system to dump using src/fill."
483 mkdir -p $dump_dir || _fail "cannot mkdir \"$dump_dir\""
486 $verbose && echo -n "Setup "
487 sed -e '/^#/d' $tmp.config \
488 | while read file nbytes owner group perms ea_name ea_value namespace
490 if [ $nbytes = "d" ]; then
500 echo "Error: cannot mkdir \"$dir\""
505 # create a directory/file
516 echo "Error: cannot mkdir \"$dir\""
522 if $here/src/fill $file $file $nbytes
527 echo "Error: cannot create \"$file\""
531 if [ -n "$owner" -a -n "$group" ]; then
532 chown $owner.$group $file
534 if [ -n "$perms" ]; then
538 # extended attributes (EA)
539 if [ -n "$ea_name" -a -n "$ea_value" ]; then
540 if [ "X$namespace" = "Xroot" ]; then
541 attr -R -s $ea_name -V $ea_value $file
543 attr -s $ea_name -V $ea_value $file
545 # extended file attribute flags - no value - NOT EAs
546 elif [ -n "$ea_name" -a -z "$ea_value" ]; then
549 # use xfs_io to send the ioctl
552 $verbose && echo -n "."
559 _mk_fillconfig_multi()
562 cat <<End-of-File >>$tmp.config
563 # pathname size in bytes
565 large000 8874368 $nobody $nobody
566 large111 2582912 $nobody $nobody
567 large222 7825792 $nobody $nobody
571 _create_dumpdir_largefile()
574 mkdir -p $dump_dir || _fail "cannot mkdir \"$dump_dir\""
575 _largesize=4294967297
576 _largefile=$dump_dir/largefile
577 echo "dd a largefile at offset $_largesize"
578 POSIXLY_CORRECT=yes \
579 dd if=/dev/zero of=$_largefile bs=1 seek=$_largesize count=10 2>&1
583 _create_dumpdir_fill()
587 _do_create_dumpdir_fill
591 _create_dumpdir_fill2()
595 _do_create_dumpdir_fill
599 _create_dumpdir_fill_perm()
603 _do_create_dumpdir_fill
607 _create_dumpdir_fill_ea()
611 _do_create_dumpdir_fill
616 # Create enough files, and a few large enough files, so that
617 # some files are likely to be split across streams.
619 _create_dumpdir_fill_multi()
623 _do_create_dumpdir_fill
628 # Append a subset of the fill'ed files
629 # So we can see if just these get dumped on an incremental
631 _append_dumpdir_fill()
634 cat <<End-of-File >$tmp.config
644 sed -e '/^#/d' $tmp.config \
647 echo 'Extra text' >>$file
654 _do_create_dump_symlinks()
656 echo "Creating directory system of symlinks to dump."
658 mkdir -p $dump_dir || _fail "cannot mkdir \"$dump_dir\""
661 $verbose && echo -n "Setup "
662 sed -e '/^#/d' $tmp.config \
663 | while read file nbytes owner group owner2 group2 perms perms2
675 echo "Error: cannot mkdir \"$dir\""
683 # Do chmod on symlink using umask.
684 # This won't do the right thing as it subtracts permissions.
685 # However, I don't care, as long as I get some different perms
687 if [ -n "$perms2" ]; then
691 ln -s $file $file-link
692 if [ -n "$perms2" ]; then
696 if [ -n "$owner" -a -n "$group" ]; then
697 chown $owner.$group $file
699 if [ -n "$owner" -a -n "$group" ]; then
700 chown -h $owner.$group $file-link
702 if [ -n "$perms" ]; then
705 $verbose && echo -n "."
714 cat <<End-of-File >$tmp.config
715 # path size owner1 group1 owner2 group2 perm1 perm2
717 a 0 $nobody $nobody daemon sys 124 421
718 b 0 daemon sys bin bin 347 743
719 sub/a 0 bin bin $nobody sys 777 777
720 sub/b 0 $nobody sys $nobody $nobody 367 763
724 _create_dumpdir_symlinks()
728 _do_create_dump_symlinks
733 # create hardlinks of form $_fname, $_fname_h1 $_fname_h2 ...
742 while [ $_j -le $_numlinks ]; do
744 _hardlink=$_fname$_suffix
745 echo "creating hardlink $_hardlink to $_fname"
746 ln $_fname $_hardlink
752 # create a set of hardlinks
753 # create hardlinks of form file1, file1_h1 file1_h2 ...
754 # create hardlinks of form file2, file2_h1 file2_h2 ...
755 # create hardlinks of form file3, file3_h1 file3_h2 ...
761 while [ $_i -le $_numsets ]; do
762 _create_hardlinks file$_i 5
771 echo "mod level $_level" >$dump_dir/file$_level
774 _create_dumpdir_hardlinks()
778 echo "Creating directory system of hardlinks to incrementally dump."
780 mkdir -p $dump_dir || _fail "cannot mkdir \"$dump_dir\""
783 _create_hardset $_numsets
791 # Filter out times and dates on symlinks and char devices.
792 # Filter out size on directories because this can differ
793 # when transitioning to long inode numbers (ie. 64 bits).
798 /^l/ { date = $8; time = $7; sub(date,"DATE"); sub(time,"TIME"); print}
799 /^c/ { date = $9; time = $7; sub(date,"DATE"); sub(time,"TIME"); print}
800 /^d/ { size = $5; sub(size,"SIZE"); print}
802 | sed -e 's/total [0-9][0-9]*/total TOTAL/'
806 # Filtering of Irix character hwgraph device names
808 # chardev: /hw/node/xtalk/15/pci/0/scsi_ctlr/0/target/1/lun/0/disk/partition/4/char
809 # blkdev: /dev/dsk/dks0d1s4
815 sub(/\/hw.*scsi_ctlr\//,"/dev/dsk/dks") # blah blah /dev/dsk/dks0/target/1/....
816 sub(/\/target\//,"d") # blah blah /dev/dsk/dks0d1/lun/0/disk.....
817 sub(/\/lun.*partition\//,"s") # blah blah /dev/dsk/dks0d1s4/char
818 sub(/\/char/,"") # blah blah /dev/dsk/dks0d1s4
826 # Filter out the non-deterministic dump msgs from
827 # xfsdump and xfsrestore
833 -e "s#$__XFSDUMP_PROG#xfsdump#" \
834 -e "s#$XFSRESTORE_PROG#xfsrestore#" \
835 -e "s#$XFSINVUTIL_PROG#xfsinvutil#" \
836 -e "s/`hostname`/HOSTNAME/" \
837 -e "s#$SCRATCH_DEV#SCRATCH_DEV#" \
838 -e "s#$SCRATCH_RAWDEV#SCRATCH_DEV#" \
839 -e "s#$dumptape#TAPE_DEV#" \
840 -e "s#$SCRATCH_MNT#SCRATCH_MNT#" \
841 -e "s#$dump_file#DUMP_FILE#" \
842 -e 's#/var/lib/xfsdump#/var/xfsdump#' \
843 -e 's/session id:[ ]*[0-9a-f-]*/session id: ID/' \
844 -e '/filesystem id:[ ]*[0-9a-f-]*/d' \
845 -e 's/time:[ ].*/time: TIME/' \
846 -e 's/date:[ ].*/date: DATE/' \
847 -e 's/dump begun .*/dump begun DATE/' \
848 -e 's/previously begun .*/previously begun DATE/' \
849 -e 's/[0-9][0-9]* seconds/SECS seconds/' \
850 -e 's/restore.[0-9][0-9]*/restore.PID/' \
851 -e 's/ino [0-9][0-9]*/ino INO/g' \
852 -e '/stream [0-9]:/s/offset [0-9][0-9]*/offset NUM/g' \
853 -e '/: dump size/s/[0-9][0-9]*/NUM/' \
854 -e '/dump size:/s/[0-9][0-9]*/NUM/' \
855 -e '/dump size per stream:/s/[0-9][0-9]*/NUM/' \
856 -e 's/\(media file size[ ]*\)[0-9][0-9]*/\1NUM/' \
857 -e 's/\(mfile size:[ ]*\)[0-9][0-9]*/\1NUM/' \
858 -e '/drive[ ]*[0-9][0-9]*:/d' \
860 -e '/inventory session uuid/d' \
861 -e '/ - Running single-threaded/d' \
862 -e '/Mount point match/d' \
863 -e '/^.*I\/O metrics: .*$/d' \
864 -e 's/1048576/BLOCKSZ/' \
865 -e 's/2097152/BLOCKSZ/' \
866 -e 's/(pid[ ]*[1-9][0-9]*)/\(pid PID\)/' \
867 -e '/version [3-9]\.[0-9]/d' \
868 -e 's/\/hw\/module.*$/SCRATCH_DEV/' \
869 -e 's/xfsdump: ino map phase 1: .*/xfsdump: ino map <PHASES>/' \
870 -e '/xfsdump: ino map phase [2]/,1d' \
871 -e '/xfsdump: ino map phase [3]/,1d' \
872 -e '/xfsdump: ino map phase [4]/,1d' \
873 -e '/xfsdump: ino map phase [5]/,1d' \
874 -e 's/id:[[:space:]]*[0-9a-f]\{8\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{4\}-[0-9a-f]\{12\}/ID: ID/' \
875 -e 's/\[y\/n\][- ]----------------------*/\[y\/n\]/' \
876 -e '/skip attribute set/d' \
878 # filter out all the output between the lines "Dump Summary:"
880 if ($_ =~ /(?:Dump|Restore) Summary/) {
882 } elsif ($_ =~ /(?:Dump|Restore) Status/) {
885 print if (! $skip);' \
887 # correct the file count if large scratch devices are being used
889 if ($_ =~ /(\S+) directories and (\S+) entries/) {
891 if ($ENV{'LARGE_SCRATCH_DEV'} && $foo > 0) {
894 printf("xfsrestore: %u directories and %u entries processed\n",
905 _dump_filter_main | _check_quota_dumprestore | _check_quota_entries
915 -e 's/UUID[ ]*:[ ][0-9a-f-]*/UUID : ID/' \
916 -e 's/TIME OF DUMP[ ]*:.*/TIME OF DUMP : TIME/' \
917 -e 's/HOSTNAME:SCRATCH_MNT.*/HOSTNAME:SCRATCH_MNT/' \
918 -e 's#inventory/[0-9a-f-]*#inventory/UUID#' \
926 -e "s#$dump_file#DUMP_FILE#g" \
927 -e "s#$SCRATCH_DEV#SCRATCH_DEV#" \
928 -e "s#$SCRATCH_RAWDEV#SCRATCH_DEV#" \
929 -e "s#$dumptape#TAPE_DEV#" \
930 -e "s#$dump_dir#DUMP_DIR#g" \
931 -e "s#$restore_dir#RESTORE_DIR#g" \
932 -e "s#$SCRATCH_MNT#SCRATCH_MNT#g" \
933 -e "s#$dump_sdir#DUMP_SUBDIR#g" \
934 -e "s#$restore_sdir#RESTORE_SUBDIR#g" \
936 -e "/Only in SCRATCH_MNT: .use_space/d" \
941 # Parse xfsdump arguments.
942 # Note: requires a space between option letter and argument
953 [ -z "$2" ] && _fail "missing argument for -f"
959 [ -z "$2" ] && _fail "missing argument for -L"
964 [ -z "$2" ] && _fail "missing argument for --multi"
975 dump_args="$dump_args $1"
978 [ -z "$2" ] && _fail "missing argument for $1"
979 dump_args="$dump_args $1$2"
983 _fail "invalid argument to common.dump function: $1"
991 # Parse xfsrestore arguments.
992 # Note: requires a space between option letter and argument
994 _parse_restore_args()
1003 [ -z "$2" ] && _fail "missing argument for -f"
1009 [ -z "$2" ] && _fail "missing argument for -L"
1014 [ -z "$2" ] && _fail "missing argument for --multi"
1022 do_quota_check=false
1025 restore_args="$restore_args $1"
1028 _fail "invalid argument to common.dump function: $1"
1043 echo "Dumping to tape..."
1044 opts="$_dump_debug$dump_args -s $dump_sdir -f $dumptape -M $media_label -L $session_label $SCRATCH_MNT"
1045 echo "xfsdump $opts" | _dir_filter
1046 $XFSDUMP_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1056 echo "Dumping to tape..."
1057 opts="$_dump_debug$dump_args -f $dumptape -M $media_label -L $session_label $SCRATCH_MNT"
1058 echo "xfsdump $opts" | _dir_filter
1059 $XFSDUMP_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1064 # Do full dump with -m
1070 echo "Dumping to tape..."
1072 opts="$_dump_debug$dump_args -m -b $onemeg -l0 -f $dumptape -M $media_label -L $session_label $SCRATCH_MNT"
1073 echo "xfsdump $opts" | _dir_filter
1074 $XFSDUMP_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1079 # Do full dump to file
1085 echo "Dumping to file..."
1086 opts="$_dump_debug$dump_args -f $dump_file -M $media_label -L $session_label $SCRATCH_MNT"
1087 echo "xfsdump $opts" | _dir_filter
1088 $XFSDUMP_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1092 # Do full dump to multiple files
1094 _do_dump_multi_file()
1101 while [ $i -lt $multi ]
1103 multi_args="$multi_args -f $dump_file.$i -M $media_label.$i"
1107 echo "Dumping to files..."
1108 opts="$_dump_debug$dump_args $multi_args -L $session_label $SCRATCH_MNT"
1109 echo "xfsdump $opts" | _dir_filter
1110 $XFSDUMP_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1114 _prepare_restore_dir()
1117 mkdir $restore_dir || _fail "failed to mkdir $restore_dir"
1122 # Get tape ready and restore dir
1126 _prepare_restore_dir
1128 echo "Rewinding tape"
1133 # Restore the tape into $restore_dir
1137 _parse_restore_args $*
1140 echo "Restoring from tape..."
1141 opts="$_restore_debug$restore_args -f $dumptape -L $session_label $restore_dir"
1142 echo "xfsrestore $opts" | _dir_filter
1143 $XFSRESTORE_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1147 # Restore the tape into $restore_dir using -m
1151 _parse_restore_args $*
1154 echo "Restoring from tape..."
1156 opts="$_restore_debug$restore_args -m -b $onemeg -f $dumptape -L $session_label $restore_dir"
1157 echo "xfsrestore $opts" | _dir_filter
1158 $XFSRESTORE_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1162 # Restore the tape from a dump file
1166 _parse_restore_args $*
1167 _prepare_restore_dir
1169 echo "Restoring from file..."
1170 opts="$_restore_debug$restore_args -f $dump_file -L $session_label $restore_dir"
1171 echo "xfsrestore $opts" | _dir_filter
1172 $XFSRESTORE_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1176 # Cumulative restore from a file
1177 # Must call _prepare_restore_dir before the first
1178 # (and only the first) call to this function.
1180 _do_restore_file_cum()
1182 _parse_restore_args $*
1184 echo "Restoring cumumlative from file..."
1185 opts="$_restore_debug$restore_args -f $dump_file -r $restore_dir"
1186 echo "xfsrestore $opts" | _dir_filter
1187 $XFSRESTORE_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1192 _parse_restore_args $*
1194 echo "Contents of dump ..."
1195 opts="$_restore_debug$restore_args -f $dump_file -t"
1196 echo "xfsrestore $opts" | _dir_filter
1197 cd $SCRATCH_MNT # for IRIX which needs xfs cwd
1198 $XFSRESTORE_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter_main |\
1199 _check_quota_file |\
1200 _check_quota_entries |\
1201 $AWK_PROG 'NF != 1 { print; next }
1202 {files = sprintf("%s\n%s", files, $1)}
1203 END { print files | "sort" } '
1204 # the above awk code is to alpha sort only the output
1205 # of files (and not the verbose restore msgs)
1210 # Restore the tape from multiple dump files
1212 _do_restore_multi_file()
1214 _parse_restore_args $*
1215 _prepare_restore_dir
1220 while [ $i -lt $multi ]
1222 multi_args="$multi_args -f $dump_file.$i"
1226 echo "Restoring from file..."
1227 opts="$_restore_debug$restore_args $multi_args -L $session_label $restore_dir"
1228 echo "xfsrestore $opts" | _dir_filter
1229 $XFSRESTORE_PROG $opts 2>&1 | tee -a $seqres.full | _dump_filter
1233 # Do xfsdump piped into xfsrestore - xfsdump | xfsrestore
1234 # Pass dump options in $1 and restore options in $2, if required. e.g.:
1235 # _do_dump_restore "-o -F" "-R"
1236 # _do_dump_restore "" "-R"
1238 # Use -s as we want to dump and restore to the same xfs partition
1243 _parse_restore_args $2
1244 _prepare_restore_dir
1245 echo "xfsdump|xfsrestore ..."
1246 restore_opts="$_restore_debug$restore_args - $restore_dir"
1247 dump_opts="$_dump_debug$dump_args -s $dump_sdir - $SCRATCH_MNT"
1248 echo "xfsdump $dump_opts | xfsrestore $restore_opts" | _dir_filter
1249 $XFSDUMP_PROG $dump_opts 2>$tmp.dump.mlog | $XFSRESTORE_PROG $restore_opts 2>&1 | tee -a $seqres.full | _dump_filter
1250 _dump_filter <$tmp.dump.mlog
1254 # Compare dumped subdirectory with restored dir
1256 # Thus no contents are compared but permissions, sizes,
1257 # owners, etc... are.
1262 # verify we got back what we dumped
1264 echo "Comparing listing of dump directory with restore directory"
1265 ls -nR $dump_dir | tee -a $seqres.full | _ls_filter >$tmp.dump_dir
1266 ls -nR $restore_dir/$dump_sdir | tee -a $seqres.full | _ls_filter \
1267 | sed -e "s#$restore_sdir\/##" >$tmp.restore_dir
1269 diff -bcs $tmp.dump_dir $tmp.restore_dir | sed -e "s#$tmp#TMP#g"
1273 # filter out the date fields
1277 $AWK_PROG 'NF == 9 { print $1, $2, $3, $4, $9 }'
1281 # _ls_compare_sub but don't compare dates
1282 _ls_nodate_compare_sub()
1285 # verify we got back what we dumped
1287 echo "Comparing listing of dump directory with restore directory"
1288 ls -nR $dump_dir | tee -a $seqres.full | _ls_filter | _ls_nodate_filter >$tmp.dump_dir
1289 ls -nR $restore_dir/$dump_sdir | tee -a $seqres.full | _ls_filter \
1290 | _ls_nodate_filter | sed -e "s#$restore_sdir\/##" >$tmp.restore_dir
1292 diff -bcs $tmp.dump_dir $tmp.restore_dir | sed -e "s#$tmp#TMP#g"
1296 # Compare using recursive diff the files of the dumped
1298 # This one will compare the contents.
1302 echo "Comparing dump directory with restore directory"
1303 diff -rs $dump_dir $restore_dir/$dump_sdir | _dir_filter
1310 # Tim - this is the IRIX way...
1311 # find $_path -exec attr -l {} \; |\
1312 # awk '{print $9, $2}' |\
1315 # and this is now the Linux way...
1317 getfattr --absolute-names -Rh -m user $_path |\
1319 if (m/^# file: (\S+)/) { $file = $1 }
1320 elsif (m/^user\.(\w+)/) { print $file, " ",$1,"\n" }' |\
1322 while read file ea_name; do
1323 attr -g $ea_name $file
1326 if [ "$USE_ATTR_SECURE" = yes ]; then
1327 echo "Security names"
1328 getfattr --absolute-names -Rh -m security $_path |\
1330 if (m/^# file: (\S+)/) { $file = $1 }
1331 elsif (m/^security\.(\w+)/) { print $file, " ",$1,"\n" }' |\
1333 while read file ea_name; do
1334 attr -g $ea_name $file
1339 getfattr --absolute-names -Rh -m trusted $_path |\
1341 if (m/^# file: (\S+)/) { $file = $1 }
1342 elsif (m/^trusted\.(\w+)/) { print $file, " ",$1,"\n" }' |\
1344 while read file ea_name; do
1345 attr -R -g $ea_name $file
1350 # Compare the extended attributes of the files/dirs
1351 # b/w the dumped and restore dirs.
1354 # Attribute "attr5" had a 8 byte value for /spare1/dump.5460/dir:
1355 # Attribute "attr5" had a 8 byte value for /spare1/restore.5460/dump.5460/dir:
1359 echo "Comparing dump directory with restore directory"
1360 echo "Looking at the extended attributes (EAs)"
1362 _get_eas_on_path $dump_dir | tee $seqres.ea1 | _dir_filter
1363 echo "EAs on restore"
1364 _get_eas_on_path $restore_dir/$dump_sdir \
1365 | sed -e "s#$restore_sdir\/##" \
1368 diff -s $seqres.ea1 $seqres.ea2
1373 # Compare using recursive diff the files of the dumped
1378 echo "Comparing dump directory with restore directory"
1379 diff -rs $SCRATCH_MNT $restore_dir | _dir_filter | _check_quota_diff
1383 # Check out the dump inventory
1387 $XFSDUMP_PROG $_dump_debug -I | tee -a $seqres.full | _dump_filter_main
1391 # Do the xfsinvutil cmd with debug and filters
1392 # Need to set variable: "$middate" to the invutil date
1397 echo "xfsinvutil $_invutil_debug -M $host:$SCRATCH_MNT \"$middate\" $*" >$seqres.full
1398 $XFSINVUTIL_PROG $_invutil_debug $* -M $host:$SCRATCH_MNT "$middate" \
1399 | tee -a $seqres.full | _invutil_filter
1403 # ensure we can find the user quota msg if user quotas are on
1404 # ensure we can find the group quota msg if group quotas are on
1414 $here/src/feature -U $SCRATCH_DEV && uquota=1
1415 $here/src/feature -G $SCRATCH_DEV && gquota=1
1416 $here/src/feature -P $SCRATCH_DEV && pquota=1
1418 $AWK_PROG -v uquota=$uquota -v gquota=$gquota -v pquota=$pquota \
1419 -v full=$seqres.full -v usermsg="$usermsg" \
1420 -v groupmsg="$groupmsg" -v projectmsg="$projectmsg" '
1422 print "Found project quota:", $0 >>full
1425 print "Found extra:", $0
1430 print "Found group quota:", $0 >>full
1433 print "Found extra:", $0
1438 print "Found user quota:", $0 >>full
1441 print "Found extra:", $0
1447 if (uquota && !found_uquota) {
1448 print "Missing user quota msg:", usermsg
1450 if (gquota && !found_gquota) {
1451 print "Missing group quota msg:", groupmsg
1453 if (pquota && !found_pquota) {
1454 print "Missing project quota msg:", projectmsg
1461 # xfsrestore: 3 directories and 40 entries processed
1463 # num entries needs to be reduced by num quota file(s)
1465 _check_quota_entries()
1470 $here/src/feature -U $SCRATCH_DEV && uquota=1
1471 $here/src/feature -G $SCRATCH_DEV && gquota=1
1472 $here/src/feature -P $SCRATCH_DEV && pquota=1
1473 $AWK_PROG -v uquota=$uquota -v gquota=$gquota -v pquota=$pquota '
1474 /entries processed/ {
1484 # xfsdump: saving user quota information for: SCRATCH_MNT
1485 # xfsdump: saving group quota information for: SCRATCH_MNT
1486 # xfsdump: saving project quota information for: SCRATCH_MNT
1487 # xfsrestore: user quota information written to ...'
1488 # xfsrestore: group quota information written to ...'
1489 # xfsrestore: project quota information written to ...'
1491 # If on IRIX then look for:
1492 # xfsrestore: use 'edquota' to restore quotas
1494 # xfsrestore: use 'xfs_quota' to restore quotas
1496 _check_quota_dumprestore()
1498 if [ "$HOSTOS" == "IRIX" ]; then
1499 _check_quota 'user quota information' \
1500 'group quota information' \
1501 'project quota information' | \
1502 sed "/xfsrestore:.*use 'edquota' to restore quotas/d"
1504 _check_quota 'user quota information' \
1505 'group quota information' \
1506 'project quota information' | \
1507 sed "/xfsrestore:.*use 'xfs_quota' to restore quotas/d"
1513 # Only in RESTORE_DIR: xfsdump_quotas
1514 # Only in RESTORE_DIR: xfsdump_quotas_group
1515 # Only in RESTORE_DIR: xfsdump_quotas_project
1519 _check_quota 'Only in RESTORE_DIR: xfsdump_quotas' \
1520 'Only in RESTORE_DIR: xfsdump_quotas_group' \
1521 'Only in RESTORE_DIR: xfsdump_quotas_proj'
1525 # Look for the quota file in the output
1526 # Ensure that it is there if it should be
1527 # Filter it out so that the output is always the same
1528 # even with no quotas
1532 _check_quota 'xfsdump_quotas' 'xfsdump_quotas_group' 'xfsdump_quotas_proj'
1536 # make sure this script returns success