From: Christoph Hellwig Date: Sat, 10 Jan 2009 20:38:24 +0000 (+0100) Subject: xfstests: add test 200, exercise read-only block devices and mounts X-Git-Tag: v1.1.0~323 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=22b88d4f523d6dc4517a77fd6dda0fa5111a774a;p=xfstests-dev.git xfstests: add test 200, exercise read-only block devices and mounts Make sure we do the right thing with blockdevices with a hard read-only flag. Signed-off-by: Christoph Hellwig Reviewed-by: Eric Sandeen --- diff --git a/200 b/200 new file mode 100644 index 00000000..b8c3c72e --- /dev/null +++ b/200 @@ -0,0 +1,120 @@ +#! /bin/sh +# FS QA Test No. 200 +# +# Check out various mount/remount/unmount scenarious on a read-only blockdev. +# +#----------------------------------------------------------------------- +# Copyright (c) 2009 Christoph Hellwig. +#----------------------------------------------------------------------- +# +# creator +owner=hch@lst.de + +seq=`basename $0` +echo "QA output created by $seq" + +here=`pwd` +tmp=/tmp/$$ +status=1 # failure is the default! + +_filter_scratch() +{ + sed -e "s,$SCRATCH_DEV,SCRATCH_DEV,g" | \ + sed -e "s,$SCRATCH_MNT,SCRATCH_MNT,g" +} + +_cleanup() +{ + cd / + blockdev --setrw $SCRATCH_DEV +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common.rc +. ./common.filter + +# real QA test starts here +_supported_fs xfs +_supported_os Linux + +_require_scratch + +_scratch_mkfs_xfs >/dev/null 2>&1 + +# +# Mark the device read-only +# +echo "setting device read-only" +blockdev --setro $SCRATCH_DEV + +# +# Mount it, and make sure we can't write to it, and we can unmount it again +# +echo "mounting read-only block device:" +_scratch_mount 2>&1 | _filter_scratch + +echo "touching file on read-only filesystem (should fail)" +touch $SCRATCH_MNT/foo 2>&1 | _filter_scratch + +# +# Apparently this used to be broken at some point: +# http://oss.sgi.com/bugzilla/show_bug.cgi?id=807 +# +echo "unmounting read-only filesystem" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +echo "setting device read-write" +blockdev --setrw $SCRATCH_DEV + +echo "mounting read-write block device:" +_scratch_mount 2>&1 | _filter_scratch + +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 "going down:" +src/godown -f $SCRATCH_MNT + +echo "unmounting shutdown filesystem:" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +echo "setting device read-only" +blockdev --setro $SCRATCH_DEV + +# +# Mounting a filesystem that requires log-recovery fails unless +# -o norecovery is used. +# +echo "mounting filesystem that needs recovery on a read-only device:" +_scratch_mount 2>&1 | _filter_scratch + +echo "unmounting read-only filesystem" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +# +# This is the way out if the underlying device really is read-only. +# Doesn't mean it's a good idea in practive, more a last resort +# data recovery hack. +# +echo "mounting filesystem with -o norecovery on a read-only device:" +_scratch_mount -o norecovery 2>&1 | _filter_scratch + +echo "unmounting read-only filesystem" +umount $SCRATCH_MNT 2>&1 | _filter_scratch + +echo "setting device read-write" +blockdev --setrw $SCRATCH_DEV + +# +# But log recovery is performed when mount with -o ro as long as +# the underlying device is not write protected. +# +echo "mounting filesystem that needs recovery with -o ro:" +_scratch_mount -o ro 2>&1 | _filter_scratch + + +# success, all done +echo "*** done" +rm -f $seq.full +status=0 diff --git a/200.out b/200.out new file mode 100644 index 00000000..26295414 --- /dev/null +++ b/200.out @@ -0,0 +1,24 @@ +QA output created by 200 +setting device read-only +mounting read-only block device: +mount: block device SCRATCH_DEV is write-protected, mounting read-only +touching file on read-only filesystem (should fail) +touch: cannot touch `SCRATCH_MNT/foo': Read-only file system +unmounting read-only filesystem +setting device read-write +mounting read-write block device: +touch files +going down: +unmounting shutdown filesystem: +setting device read-only +mounting filesystem that needs recovery on a read-only device: +mount: block device SCRATCH_DEV is write-protected, mounting read-only +mount: cannot mount block device SCRATCH_DEV read-only +unmounting read-only filesystem +umount: SCRATCH_MNT: not mounted +mounting filesystem with -o norecovery on a read-only device: +mount: block device SCRATCH_DEV is write-protected, mounting read-only +unmounting read-only filesystem +setting device read-write +mounting filesystem that needs recovery with -o ro: +*** done diff --git a/group b/group index 121641f8..a5f42083 100644 --- a/group +++ b/group @@ -301,3 +301,4 @@ atime 196 quota auto 197 dir auto 199 mount auto +200 mount auto