From patchwork Mon Feb 17 20:25:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Koen De Wit X-Patchwork-Id: 3664781 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E0BB0BF13A for ; Mon, 17 Feb 2014 20:25:50 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id B995320114 for ; Mon, 17 Feb 2014 20:25:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6D230200F2 for ; Mon, 17 Feb 2014 20:25:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754628AbaBQUZp (ORCPT ); Mon, 17 Feb 2014 15:25:45 -0500 Received: from userp1040.oracle.com ([156.151.31.81]:29759 "EHLO userp1040.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754122AbaBQUZn (ORCPT ); Mon, 17 Feb 2014 15:25:43 -0500 Received: from ucsinet21.oracle.com (ucsinet21.oracle.com [156.151.31.93]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id s1HKPctK027068 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 17 Feb 2014 20:25:38 GMT Received: from aserz7022.oracle.com (aserz7022.oracle.com [141.146.126.231]) by ucsinet21.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s1HKPbew016207 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 17 Feb 2014 20:25:37 GMT Received: from abhmp0012.oracle.com (abhmp0012.oracle.com [141.146.116.18]) by aserz7022.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id s1HKPaNB014447; Mon, 17 Feb 2014 20:25:36 GMT Received: from koen-obi.localdomain (/178.116.134.76) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 17 Feb 2014 12:25:36 -0800 From: Koen De Wit To: xfs@oss.sgi.com Cc: linux-btrfs@vger.kernel.org, Koen De Wit Subject: [PATCH v2] xfstests: test for atime-related mount options Date: Mon, 17 Feb 2014 21:25:20 +0100 Message-Id: <1392668720-6135-1-git-send-email-koen.de.wit@oracle.com> X-Mailer: git-send-email 1.7.1 X-Source-IP: ucsinet21.oracle.com [156.151.31.93] Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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) Signed-off-by: Koen De Wit Reviewed-by: Eric Sandeen --- 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