On 2/17/14, 2:25 PM, Koen De Wit wrote: > Tests the noatime, relatime, strictatime and nodiratime mount options. > > There is an extra check for Btrfs to ensure that the access time is > never updated on read-only subvolumes. (Regression test for bug fixed > with commit 93fd63c2f001ca6797c6b15b696a484b165b4800) I think this looks ok. Only little nit is that _require_relatime now implicitly requires scratch, but *shrug* it was Dave's idea. ;) Thanks! Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > Signed-off-by: Koen De Wit <koen.de.wit@xxxxxxxxxx> > --- > > v1->v2: > - Fix typo in _cleanup() > - Explicitly passing relatime mount option > - Adding _require_relatime method to common/rc > - Adding extra test for read-only mounts > > diff --git a/common/rc b/common/rc > index e91568b..e55d09e 100644 > --- a/common/rc > +++ b/common/rc > @@ -2159,6 +2159,14 @@ _verify_reflink() > || echo "$1 and $2 are not reflinks: different extents" > } > > +_require_relatime() > +{ > + _scratch_mkfs > /dev/null 2>&1 > + _mount -t $FSTYP -o relatime $SCRATCH_DEV $SCRATCH_MNT || \ > + _notrun "relatime not supported by the current kernel" > + _scratch_unmount > +} > + > _create_loop_device() > { > file=$1 > diff --git a/tests/generic/323 b/tests/generic/323 > new file mode 100644 > index 0000000..54f2739 > --- /dev/null > +++ b/tests/generic/323 > @@ -0,0 +1,199 @@ > +# Tests the noatime, relatime, strictatime and nodiratime mount options. > +# There is an extra check for Btrfs to ensure that the access time is > +# never updated on read-only subvolumes. (Regression test for bug fixed > +# with commit 93fd63c2f001ca6797c6b15b696a484b165b4800) > +# > +#----------------------------------------------------------------------- > +# Copyright (c) 2014, Oracle and/or its affiliates. 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 > +#----------------------------------------------------------------------- > + > +seq=`basename $0` > +seqres=$RESULT_DIR/$seq > +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 > + > +_cleanup() > +{ > + cd / > + rm -rf $tmp.* > +} > + > +# get standard environment, filters and checks > +. ./common/rc > +. ./common/filter > + > +# real QA test starts here > + > +_supported_fs generic > +_supported_os Linux > +_require_scratch > +_require_relatime > + > +rm -f $seqres.full > + > +_stat() { > + stat --printf="%x;%y;%z" $1 > +} > + > +_compare_stat_times() { > + updated=$1 # 3 chars indicating if access, modify and > + # change times should be updated (Y) or not (N) > + IFS=';' read -a first_stat <<< "$2" # Convert first stat to array > + IFS=';' read -a second_stat <<< "$3" # Convert second stat to array > + test_step=$4 # Will be printed to output stream in case of an > + # error, to make debugging easier > + types=( access modify change ) > + > + for i in 0 1 2; do > + if [ "${first_stat[$i]}" == "${second_stat[$i]}" ]; then > + if [ "${updated:$i:1}" == "Y" ]; then > + echo -n "ERROR: ${types[$i]} time has not been updated " > + echo $test_step > + fi > + else > + if [ "${updated:$i:1}" == "N" ]; then > + echo -n "ERROR: ${types[$i]} time has changed " > + echo $test_step > + fi > + fi > + done > +} > + > +_scratch_mkfs >> $seqres.full 2>&1 || _fail "mkfs failed" > +_scratch_mount "-o relatime" > + > +if [ "$FSTYP" = "btrfs" ]; then > + TPATH=$SCRATCH_MNT/sub1 > + $BTRFS_UTIL_PROG subvolume create $TPATH > $seqres.full > +else > + TPATH=$SCRATCH_MNT > +fi > + > +mkdir $TPATH/dir1 > +echo "aaa" > $TPATH/dir1/file1 > +file1_stat_before_first_access=`_stat $TPATH/dir1/file1` > + > +# Accessing file1 the first time > +cat $TPATH/dir1/file1 > /dev/null > +file1_stat_after_first_access=`_stat $TPATH/dir1/file1` > +_compare_stat_times YNN "$file1_stat_before_first_access" \ > + "$file1_stat_after_first_access" "after accessing file1 first time" > + > +# Accessing file1 a second time > +cat $TPATH/dir1/file1 > /dev/null > +file1_stat_after_second_access=`_stat $TPATH/dir1/file1` > +_compare_stat_times NNN "$file1_stat_after_first_access" \ > + "$file1_stat_after_second_access" "after accessing file1 second time" > + > +# Remounting with nodiratime option > +_scratch_unmount > +_scratch_mount "-o nodiratime" > +file1_stat_after_remount=`_stat $TPATH/dir1/file1` > +_compare_stat_times NNN "$file1_stat_after_second_access" \ > + "$file1_stat_after_remount" "for file1 after remount" > + > +# Creating dir2 and file2, checking directory stats > +mkdir $TPATH/dir2 > +dir2_stat_before_file_creation=`_stat $TPATH/dir2` > +echo "bbb" > $TPATH/dir2/file2 > +dir2_stat_after_file_creation=`_stat $TPATH/dir2` > +_compare_stat_times NYY "$dir2_stat_before_file_creation" \ > + "$dir2_stat_after_file_creation" "for dir2 after file creation" > + > +# Accessing file2 > +file2_stat_before_first_access=`_stat $TPATH/dir2/file2` > +cat $TPATH/dir2/file2 > /dev/null > +file2_stat_after_first_access=`_stat $TPATH/dir2/file2` > +_compare_stat_times YNN "$file2_stat_before_first_access" \ > + "$file2_stat_after_first_access" "after accessing file2" > +dir2_stat_after_file_access=`_stat $TPATH/dir2` > +_compare_stat_times NNN "$dir2_stat_after_file_creation" \ > + "$dir2_stat_after_file_access" "for dir2 after file access" > + > +# Remounting with noatime option, creating a file and accessing it > +_scratch_unmount > +_scratch_mount "-o noatime" > +echo "ccc" > $TPATH/dir2/file3 > +file3_stat_before_first_access=`_stat $TPATH/dir2/file3` > +cat $TPATH/dir2/file3 > /dev/null > +file3_stat_after_first_access=`_stat $TPATH/dir2/file3` > +_compare_stat_times NNN "$file3_stat_before_first_access" \ > + "$file3_stat_after_first_access" "after accessing file3 first time" > + > +# Checking that the modify and change times are still updated > +file1_stat_before_modify=`_stat $TPATH/dir1/file1` > +echo "xyz" > $TPATH/dir1/file1 > +file1_stat_after_modify=`_stat $TPATH/dir1/file1` > +_compare_stat_times NYY "$file1_stat_before_modify" \ > + "$file1_stat_after_modify" "after modifying file1" > +mv $TPATH/dir1/file1 $TPATH/dir1/file1_renamed > +file1_stat_after_change=`_stat $TPATH/dir1/file1_renamed` > +_compare_stat_times NNY "$file1_stat_after_modify" \ > + "$file1_stat_after_change" "after changing file1" > + > +# Remounting with strictatime option and > +# accessing a previously created file twice > +_scratch_unmount > +_scratch_mount "-o strictatime" > +cat $TPATH/dir2/file3 > /dev/null > +file3_stat_after_second_access=`_stat $TPATH/dir2/file3` > +_compare_stat_times YNN "$file3_stat_after_first_access" \ > + "$file3_stat_after_second_access" "after accessing file3 second time" > +cat $TPATH/dir2/file3 > /dev/null > +file3_stat_after_third_access=`_stat $TPATH/dir2/file3` > +_compare_stat_times YNN "$file3_stat_after_second_access" \ > + "$file3_stat_after_third_access" "after accessing file3 third time" > + > +# Btrfs only: Creating readonly snapshot. Access time should never > +# be updated, even when the strictatime mount option is active > +if [ "$FSTYP" = "btrfs" ]; then > + SPATH=$SCRATCH_MNT/snap1 > + btrfs subvol snapshot -r $TPATH $SPATH >> $seqres.full > + dir2_stat_readonly_before_access=`_stat $SPATH/dir2` > + ls $SPATH/dir2 >> $seqres.full > + cat $SPATH/dir2/file3 >> $seqres.full > + dir2_stat_readonly_after_access=`_stat $SPATH/dir2` > + _compare_stat_times NNN "$dir2_stat_readonly_before_access" \ > + "$dir2_stat_readonly_after_access" "for dir in readonly subvol" > + file3_stat_readonly_after_access=`_stat $SPATH/dir2/file3` > + _compare_stat_times NNN "$file3_stat_after_third_access" \ > + "$file3_stat_readonly_after_access" "for file in readonly subvol" > +fi > + > +# Remounting read-only. Access time should never be updated, despite the > +# strictatime mount option. > +dir2_stat_before_ro_mount=`_stat $TPATH/dir2` > +file3_stat_before_ro_mount=`_stat $TPATH/dir2/file3` > +_scratch_unmount > +_scratch_mount "-o ro,strictatime" > +ls $TPATH/dir2 > /dev/null > +cat $TPATH/dir2/file3 > /dev/null > +dir2_stat_after_ro_mount=`_stat $TPATH/dir2` > +_compare_stat_times NNN "$dir2_stat_before_ro_mount" \ > + "$dir2_stat_after_ro_mount" "for dir in read-only filesystem" > +file3_stat_after_ro_mount=`_stat $TPATH/dir2/file3` > +_compare_stat_times NNN "$file3_stat_before_ro_mount" \ > + "$file3_stat_after_ro_mount" "for file in read-only filesystem" > + > +# success, all done > +_scratch_unmount > +echo "Silence is golden" > +status=0 > +exit > diff --git a/tests/generic/323.out b/tests/generic/323.out > new file mode 100644 > index 0000000..5dba9b5 > --- /dev/null > +++ b/tests/generic/323.out > @@ -0,0 +1,2 @@ > +QA output created by 323 > +Silence is golden > diff --git a/tests/generic/group b/tests/generic/group > index f492461..3a72ee4 100644 > --- a/tests/generic/group > +++ b/tests/generic/group > @@ -125,3 +125,4 @@ > 320 auto rw > 321 auto quick metadata log > 322 auto quick metadata log > +323 atime auto quick > _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs