Files
apfstests/189
T
Christoph Hellwig f381f98206 xfstests: move GPL boilerplates to fix lsqa.pl
It turns out lsqa.pl nees the test number and description first in the
file, so move the GPL boilerplates below it.

Also remove acouple of cases where we have one full copyright line + gpl
boilerplate before the description and another copyright line after
the description.

Signed-off-by: Christoph Hellwig <hch@lst.de>
2009-05-28 17:04:15 +02:00

226 lines
5.4 KiB
Bash
Executable File

#! /bin/sh
# FS QA Test No. 189
#
# Test remount behaviour
# Initial motivation was for pv#985710 and pv#983964
#
#-----------------------------------------------------------------------
# Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms 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. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
#-----------------------------------------------------------------------
#
# creator
owner=hch@lst.de
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
tag="added by qa $seq"
_cleanup()
{
cd /
umount $SCRATCH_MNT 2>/dev/null
_putback_scratch_fstab
rm -f $tmp.*
}
_scratch_filter()
{
sed -e "s#$SCRATCH_DEV#SCRATCH_DEV#" \
-e "s#$SCRATCH_MNT#SCRATCH_MNT#"
}
_check_mount()
{
# assumes that we don't have extra ops in fstab
_mount | grep $SCRATCH_MNT | _scratch_filter
}
#
# mount(8) adds all options from mtab and fstab to the mount command
# line. So the filesystem either must not reject any option at all
# if it can't change it, or compare the value on the command line
# to the existing state and only reject it if it would change
# something that can't be changed.
#
# Test this behaviour by mounting a filesystem read-only with a non-
# default option and then try to remount it rw.
#
# note that mount(8) doesn't add the options when specifying both the
# device node and mount point, so test out the various mounting
# alternatives
#
_test_remount_rw()
{
# use filestreams as a hopefully never default option
echo
echo "try remount ro,filestreams -> rw,filestreams"
echo
_scratch_mount -o ro,filestreams
[ $? -eq 0 ] || echo "ro,filestreams mount failed unexpectedly"
_check_mount
for dev_mnt in $SCRATCH_DEV $SCRATCH_MNT "$SCRATCH_DEV $SCRATCH_MNT"; do
echo "mounting given: $dev_mnt" | _scratch_filter
_mount -o remount,rw $dev_mnt
[ $? -eq 0 ] || echo "remount rw failed"
_check_mount
done
umount $SCRATCH_MNT
echo
echo "try remount ro,noattr2 -> rw,attr2"
echo
_scratch_mount -o ro,noattr2
[ $? -eq 0 ] || echo "ro,noattr2 mount failed unexpectedly"
_check_mount
for dev_mnt in $SCRATCH_DEV $SCRATCH_MNT "$SCRATCH_DEV $SCRATCH_MNT"; do
echo "mounting given: $dev_mnt" | _scratch_filter
_mount -o remount,rw,attr2 $dev_mnt
[ $? -eq 0 ] || echo "remount rw,attr2 failed"
_check_mount
done
umount $SCRATCH_MNT
}
#
# make sure we really can write to a filesystem after remount,rw
#
_test_remount_write()
{
echo
echo "try touching file after remount ro -> rw with options"
echo
_scratch_mount
[ $? -eq 0 ] || echo "mount (1) failed unexpectedly"
touch $SCRATCH_MNT/foobar
[ $? -eq 0 ] || echo "touch (1) failed unexpectedly"
umount $SCRATCH_MNT
_scratch_mount -o ro
[ $? -eq 0 ] || echo "mount (2) failed unexpectedly"
_mount -o remount,rw,filestreams $SCRATCH_MNT
[ $? -eq 0 ] || echo "remount failed unexpectedly"
touch $SCRATCH_MNT/foobar
[ $? -eq 0 ] || echo "touch (2) failed unexpectedly"
umount $SCRATCH_MNT
}
#
# barrier is the only option we can change besides ro<->rw which is partially
# handled by the VFS and tested elsewhere. Make sure mount accepts going
# from barrier (which also is the default) to nobarrier and back.
#
_test_remount_barrier()
{
echo
echo "Do remount barrier tests"
echo
# mention barrier explicitly even if it's currently the default just to be sure
_scratch_mount -o barrier
[ $? -eq 0 ] || echo "mount failed unexpectedly!"
_check_mount
_scratch_mount -o remount,nobarrier
[ $? -eq 0 ] || _fail "remount nobarrier failed"
_check_mount
_scratch_mount -o remount,barrier
[ $? -eq 0 ] || _fail "remount barrier failed"
_check_mount
umount $SCRATCH_MNT
}
#
# Example fstab entry
# /dev/sdb2 /mnt/scratch1 xfs defaults 0 0
#
_add_scratch_fstab()
{
# comment out any existing SCRATCH_DEV
$SED_PROG -i "s;$SCRATCH_DEV;#$SCRATCH_DEV;" /etc/fstab
# add our fstab entry
echo "$SCRATCH_DEV $SCRATCH_MNT xfs defaults 0 0 # $tag" >> /etc/fstab
}
_modify_scratch_fstab()
{
opts=$1
# modify our fstab entry that we added
# modify opts by looking for last word which has non-space chars
$SED_PROG -i "s; [^ ]* 0 0 # $tag; $opts 0 0 # $tag;" /etc/fstab
}
_putback_scratch_fstab()
{
# uncomment out any existing SCRATCH_DEV
$SED_PROG -i "s;#$SCRATCH_DEV;$SCRATCH_DEV;" /etc/fstab
# remove the one we added at the end
$SED_PROG -i "/# $tag/d" /etc/fstab
}
# get standard environment, filters and checks
. ./common.rc
. ./common.filter
# real QA test starts here
_supported_fs xfs
_supported_os Linux
_need_to_be_root
_require_scratch
unset SCRATCH_RTDEV
unset SCRATCH_LOGDEV
_scratch_mkfs_xfs | _filter_mkfs 2>/dev/null
_add_scratch_fstab
_test_remount_rw
_test_remount_write
echo
echo "add noikeep to fstab for scratch"
_modify_scratch_fstab noikeep # noikeep is not default for non dmapi
_test_remount_rw
_putback_scratch_fstab
_test_remount_barrier
# success, all done
echo "*** done"
rm -f $seq.full
status=0