From patchwork Tue Nov 8 09:15:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Qu Wenruo X-Patchwork-Id: 9416965 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A426860459 for ; Tue, 8 Nov 2016 09:15:59 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9567B2875E for ; Tue, 8 Nov 2016 09:15:59 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8A10228F25; Tue, 8 Nov 2016 09:15:59 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C87342875E for ; Tue, 8 Nov 2016 09:15:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932478AbcKHJPz (ORCPT ); Tue, 8 Nov 2016 04:15:55 -0500 Received: from cn.fujitsu.com ([222.73.24.84]:44189 "EHLO song.cn.fujitsu.com" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S932256AbcKHJPu (ORCPT ); Tue, 8 Nov 2016 04:15:50 -0500 X-IronPort-AV: E=Sophos;i="5.20,367,1444665600"; d="scan'208";a="950336" Received: from unknown (HELO cn.fujitsu.com) ([10.167.250.3]) by song.cn.fujitsu.com with ESMTP; 08 Nov 2016 17:15:23 +0800 Received: from localhost.localdomain (unknown [10.167.226.34]) by cn.fujitsu.com (Postfix) with ESMTP id 64ED6400283C; Tue, 8 Nov 2016 17:15:19 +0800 (CST) From: Qu Wenruo To: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org Subject: [PATCH] fstests: btrfs: Check false ENOSPC bug caused by incorrect metadata reserve Date: Tue, 8 Nov 2016 17:15:15 +0800 Message-Id: <20161108091515.20867-1-quwenruo@cn.fujitsu.com> X-Mailer: git-send-email 2.10.2 MIME-Version: 1.0 X-yoursite-MailScanner-ID: 64ED6400283C.ADF4E X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: quwenruo@cn.fujitsu.com Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Due to the fact that btrfs uses different max extent size for compressed and non-compressed write, it calculates metadata reservation incorrectly. This can leads to false ENOSPC alert for compressed write. This test case will check it by using small fs and large nodesize, and do parallel compressed write to trigger it. The fix is not merged and may change in the future, but the function is good enough: btrfs: improve inode's outstanding_extents computation btrfs: fix false enospc for compression Signed-off-by: Qu Wenruo --- tests/btrfs/132 | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/132.out | 2 ++ tests/btrfs/group | 1 + 3 files changed, 92 insertions(+) create mode 100755 tests/btrfs/132 create mode 100644 tests/btrfs/132.out diff --git a/tests/btrfs/132 b/tests/btrfs/132 new file mode 100755 index 0000000..95c21ea --- /dev/null +++ b/tests/btrfs/132 @@ -0,0 +1,89 @@ +#! /bin/bash +# FS QA Test 132 +# +# Check if false ENOSPC will happen when parallel buffer write happens +# The problem is caused by incorrect metadata reservation. +# +#----------------------------------------------------------------------- +# Copyright (c) 2016 Fujitsu. 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 -f $tmp.* +} + +# get standard environment, filters and checks +. ./common/rc +. ./common/filter + +# remove previous $seqres.full before test +rm -f $seqres.full + +# real QA test starts here + +# Modify as appropriate. +_supported_fs btrfs +_supported_os Linux +_require_scratch + +# Use small filesystem with maximum nodesize. +# Since the false ENOSPC happens due to incorrect metadata reservation, +# larger nodesize and small fs will make it much easier to reproduce +_scratch_mkfs -b 512M -n 64k >> $seqres.full 2>&1 +_scratch_mount "-o compress" + +sleep_time=$(($TIME_FACTOR * 15)) +loop_writer() +{ + offset=$1 + len=$2 + file=$3 + + while true; + do + # Only need stderr, and we need to specify small block size + # but still trigger compression + xfs_io -c "pwrite -b 8K $offset $len" $file 2>&1 > /dev/null + done +} + +touch $SCRATCH_MNT/testfile + +# Start 2 writter writting into the same file +# The file is 142M, which is smaller than 1/2 of the filesystem, +# so no other cause can lead to ENOSPC. +loop_writer 0 128M $SCRATCH_MNT/testfile & +loop_writer 128M 16M $SCRATCH_MNT/testfile & + +sleep $sleep_time + +kill 0 +sleep + +status=0 +exit diff --git a/tests/btrfs/132.out b/tests/btrfs/132.out new file mode 100644 index 0000000..b096312 --- /dev/null +++ b/tests/btrfs/132.out @@ -0,0 +1,2 @@ +QA output created by 132 +Silence is golden diff --git a/tests/btrfs/group b/tests/btrfs/group index c090604..ec8ad80 100644 --- a/tests/btrfs/group +++ b/tests/btrfs/group @@ -134,3 +134,4 @@ 129 auto quick send 130 auto clone send 131 auto quick +132 auto compress