From 9f5c3ca42ec757efc99765d21750624afc89209b Mon Sep 17 00:00:00 2001 From: ptools Date: Tue, 10 Feb 2004 03:10:49 +0000 Subject: [PATCH] Some qa to test out simple replay of the logs by causing file system to shutdown. Simple log replay test. --- 085 | 145 +++++++++++++++++++++++++++++++++++++++++++++++++ 085.out | 117 ++++++++++++++++++++++++++++++++++++++++ group | 1 + src/Makefile | 3 +- src/godown.c | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 414 insertions(+), 1 deletion(-) create mode 100755 085 create mode 100644 085.out create mode 100644 src/godown.c 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 "" $tmp.logprint; then + echo "dirty log" + fi + if grep -q "" $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 + +/* 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; +} -- 2.30.2