From patchwork Tue Feb 24 11:21:04 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Filipe Manana X-Patchwork-Id: 5872261 Return-Path: X-Original-To: patchwork-fstests@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id E7668BF440 for ; Tue, 24 Feb 2015 11:31:24 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id DA75E20652 for ; Tue, 24 Feb 2015 11:31:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AE9F820430 for ; Tue, 24 Feb 2015 11:31:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752279AbbBXLbW (ORCPT ); Tue, 24 Feb 2015 06:31:22 -0500 Received: from victor.provo.novell.com ([137.65.250.26]:39076 "EHLO prv3-mh.provo.novell.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751498AbbBXLbV (ORCPT ); Tue, 24 Feb 2015 06:31:21 -0500 Received: from debian3.lan (prv-ext-foundry1int.gns.novell.com [137.65.251.240]) by prv3-mh.provo.novell.com with ESMTP (NOT encrypted); Tue, 24 Feb 2015 04:31:05 -0700 From: Filipe Manana To: fstests@vger.kernel.org Cc: linux-btrfs@vger.kernel.org, Filipe Manana Subject: [PATCH v2] fstests: generic test for fsync after removing xattrs Date: Tue, 24 Feb 2015 11:21:04 +0000 Message-Id: <1424776864-16024-1-git-send-email-fdmanana@suse.com> X-Mailer: git-send-email 2.1.3 In-Reply-To: <1424721327-25972-1-git-send-email-fdmanana@suse.com> References: <1424721327-25972-1-git-send-email-fdmanana@suse.com> Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_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 This test is motivated by an fsync issue discovered in btrfs. The issue was that the fsync log replay code did not remove xattrs that were deleted before the inode was fsynced. The result was unexpected and differed from xfs and ext3/4 for example. The btrfs issue was fixed by the following linux kernel patch: Btrfs: remove deleted xattrs on fsync log replay Signed-off-by: Filipe Manana --- V2: Make use of the new function '_require_metadata_journaling' added by Eric. Updated description of the test at the very top of the test file. tests/generic/061 | 121 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/generic/061.out | 10 +++++ tests/generic/group | 1 + 3 files changed, 132 insertions(+) create mode 100755 tests/generic/061 create mode 100644 tests/generic/061.out diff --git a/tests/generic/061 b/tests/generic/061 new file mode 100755 index 0000000..14eddac --- /dev/null +++ b/tests/generic/061 @@ -0,0 +1,121 @@ +#! /bin/bash +# FS QA Test No. 061 +# +# This test is motivated by an fsync issue discovered in btrfs. +# The issue was that the fsync log replay code did not remove xattrs that were +# deleted before the inode was fsynced. So verify that if we delete a xattr from +# a file and then fsync the file, after log replay the file does not have that +# xattr anymore. Also test the case where a file is fsynced, one of its xattrs +# is removed, a hard link to that file is created and the fsync log is committed +# by issuing an fsync on another file. This indirect case should also result in +# not having the xattr anymore after the fsync log is replayed. +# +# The btrfs issue was fixed by the following linux kernel patch: +# +# Btrfs: remove deleted xattrs on fsync log replay +# +#----------------------------------------------------------------------- +# Copyright (C) 2015 SUSE Linux Products GmbH. All Rights Reserved. +# Author: Filipe Manana +# +# 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! + +_cleanup() +{ + _cleanup_flakey + rm -f $tmp.* +} +trap "_cleanup; exit \$status" 0 1 2 3 15 + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter +. ./common/dmflakey +. ./common/attr + +# real QA test starts here +_supported_fs generic +_supported_os Linux +_need_to_be_root +_require_scratch +_require_dm_flakey +_require_attrs +_require_metadata_journaling $SCRATCH_DEV + +_crash_and_mount() +{ + # Simulate a crash/power loss. + _load_flakey_table $FLAKEY_DROP_WRITES + _unmount_flakey + _load_flakey_table $FLAKEY_ALLOW_WRITES + _mount_flakey +} + +rm -f $seqres.full + +_scratch_mkfs >> $seqres.full 2>&1 +_init_flakey +_mount_flakey + +# Create out test file and add 3 xattrs to it. +touch $SCRATCH_MNT/foobar +$SETFATTR_PROG -n user.attr1 -v val1 $SCRATCH_MNT/foobar +$SETFATTR_PROG -n user.attr2 -v val2 $SCRATCH_MNT/foobar +$SETFATTR_PROG -n user.attr3 -v val3 $SCRATCH_MNT/foobar + +# Make sure everything is durably persisted. +sync + +# Now delete the second xattr and fsync the inode. +$SETFATTR_PROG -x user.attr2 $SCRATCH_MNT/foobar +$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foobar + +_crash_and_mount + +# After the fsync log is replayed, the file should have only 2 xattrs, the ones +# named user.attr1 and user.attr3. The btrfs fsync log replay bug left the file +# with the 3 xattrs that we had before deleting the second one and fsyncing the +# file. +echo "xattr names and values after first fsync log replay:" +$GETFATTR_PROG --absolute-names --dump $SCRATCH_MNT/foobar | _filter_scratch + +# Now write some data to our file, fsync it, remove the first xattr, add a new +# hard link to our file and commit the fsync log by fsyncing some other new +# file. This is to verify that after log replay our first xattr does not exist +# anymore. +echo "hello world!" >> $SCRATCH_MNT/foobar +$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/foobar +$SETFATTR_PROG -x user.attr1 $SCRATCH_MNT/foobar +ln $SCRATCH_MNT/foobar $SCRATCH_MNT/foobar_link +touch $SCRATCH_MNT/qwerty +$XFS_IO_PROG -c "fsync" $SCRATCH_MNT/qwerty + +_crash_and_mount + +# Now only the xattr with name user.attr3 should be set in our file. +echo "xattr names and values after second fsync log replay:" +$GETFATTR_PROG --absolute-names --dump $SCRATCH_MNT/foobar | _filter_scratch + +status=0 +exit diff --git a/tests/generic/061.out b/tests/generic/061.out new file mode 100644 index 0000000..028d9e6 --- /dev/null +++ b/tests/generic/061.out @@ -0,0 +1,10 @@ +QA output created by 061 +xattr names and values after first fsync log replay: +# file: SCRATCH_MNT/foobar +user.attr1="val1" +user.attr3="val3" + +xattr names and values after second fsync log replay: +# file: SCRATCH_MNT/foobar +user.attr3="val3" + diff --git a/tests/generic/group b/tests/generic/group index 85ff384..758f0e2 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -62,6 +62,7 @@ 057 metadata auto quick 059 metadata auto quick 060 metadata auto quick +061 metadata auto quick 062 attr udf auto quick 068 other auto freeze dangerous stress 069 rw udf auto quick