Some qa to test out simple replay of the logs by causing
authorptools <ptools>
Tue, 10 Feb 2004 03:10:49 +0000 (03:10 +0000)
committerptools <ptools>
Tue, 10 Feb 2004 03:10:49 +0000 (03:10 +0000)
file system to shutdown.
Simple log replay test.

085 [new file with mode: 0755]
085.out [new file with mode: 0644]
group
src/Makefile
src/godown.c [new file with mode: 0644]

diff --git a/085 b/085
new file mode 100755 (executable)
index 0000000..b6f2de9
--- /dev/null
+++ b/085
@@ -0,0 +1,145 @@
+#! /bin/sh
+# XFS QA Test No. 084
+#
+# To test log replay by shutdown of file system
+# This is the first simple initial test to ensure that
+# the goingdown ioctl is working and recovery of
+# create transactions is working.
+#
+#-----------------------------------------------------------------------
+# Copyright (c) 2000-2003 Silicon Graphics, Inc.  All Rights Reserved.
+# 
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 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.
+# 
+# Further, this software is distributed without any warranty that it is
+# free of the rightful claim of any third person regarding infringement
+# or the like.  Any license provided herein, whether implied or
+# otherwise, applies only to this software file.  Patent licenses, if
+# any, provided herein do not apply to combinations of this program with
+# other software, or any other product whatsoever.
+# 
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write the Free Software Foundation, Inc., 59
+# Temple Place - Suite 330, Boston MA 02111-1307, USA.
+# 
+# Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+# Mountain View, CA  94043, or:
+# 
+# http://www.sgi.com 
+# 
+# For further information regarding this notice, see: 
+# 
+# http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+#-----------------------------------------------------------------------
+#
+# creator
+owner=tes@melbourne.sgi.com
+
+seq=`basename $0`
+echo "QA output created by $seq"
+
+here=`pwd`
+tmp=/tmp/$$
+status=1       # failure is the default!
+trap "_cleanup; exit \$status" 0 1 2 3 15
+
+# get standard environment, filters and checks
+. ./common.rc
+. ./common.filter
+. ./common.log
+
+# real QA test starts here
+
+_do_logprint()
+{
+    xfs_logprint -t $SCRATCH_DEV | tee -a $seq.full >$tmp.logprint
+    if grep -q "<DIRTY>" $tmp.logprint; then
+       echo "dirty log"
+    fi
+    if grep -q "<CLEAN>" $tmp.logprint; then
+       echo "clean log"
+    fi
+}
+
+_cleanup()
+{
+    rm -f $tmp.*
+    kill $pid
+}
+
+rm -f $seq.full
+rm -f $tmp.log
+
+tail -f /var/log/messages >$tmp.log &
+pid=$!
+cp $tmp.log $tmp.log.orig # note the original log
+
+_require_scratch
+
+echo "mkfs"
+_scratch_mkfs_xfs >>$seq.full 2>&1 \
+    || _fail "mkfs scratch failed"
+
+echo "mount"
+_scratch_mount >>$seq.full 2>&1 \
+    || _fail "mount failed: $MOUNT_OPTIONS"
+
+echo "touch files"
+touch $SCRATCH_MNT/{0,1,2,3,4,5,6,7,8,9}{0,1,2,3,4,5,6,7,8,9}
+
+echo "godown"
+src/godown -v -f $SCRATCH_MNT >> $seq.full
+
+echo "unmount"
+umount $SCRATCH_MNT
+
+echo "logprint after going down..."
+_do_logprint
+
+# curious if FS consistent at start
+if false; then
+    if /usr/sbin/xfs_check $SCRATCH_DEV; then
+       echo "*** checked ok ***"
+    fi
+fi
+
+echo "mount with replay"
+_scratch_mount $mnt >>$seq.full 2>&1 \
+    || _fail "mount failed: $mnt $MOUNT_OPTIONS"
+
+sleep 2
+
+# compare with what has now been added to the log
+comm -13 $tmp.log.orig $tmp.log >$tmp.comm
+echo "$tmp.comm" >>$seq.full
+cat $tmp.comm >>$seq.full
+
+echo "check syslog for recovery..." 
+grep recovery $tmp.comm |\
+sed -e 's/.*Start/Start/' -e 's/system:.*/system/' \
+    -e 's/.*End/End/'
+
+echo "ls $SCRATCH_MNT"
+ls $SCRATCH_MNT
+
+echo "unmount"
+umount $SCRATCH_MNT
+
+echo "logprint after mount and replay..."
+_do_logprint
+
+if _check_scratch_fs; then
+    echo "filesystem is checked ok"
+else
+    echo "filesystem is NOT ok"
+fi
+
+# success, all done
+status=0
+exit
diff --git a/085.out b/085.out
new file mode 100644 (file)
index 0000000..ebe2727
--- /dev/null
+++ b/085.out
@@ -0,0 +1,117 @@
+QA output created by 085
+mkfs
+mount
+touch files
+godown
+unmount
+logprint after going down...
+dirty log
+mount with replay
+check syslog for recovery...
+Starting XFS recovery on filesystem
+Ending XFS recovery on filesystem
+ls /mnt/scratch
+00
+01
+02
+03
+04
+05
+06
+07
+08
+09
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+unmount
+logprint after mount and replay...
+clean log
+filesystem is checked ok
diff --git a/group b/group
index 3daba8a9d1378f17bb0b2c10e2fd03aa651530f2..6d4126237d427b9ea52ee97ff9cccc17c2d9bd80 100644 (file)
--- a/group
+++ b/group
@@ -145,3 +145,4 @@ ioctl               nathans@sgi.com
 082 logprint
 083 rw auto
 084 ioctl rw auto
 082 logprint
 083 rw auto
 084 ioctl rw auto
+085 logprint auto
index fdfc6e25fc745c8b3cca073d7a5f07a612a93cfc..b0461beb756c09b0a8cef3baa8028625b01badca 100644 (file)
@@ -37,7 +37,8 @@ TARGETS = alloc acl_get bstat devzero dirstress fault feature \
          fill fill2 getpagesize holes xfsctl loggen lstat64 \
          nametest permname randholes runas truncfile usemem \
          fstest mmapcat append_reader append_writer \
          fill fill2 getpagesize holes xfsctl loggen lstat64 \
          nametest permname randholes runas truncfile usemem \
          fstest mmapcat append_reader append_writer \
-         dirperf metaperf enospc_unlink resvtest scaleread
+         dirperf metaperf enospc_unlink resvtest scaleread \
+         godown
 ifeq ($(ENABLE_DBM), yes)
 TARGETS += dbtest
 endif
 ifeq ($(ENABLE_DBM), yes)
 TARGETS += dbtest
 endif
diff --git a/src/godown.c b/src/godown.c
new file mode 100644 (file)
index 0000000..963efcf
--- /dev/null
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 2004 Silicon Graphics, Inc.  All Rights Reserved.
+ * 
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 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.
+ * 
+ * Further, this software is distributed without any warranty that it is
+ * free of the rightful claim of any third person regarding infringement
+ * or the like.  Any license provided herein, whether implied or
+ * otherwise, applies only to this software file.  Patent licenses, if
+ * any, provided herein do not apply to combinations of this program with
+ * other software, or any other product whatsoever.
+ * 
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write the Free Software Foundation, Inc., 59
+ * Temple Place - Suite 330, Boston MA 02111-1307, USA.
+ * 
+ * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
+ * Mountain View, CA  94043, or:
+ * 
+ * http://www.sgi.com 
+ * 
+ * For further information regarding this notice, see: 
+ * 
+ * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
+ */
+
+#include <xfs/libxfs.h>
+
+/* These should be in libxfs.h */
+#ifndef XFS_IOC_GOINGDOWN
+#define XFS_IOC_GOINGDOWN           _IOR ('X', 125, __uint32_t)
+#endif
+#ifndef XFS_FSOP_GOING_FLAGS_DEFAULT
+#define XFS_FSOP_GOING_FLAGS_DEFAULT    0x0     /* going down */
+#endif
+#ifndef XFS_FSOP_GOING_FLAGS_LOGFLUSH
+#define XFS_FSOP_GOING_FLAGS_LOGFLUSH    0x1     /* flush log */
+#endif
+#ifndef XFS_FSOP_GOING_FLAGS_NOLOGFLUSH
+#define XFS_FSOP_GOING_FLAGS_NOLOGFLUSH  0x2     /* don't flush log */
+#endif
+
+static char *progname;
+
+
+static void
+usage(void)
+{
+       fprintf(stderr, "usage: %s [-f] [-v] mnt-dir\n", progname);
+}
+
+int
+main(int argc, char *argv[])
+{
+       int c;
+       int flag;
+       int flushlog_opt = 0;
+       int verbose_opt = 0;
+       struct stat st;
+       char *mnt_dir;
+       int fd;
+
+       progname = argv[0];
+
+       while ((c = getopt(argc, argv, "fv")) != -1) {
+               switch (c) {
+               case 'f':
+                       flushlog_opt = 1;
+                       break;
+               case 'v':
+                       verbose_opt = 1;
+                       break;
+               case '?':
+                       usage();
+                       return 1;
+               }
+       }
+
+       /* process required cmd argument */
+       if (optind == argc-1) {
+               mnt_dir = argv[optind];
+       }
+       else {
+               usage();
+               return 1;
+       }
+
+       if ((stat(mnt_dir, &st)) == -1) {
+               fprintf(stderr, "%s: error on stat \"%s\": %s\n",
+                       progname, mnt_dir, strerror(errno));
+               return 1;
+       }
+
+       if (!S_ISDIR(st.st_mode)) {
+               fprintf(stderr, "%s: argument \"%s\" is not a directory\n",
+                       progname, mnt_dir);
+               return 1;
+       }
+
+       
+#if 0
+       {
+               struct statvfs stvfs;
+               if ((statvfs(mnt_dir, &stvfs)) == -1) {
+                       fprintf(stderr, "%s: error on statfs \"%s\": %s\n",
+                               progname, mnt_dir, strerror(errno));
+                       return 1;
+               }
+
+               if (strcmp(stvfs.f_basetype, "xfs") != 0) {
+                       fprintf(stderr, "%s: filesys for \"%s\" is not XFS:\"%s\"\n",
+                               progname, mnt_dir, stvfs.f_basetype);
+                       return 1;
+               }
+       }
+#endif
+
+
+       flag = (flushlog_opt ? XFS_FSOP_GOING_FLAGS_LOGFLUSH 
+                           : XFS_FSOP_GOING_FLAGS_NOLOGFLUSH);
+
+       if (verbose_opt) {
+               printf("Opening \"%s\"\n", mnt_dir);
+       }
+       if ((fd = open(mnt_dir, O_RDONLY)) == -1) {
+               fprintf(stderr, "%s: error on open of \"%s\": %s\n",
+                       progname, mnt_dir, strerror(errno));
+               return 1;
+       }
+
+       if (verbose_opt) {
+               printf("Calling XFS_IOC_GOINGDOWN\n");
+       }
+       if ((xfsctl(mnt_dir, fd, XFS_IOC_GOINGDOWN, &flag)) == -1) {
+               fprintf(stderr, "%s: error on xfsctl(GOINGDOWN) of \"%s\": %s\n",
+                       progname, mnt_dir, strerror(errno));
+               return 1;
+       }
+
+       close(fd);
+
+       return 0;
+}