| #! /bin/bash | |
| # 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#" \ | |
| -e "s#,context.*s0\"##" | |
| } | |
| _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 |