From patchwork Wed Jul 5 12:02:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9826429 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 1EDAB603B5 for ; Wed, 5 Jul 2017 12:02:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1529627F54 for ; Wed, 5 Jul 2017 12:02:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 09C8028397; Wed, 5 Jul 2017 12:02:03 +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.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID 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 65F68284D2 for ; Wed, 5 Jul 2017 12:02:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752767AbdGEMCB (ORCPT ); Wed, 5 Jul 2017 08:02:01 -0400 Received: from mail-wm0-f67.google.com ([74.125.82.67]:34925 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752825AbdGEMB5 (ORCPT ); Wed, 5 Jul 2017 08:01:57 -0400 Received: by mail-wm0-f67.google.com with SMTP id u23so32037854wma.2; Wed, 05 Jul 2017 05:01:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=lS1QYF2OfH3lW2SbMaDSHbpkW+B2sAFQ4GANrY3VBMc=; b=riJGoX8yGiA7CcJvMd73pwfYzs1q4BvW1N6vrh/MGenWALnXy9qXKnNE9VgkCV5/m5 38ukpWSJxeYrJhqHOXJLp8N17/jDhK1EY7b8K5JrNiaQruB0xW/nPthhNcSGEV3pMJj/ aYMZRKXyMB5DRCl8Z3YLN7YkfBn7LWcZjVBNqBVKXF72OAzxvT/wdMv07v3z1Hn5pacG Fj4e3XB1knkl97i3ryB3Ju+R+XNc50mIisXROwRnHvtx9utmBNpK7SmWAJCzYrEeIYxQ LTmgTLQcz+5TmbdKzLsR1ekFa0imZhF8YI9hgMTE+o6iTkay+V83DFB4EDOWfkH7Z2k5 CbZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=lS1QYF2OfH3lW2SbMaDSHbpkW+B2sAFQ4GANrY3VBMc=; b=sksUf8/0+OIWeB779gROXEgGnheQIoVM3Z219I15TKxTeYDqGONtEec8hP3il6mYwa 3lvinQ3SuHXJWa1kGNn7vRjCOSCCGxOHKePUdHPRpA+34geeWdtJVb6h9j1x8yyqABu7 OqLkyDHI1IBhgj1C9jrp1B51JvuegPCt9TBqZVYtVtSLl8H4gs8LH65pfuzNwmNLoAMK IIkzJY/1RGSZvgCydVvigKv34ciboUg3nIDbWVXyHPeZNjzfyy/LV2szhUbTB1o43ehe Fx/dLREOE9gPpuA8VwKka3O7FJLPhMgHmeug2Z5YUBfRo8fITzQbtoWm2FVXSwdulZOK kqWw== X-Gm-Message-State: AIVw111SjJIjpEQLQP54eZiuxaIKmUds9N/+FC1CPOE2zWi6WLdJiFg+ SKwj+v0Y3YXs3w== X-Received: by 10.28.56.198 with SMTP id f189mr9232031wma.88.1499256115555; Wed, 05 Jul 2017 05:01:55 -0700 (PDT) Received: from amir-VirtualBox.ctera.local (bzq-166-168-31-246.red.bezeqint.net. [31.168.166.246]) by smtp.gmail.com with ESMTPSA id 143sm155578wmg.9.2017.07.05.05.01.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 05 Jul 2017 05:01:54 -0700 (PDT) From: Amir Goldstein To: Eryu Guan Cc: Miklos Szeredi , linux-unionfs@vger.kernel.org, fstests@vger.kernel.org Subject: [PATCH v3 6/7] overlay: test nlink accounting of overlay hardlinks Date: Wed, 5 Jul 2017 15:02:05 +0300 Message-Id: <1499256126-21866-7-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1499256126-21866-1-git-send-email-amir73il@gmail.com> References: <1499256126-21866-1-git-send-email-amir73il@gmail.com> Sender: fstests-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: fstests@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP nlink of overlay inode should account for the union of lower and upper hardlinks. persistent overlay union nlink is stored in an extended attribute on the upper inode. In order to test persistent overlay nlink accounting, the test is repeated with both warm and cold dentry/inode cache. Signed-off-by: Amir Goldstein --- tests/overlay/033 | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/overlay/033.out | 69 +++++++++++++++++++++++ tests/overlay/group | 1 + 3 files changed, 219 insertions(+) create mode 100755 tests/overlay/033 create mode 100644 tests/overlay/033.out diff --git a/tests/overlay/033 b/tests/overlay/033 new file mode 100755 index 0000000..743edc8 --- /dev/null +++ b/tests/overlay/033 @@ -0,0 +1,149 @@ +#! /bin/bash +# FS QA Test 033 +# +# Test nlink accounting of overlay hardlinks. +# +# nlink of overlay inode should account for the union of lower and upper +# hardlinks. +# +#----------------------------------------------------------------------- +# Copyright (C) 2017 CTERA Networks. All Rights Reserved. +# Author: Amir Goldstein +# +# 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" + +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 +_supported_fs overlay +_supported_os Linux +_require_scratch + +report_nlink() +{ + when=$1 + + [ $DCACHETEMP != cold ] || echo 2 > /proc/sys/vm/drop_caches + + # check nlink with warm dcache after overlay modification + echo "== $when - $DCACHETEMP dcache ==" + for f in $HARDLINKS; do + _ls_l $SCRATCH_MNT/$f | awk '{ print $2, $9 }' | _filter_scratch + done +} + +# Create lower hardlinks +create_hardlinks() +{ + lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER + mkdir -p $lowerdir + touch $lowerdir/0 + ln $lowerdir/0 $lowerdir/1 + ln $lowerdir/0 $lowerdir/2 + ln $lowerdir/0 $lowerdir/3 +} + +test_hardlinks() +{ + HARDLINKS=`seq 0 3` + report_nlink "all lower" + + # Unlink lower hardlink + rm $SCRATCH_MNT/0 + HARDLINKS=`seq 1 3` + report_nlink "unlink lower" + + # Link to lower hardlink + ln $SCRATCH_MNT/3 $SCRATCH_MNT/4 + HARDLINKS=`seq 1 4` + report_nlink "link lower" + + # Link to upper hardlink + ln $SCRATCH_MNT/4 $SCRATCH_MNT/5 + HARDLINKS=`seq 1 5` + report_nlink "link upper" + + # Rename over lower hardlink + touch $SCRATCH_MNT/new + mv $SCRATCH_MNT/new $SCRATCH_MNT/1 + HARDLINKS=`seq 2 5` + report_nlink "cover lower" + + # Unlink upper hardlink + rm $SCRATCH_MNT/5 + HARDLINKS=`seq 2 4` + report_nlink "unlink upper" + + # Rename over upper hardlink + touch $SCRATCH_MNT/new + mv $SCRATCH_MNT/new $SCRATCH_MNT/4 + HARDLINKS=`seq 2 3` + report_nlink "cover upper" + + # Unlink last upper (union still has one lower) + rm $SCRATCH_MNT/3 + HARDLINKS=2 + report_nlink "unlink last upper" + + # Unlink last lower and drop union nlink to zero (and hopefully not below) + rm $SCRATCH_MNT/2 + + # Verify that orphan index is cleaned when dropping nlink to zero + ls $OVL_BASE_SCRATCH_MNT/$OVL_WORK/index 2>/dev/null +} + +# Remove all files from previous tests +_scratch_mkfs + +# Create lower hardlinks +create_hardlinks + +_scratch_mount +# Test hardlinks with warm dcache +DCACHETEMP=warm +test_hardlinks + +# Reset to lower hardlinks +_scratch_unmount +_scratch_mkfs +create_hardlinks +_scratch_mount + +# Test hardlinks with cold dcache +DCACHETEMP=cold +test_hardlinks + +status=0 +exit diff --git a/tests/overlay/033.out b/tests/overlay/033.out new file mode 100644 index 0000000..506ccc1 --- /dev/null +++ b/tests/overlay/033.out @@ -0,0 +1,69 @@ +QA output created by 033 +== all lower - warm dcache == +4 SCRATCH_MNT/0 +4 SCRATCH_MNT/1 +4 SCRATCH_MNT/2 +4 SCRATCH_MNT/3 +== unlink lower - warm dcache == +3 SCRATCH_MNT/1 +3 SCRATCH_MNT/2 +3 SCRATCH_MNT/3 +== link lower - warm dcache == +4 SCRATCH_MNT/1 +4 SCRATCH_MNT/2 +4 SCRATCH_MNT/3 +4 SCRATCH_MNT/4 +== link upper - warm dcache == +5 SCRATCH_MNT/1 +5 SCRATCH_MNT/2 +5 SCRATCH_MNT/3 +5 SCRATCH_MNT/4 +5 SCRATCH_MNT/5 +== cover lower - warm dcache == +4 SCRATCH_MNT/2 +4 SCRATCH_MNT/3 +4 SCRATCH_MNT/4 +4 SCRATCH_MNT/5 +== unlink upper - warm dcache == +3 SCRATCH_MNT/2 +3 SCRATCH_MNT/3 +3 SCRATCH_MNT/4 +== cover upper - warm dcache == +2 SCRATCH_MNT/2 +2 SCRATCH_MNT/3 +== unlink last upper - warm dcache == +1 SCRATCH_MNT/2 +== all lower - cold dcache == +4 SCRATCH_MNT/0 +4 SCRATCH_MNT/1 +4 SCRATCH_MNT/2 +4 SCRATCH_MNT/3 +== unlink lower - cold dcache == +3 SCRATCH_MNT/1 +3 SCRATCH_MNT/2 +3 SCRATCH_MNT/3 +== link lower - cold dcache == +4 SCRATCH_MNT/1 +4 SCRATCH_MNT/2 +4 SCRATCH_MNT/3 +4 SCRATCH_MNT/4 +== link upper - cold dcache == +5 SCRATCH_MNT/1 +5 SCRATCH_MNT/2 +5 SCRATCH_MNT/3 +5 SCRATCH_MNT/4 +5 SCRATCH_MNT/5 +== cover lower - cold dcache == +4 SCRATCH_MNT/2 +4 SCRATCH_MNT/3 +4 SCRATCH_MNT/4 +4 SCRATCH_MNT/5 +== unlink upper - cold dcache == +3 SCRATCH_MNT/2 +3 SCRATCH_MNT/3 +3 SCRATCH_MNT/4 +== cover upper - cold dcache == +2 SCRATCH_MNT/2 +2 SCRATCH_MNT/3 +== unlink last upper - cold dcache == +1 SCRATCH_MNT/2 diff --git a/tests/overlay/group b/tests/overlay/group index 2baba3a..35cd5a5 100644 --- a/tests/overlay/group +++ b/tests/overlay/group @@ -35,3 +35,4 @@ 030 auto quick perms 031 auto quick whiteout 032 auto quick copyup hardlink +033 auto quick copyup hardlink