summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-x085145
-rw-r--r--085.out117
-rw-r--r--group1
-rw-r--r--src/Makefile3
-rw-r--r--src/godown.c149
5 files changed, 414 insertions, 1 deletions
diff --git a/085 b/085
new file mode 100755
index 00000000..b6f2de97
--- /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
index 00000000..ebe27274
--- /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 3daba8a9..6d412623 100644
--- a/group
+++ b/group
@@ -145,3 +145,4 @@ ioctl nathans@sgi.com
082 logprint
083 rw auto
084 ioctl rw auto
+085 logprint auto
diff --git a/src/Makefile b/src/Makefile
index fdfc6e25..b0461beb 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -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 \
- dirperf metaperf enospc_unlink resvtest scaleread
+ dirperf metaperf enospc_unlink resvtest scaleread \
+ godown
ifeq ($(ENABLE_DBM), yes)
TARGETS += dbtest
endif
diff --git a/src/godown.c b/src/godown.c
new file mode 100644
index 00000000..963efcf4
--- /dev/null
+++ b/src/godown.c
@@ -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;
+}