3 # Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved.
5 # common routines for log testing
6 # Created by dxm@sgi.com & tes@sgi.com
14 if [ $status -eq 0 ]; then
15 # don't keep these files around unless something went wrong
23 echo "*** $* ***" >>$seq.full
29 echo "" | tee -a $seq.full
30 echo "*** $* ***" | tee -a $seq.full
31 echo "" | tee -a $seq.full
34 # Handle the operations which get split over Log Record
36 # Oper (379)..... flags: CONTINUE
38 # Oper (0)....... flags: WAS_CONT END
42 # Oper (379)..... flags: none
44 # Oper (0)....... flags: none
53 printf "line = %s\n", $0
58 /^Oper/ && /flags: CONTINUE/ {
59 # this will be the first op of split region
60 $9 = "none" # overwrite CONTINUE flags
62 print "Not printing rest"
66 /^Oper/ && /flags: WAS_CONT END/ {
67 # this will be the last op of split region
68 # skip over was-continued op
69 # we assume there can be only 1
74 # skip over any continued op stuff
82 # Filter out things that can change
83 # We have complexities which change when log is sync'ed at different
85 # Example1: DATA FORK EXTENTS
86 # These will not show up if inode is sync'ed sooner
87 # /DATA FORK EXTENTS/d;
88 # /INODE:/s/flags:0x5/flags:0x1/g;
89 # define XFS_ILOG_CORE 0x001 /* log standard inode fields */
90 # define XFS_ILOG_DEXT 0x004 /* log i_df.if_extents */
98 s/ver:[0-9]/ver:<VERS>/;
99 s/version [0-9] format [0-9]/version <VERS> format <FORMAT>/;
100 s/data device: 0x[0-9a-f][0-9a-f]*/data device: <DEVICE>/;
101 s/log device: 0x[0-9a-f][0-9a-f]*/log device: <DEVICE>/;
102 s/log file: \".*\"/log device: <DEVICE>/;
103 s/daddr: [0-9][0-9]*/daddr: <DADDR>/;
104 s/length: [0-9][0-9]*/length: <LENGTH>/;
105 s/length: [0-9][0-9]*/length: <LENGTH>/;
106 s/^cycle num overwrites: .*$/cycle num overwrites: <TIDS>/;
107 s/tid: [0-9a-f][0-9a-f]*/tid: <TID>/;
108 s/tid:0x[0-9a-f][0-9a-f]*/tid:<TID>/;
109 s/q:0x[0-9a-f][0-9a-f]*/q:<Q>/;
110 s/a:0x[0-9a-f][0-9a-f]*/a:<A>/g;
111 s/blkno:0x[0-9a-f][0-9a-f]*/blkno:<BLKNO>/g;
112 s/blkno: *[0-9][0-9]* (0x[0-9a-f]*)/blkno: <BLKNO> (<BLKNO>)/g;
113 s/blkno: *[0-9][0-9]*/blkno: <BLKNO>/g;
114 s/boff: [0-9][0-9]*/boff: <BOFF>/g;
115 s/len: *[0-9][0-9]*/len:<LEN>/g;
116 /BUF:/s/[ ]*flags:.*$//;
117 /zeroed blocks/s/[0-9][0-9]*/<COUNT>/g;
119 /log tail/s/[0-9][0-9]*/<COUNT>/g;
120 s/atime:[0-9a-fx]* *mtime:[0-9a-fx]* *ctime:[0-9a-fx]*/atime:<TIME> mtime:<TIME> ctime:<TIME>/;
121 s/atime 0x[0-9a-f]* mtime 0x[0-9a-f]* ctime 0x[0-9a-f]*/atime <TIME> mtime <TIME> ctime <TIME>/;
122 s/block [0-9][0-9]*/block <BLOCK>/;
123 s/icount: *[0-9][0-9]* *ifree: *[0-9][0-9]* *fdblks: *[0-9][0-9]* *frext: *[0-9][0-9]*/icount:<COUNT> ifree:<FREE> fdblks:<BLOCKS> frext:<COUNT>/;
124 s/sunit: *[0-9][0-9]* *swidth: *[0-9][0-9]*/sunit:<SUNIT> swidth:<SWIDTH>/;
125 s/1st: *[0-9][0-9]* *last: *[0-9][0-9]* *cnt: *[0-9][0-9]* *freeblks: *[0-9][0-9]* *longest: *[0-9][0-9]*/1st:<NUM> last:<NUM> cnt:<COUNT> freeblks:<COUNT> longest:<NUM>/;
126 s/^uuid: *[0-9a-f-][0-9a-f-]* *format: *.*$/uuid: <UUID> format: <FORMAT>/;
128 /version:/,/h_size:/d;
129 /override tail/s/[0-9][0-9]*/<TAIL_BLK>/;
135 /DATA FORK EXTENTS/d;
136 s/BUF: cnt:[1-9][0-9]* total:[1-9][0-9]*.*/BUF: cnt:C total:T/;
137 s/INO: cnt:[1-9][0-9]* total:[1-9][0-9]*.*/INO: cnt:C total:T/;
138 s/#regs: *[1-9][0-9]*/#regs:R/;
139 /INODE:/s/flags:0x5/flags:0x1/g;
140 s/Oper ([0-9][0-9]*)/Oper (OPNUM)/;
144 s/newino: 0x[0-9a-f]*$/newino: <INO>/g
145 s/newino:0x[0-9a-f]*$/newino:<INO>/g
146 s/ino: 0x[0-9a-f]* flags:/ino: <INO> flags:/g
147 s/ino:0x[0-9a-f]* flags:/ino:<INO> flags:/g
148 s/onlink:[0-9][0-9]*/onlink:<ONLINK>/;
149 s/gen:-*[0-9][0-9]*/gen:<GEN>/;
150 s/gen 0x[0-9a-f][0-9a-f]*/gen <GEN>/;
153 # collapse BUF DATA group into 1 line
154 # for Oper data this can be over separate operations...ughh
156 if (!buf_data) { # 1st one
164 oper = 0 # wont need it now
168 # store it as we dont know if 2nd BUF DATA is to follow
175 /^TRANS/ && dummy_rec == 1 {
176 # start printing again - dummy transaction over
180 # filter out dummy transactions
189 if (oper) { # now we can print out oper
200 _full "clean_log : xfs_logprint"
201 _scratch_xfs_logprint -t | tee -a $seq.full \
202 | head | grep -q "<CLEAN>" || _fail "DIRTY LOG"
207 _scratch_xfs_logprint -t | tee -a $seq.full >$tmp.logprint
208 if grep -q "<DIRTY>" $tmp.logprint; then
211 if grep -q "<CLEAN>" $tmp.logprint; then
218 mkdir $fulldir >/dev/null 2>&1
219 mntopt=`echo $MOUNT_OPTIONS | sed 's/ //g'`
220 mkfsopt=`echo $MKFS_OPTIONS | sed 's/ //g'`
221 raw=$fulldir/op.mnt$mntopt.mkfs$mkfsopt$sync_suffix.raw
222 filtered=$fulldir/op.mnt$mntopt.mkfs$mkfsopt$sync_suffix.filtered
224 echo "### xfs_logprint output ###" | tee $raw >$filtered
225 _scratch_xfs_logprint -c 2>&1 \
232 # start at rec#2 "-s 2" so we skip over UMOUNT record which will always
233 # be a 512b single header at mkfs time
234 # and may not match with the FS mounted at a different LR size
235 # => xlog_do_recovery_pass() can not handle the different hdr sizes
236 # it assumes them all to be the same between the start..finish
237 # NB: On IRIX there is no UMOUNT record and so we could start from -s 0.
239 _print_transaction_inode()
242 mkdir $fulldir >/dev/null 2>&1
243 mntopt=`echo $MOUNT_OPTIONS | sed 's/ //g'`
244 mkfsopt=`echo $MKFS_OPTIONS | sed 's/ //g'`
245 raw=$fulldir/trans_inode.mnt$mntopt.mkfs$mkfsopt$sync_suffix.raw
246 filtered=$fulldir/trans_inode.mnt$mntopt.mkfs$mkfsopt$sync_suffix.filtered
248 echo "### xfs_logprint -t -i -s START output ###" | tee $raw >$filtered
249 _scratch_xfs_logprint -t -i -s $_start 2>&1 \
255 _print_transaction_buf()
258 mkdir $fulldir >/dev/null 2>&1
259 mntopt=`echo $MOUNT_OPTIONS | sed 's/ //g'`
260 mkfsopt=`echo $MKFS_OPTIONS | sed 's/ //g'`
261 raw=$fulldir/trans_buf.mnt$mntopt.mkfs$mkfsopt$sync_suffix.raw
262 filtered=$fulldir/trans_buf.mnt$mntopt.mkfs$mkfsopt$sync_suffix.filtered
264 echo "### xfs_logprint -t -b -s START output ###" | tee $raw >$filtered
265 _scratch_xfs_logprint -t -b -s $_start 2>&1 \
274 # mkfs options to append to log size otion can be specified ($*)
275 export MKFS_OPTIONS="-l size=2000b $*"
277 _scratch_mkfs_xfs >>$seq.full 2>&1
278 if [ $? -ne 0 ] ; then
279 _echofull "Cannot mkfs for this test using option specified: $MKFS_OPTIONS"
288 # mount fs and create some log traffic
294 _scratch_mount >>$seq.full 2>&1
295 if [ $? -ne 0 ] ; then
296 _echofull "mount failed: $MOUNT_OPTIONS"
300 # generate some log traffic - but not too much - life gets a little
301 # more complicated if the log wraps around. This traffic is
302 # pretty much arbitary, but could probably be made better than this.
303 touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}
307 umount $SCRATCH_DEV >>$seq.full 2>&1
308 if [ $? -ne 0 ] ; then
309 _echofull "umount failed"
317 # mount fs and create some log traffic with sync'ing
323 _scratch_mount >>$seq.full 2>&1
324 if [ $? -ne 0 ] ; then
325 _echofull "mount failed: $MOUNT_OPTIONS"
329 # generate some log traffic - but not too much
330 # add some syncs to get the log flushed to disk
331 for file in $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}; do
338 umount $SCRATCH_DEV >>$seq.full 2>&1
339 if [ $? -ne 0 ] ; then
340 _echofull "umount failed"
347 echo "*** compare logprint: $1 with $2"
348 if ! diff $1 $2 >/dev/null; then
349 _fail "logprint output $1 differs to $2"
354 # Op data of different Log Record sizes will mean that data is
355 # split at different points and in op printing it will not
356 # try and decode the data which has been split up.
357 # So we do a special diff processing to complain of differences
358 # if no split is involved.
360 # Example diff with forms of:
361 # "Left over region from split log item"
362 # "Not printing rest of data"
365 # < Left over region from split log item
369 # < INODE: #regs: 3 Not printing rest of data
371 # > INODE: #regs: 3 ino: 0x80 flags: 0x5 dsize: 16
372 # > blkno: <BLKNO> len:<LEN> boff: <BOFF>
377 BEGIN { num_splits = 1; max_splits = 50 }
380 # ensure a split happened in previous difference
381 if (num_splits < 1 || num_splits > max_splits) {
382 print num_splits, " split(s) found prior to diff cmd: ", $0
383 num_splits = 1 # shut-up end condition
390 /Left over region/ || /Not printing rest/ {
396 if (num_splits < 1 || num_splits > max_splits) {
397 print num_splits, " split(s) found prior to diff end"
407 echo "*** compare logprint: $1 with $2"
409 diff $1 $2 >$filtered.diff
410 if ! _process_op_diff $filtered.diff
412 _fail "logprint output $1 differs to $2 considering splits"
416 # return xfs log version of device
418 # _log_version /dev/dsk/dks0d1s4
423 vers=`xfs_db -c 'sb 0' -c 'p versionnum' -r $_dev | $AWK_PROG '{print $3}'`
424 logver=`echo $vers | sed -e 's/0x[0-9a-f]\([0-9a-f]\)[0-9a-f][0-9a-f]/\1/'`
425 if [ $logver = 4 -o $logver = 5 -o $logver = 6 -o $logver = 7 -o \
426 $logver = c -o $logver = d -o $logver = e -o $logver = f ]; then
435 # test out mkfs to see if it supports "-l version=2"
436 export MKFS_OPTIONS="-l version=2"
437 if ! _scratch_mkfs_xfs >>$seq.full 2>&1; then
438 _notrun "mkfs does not support v2 logs"
441 # test out mount to see if it mounts a v2 log fs
442 export MOUNT_OPTIONS="-o logbsize=32k"
443 if ! _scratch_mount >>$seq.full 2>&1; then
444 _notrun "mount/kernel does not support v2 logs"
447 # check after unmount to see if it is clean
448 # i.e. it is not a 6.5.25 buggy version checking kernel
449 touch $SCRATCH_MNT/file
450 umount $SCRATCH_DEV >>$seq.full 2>&1
451 if _scratch_xfs_logprint -t | tee -a $seq.full \
452 | head | grep -q "<DIRTY>"; then
453 _notrun "kernel does not support v2 logs"
456 # otherwise presume it does support v2 logs...:)
460 # make sure this script returns success