From patchwork Tue Feb 28 12:18:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amir Goldstein X-Patchwork-Id: 9595347 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 D2EAD60429 for ; Tue, 28 Feb 2017 12:21:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C44E228452 for ; Tue, 28 Feb 2017 12:21:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B7149284E7; Tue, 28 Feb 2017 12:21: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 2E28628452 for ; Tue, 28 Feb 2017 12:21:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752430AbdB1MUi (ORCPT ); Tue, 28 Feb 2017 07:20:38 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:36564 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751598AbdB1MUQ (ORCPT ); Tue, 28 Feb 2017 07:20:16 -0500 Received: by mail-wr0-f194.google.com with SMTP id l37so1397448wrc.3; Tue, 28 Feb 2017 04:18:44 -0800 (PST) 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=gGtV1hCA8hCCpYRYw4mpknlpuQ6bEr7LtBJ/rJ3v0Kk=; b=PT2a/yXvxEzpuZdADMhHVguhKr1pRDflHZkRAsgYViBo/50zN4CWwZTtmaURXDHs/O OVXwMGfHzZOoapb+ofVIp7XhZleczHFvUfhZxe5429N+nwmyGCx2mI2EbFjGDe2NX5Hg 1Kp+ZDxfRKARgCO0kLYC/FDeTiYhtI+Be6I1XxjBEXz3Numo3+ozwZcWmrRadA0zlbOi rM82Czeqc2axLuUQS0/QjatNCODH9agMXiR8Tx4wScviDtUegX6n0VUU8qw61KhzQ+qb R4sUYBN90F3LnujhKhAfbnI3Ghf+P6B69N0OvlcPcYCDxuTIjmI9oDdlky9PYEmCucOD ygtw== 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=gGtV1hCA8hCCpYRYw4mpknlpuQ6bEr7LtBJ/rJ3v0Kk=; b=dJIC3t8rFO+wUkL3IqcWbqeWNItAFYXCjCemOZhWcHLUoCwyUOG69h59+qksHfTLtm nVYLNcbRHFyP+sj0vtytG1NFwa7NCioYEv/XZK9WfHOOE8slR4QbR7fl8kHaCWtxLFHc AVhqH1uZTg43wgS5cib4G/YAEIluHt/cTKUrSwqB+E3WeWa/ke4RYgIUPBfPLB7eyVEe RqP4kVJuSLCJoI8glKhuZSpKCXhk1SS2V49RIzOjtpmEpPmOgt4xhSWLUtow9lri8ing mRVpa5WSWm7AZuAMXBkuEAoRTmBIVpZvrjOGbdIYbB8MOPkShNmR3cw/bpvcLXZVppXW 2J4Q== X-Gm-Message-State: AMke39mA15DEno1O1zO3B/EphP1AR52fHC8Ge/Uol6zONLmf2QC460Jlqjmag1wdt7q5/Q== X-Received: by 10.223.172.101 with SMTP id v92mr2295480wrc.49.1488284323810; Tue, 28 Feb 2017 04:18:43 -0800 (PST) Received: from localhost.localdomain (bzq-79-176-143-83.red.bezeqint.net. [79.176.143.83]) by smtp.gmail.com with ESMTPSA id b58sm2105796wra.47.2017.02.28.04.18.42 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 Feb 2017 04:18:43 -0800 (PST) From: Amir Goldstein To: Eryu Guan Cc: Miklos Szeredi , Xiong Zhou , linux-unionfs@vger.kernel.org, fstests@vger.kernel.org Subject: [PATCH v5 01/10] fstests: sanity check that test partitions are not mounted elsewhere Date: Tue, 28 Feb 2017 14:18:28 +0200 Message-Id: <1488284317-3119-2-git-send-email-amir73il@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1488284317-3119-1-git-send-email-amir73il@gmail.com> References: <1488284317-3119-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 When $TEST_DEV is mounted at a different location then $TEST_DIR, _require_test() aborts the test with an error: TEST_DEV=/dev/sda5 is mounted but not on TEST_DIR=/mnt/test There are several problems with current sanity check: 1. the output of the error is mixed into out.bad and hard to see 2. the test partition is unmounted at the end of the test regardless of the fact that it not pass the sanity that we have exclusivity 3. scratch partition has a similar sanity check in _require_scratch(), but we may not get to it, because $SCRATCH_DEV is unmounted prior to running the tests (which could unmount another mount point). To solve all these problems, introduce a helper _check_mounted_on(). It checks if a device is mounted on a given mount point and optionally checks the mounted fs type. The sanity checks in _require_scratch() and _require_test() are converted to use the helper and gain the check for correct fs type. The helper is used in init_rc() to sanity check both test and scratch partitions, before tests are run and before $SCRATCH_DEV is unmounted. Signed-off-by: Amir Goldstein --- common/rc | 90 +++++++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 56 insertions(+), 34 deletions(-) diff --git a/common/rc b/common/rc index 8f23334..dab3cb2 100644 --- a/common/rc +++ b/common/rc @@ -1354,6 +1354,43 @@ _supported_os() _notrun "not suitable for this OS: $HOSTOS" } +# check if a FS on a device is mounted +# if so, verify that it is mounted on mount point +# if fstype is given as argument, verify that it is also +# mounted with correct fs type +# +_check_mounted_on() +{ + local devname=$1 + local dev=$2 + local mntname=$3 + local mnt=$4 + local type=$5 + + # Note that we use -F here so grep doesn't try to interpret an NFS over + # IPv6 server as a regular expression + local mount_rec=`_mount | grep -F "$dev"` + [ -n "$mount_rec" ] || return 1 # 1 = not mounted + + # if it's mounted, make sure its on $mnt + if ! (echo $mount_rec | grep -q "$mnt") + then + echo "$devname=$dev is mounted but not on $mntname=$mnt - aborting" + echo "Already mounted result:" + echo $mount_rec + return 2 # 2 = mounted on wrong mnt + fi + + if [ -n "$type" -a "`_fs_type $dev`" != "$type" ] + then + echo "$devname=$dev is mounted but not a type $type filesystem" + # raw $DF_PROG cannot handle NFS/CIFS/overlay correctly + _df_device $dev + return 3 # 3 = mounted as wrong type + fi + return 0 # 0 = mounted as expected +} + # this test needs a scratch partition - check we're ok & unmount it # No post-test check of the device is required. e.g. the test intentionally # finishes the test with the filesystem in a corrupt state @@ -1408,21 +1445,12 @@ _require_scratch_nocheck() ;; esac - # mounted? - # Note that we use -F here so grep doesn't try to interpret an NFS over - # IPv6 server as a regular expression. - mount_rec=`_mount | grep -F $SCRATCH_DEV` - if [ "$mount_rec" ] + _check_mounted_on SCRATCH_DEV $SCRATCH_DEV SCRATCH_MNT $SCRATCH_MNT + local err=$? + [ $err -le 1 ] || exit 1 + if [ $err -eq 0 ] then - # if it's mounted, make sure its on $SCRATCH_MNT - if ! echo $mount_rec | grep -q $SCRATCH_MNT - then - echo "\$SCRATCH_DEV=$SCRATCH_DEV is mounted but not on \$SCRATCH_MNT=$SCRATCH_MNT - aborting" - echo "Already mounted result:" - echo $mount_rec - exit 1 - fi - # and then unmount it + # if it's mounted, unmount it if ! _scratch_unmount then echo "failed to unmount $SCRATCH_DEV" @@ -1493,21 +1521,11 @@ _require_test() ;; esac - # mounted? - # Note that we use -F here so grep doesn't try to interpret an NFS over - # IPv6 server as a regular expression. - mount_rec=`_mount | grep -F $TEST_DEV` - if [ "$mount_rec" ] + _check_mounted_on TEST_DEV $TEST_DEV TEST_DIR $TEST_DIR + local err=$? + [ $err -le 1 ] || exit 1 + if [ $err -ne 0 ] then - # if it's mounted, make sure its on $TEST_DIR - if ! echo $mount_rec | grep -q $TEST_DIR - then - echo "\$TEST_DEV=$TEST_DEV is mounted but not on \$TEST_DIR=$TEST_DIR - aborting" - echo "Already mounted result:" - echo $mount_rec - exit 1 - fi - else out=`_mount_or_remount_rw "$MOUNT_OPTIONS" $TEST_DEV $TEST_DIR` if [ $? -ne 1 ]; then echo $out @@ -3132,13 +3150,17 @@ init_rc() fi fi - if [ "`_fs_type $TEST_DEV`" != "$FSTYP" ] - then - echo "common/rc: Error: \$TEST_DEV ($TEST_DEV) is not a MOUNTED $FSTYP filesystem" - # raw $DF_PROG cannot handle NFS/CIFS/overlay correctly - _df_device $TEST_DEV - exit 1 + # Sanity check that TEST partition is not mounted at another mount point + # or as another fs type + _check_mounted_on TEST_DEV $TEST_DEV TEST_DIR $TEST_DIR $FSTYP || exit 1 + if [ -n "$SCRATCH_DEV" ]; then + # Sanity check that SCRATCH partition is not mounted at another + # mount point, because it is about to be unmounted and formatted. + # Another fs type for scratch is fine (bye bye old fs type). + _check_mounted_on SCRATCH_DEV $SCRATCH_DEV SCRATCH_MNT $SCRATCH_MNT + [ $? -le 1 ] || exit 1 fi + # Figure out if we need to add -F ("foreign", deprecated) option to xfs_io $XFS_IO_PROG -c stat $TEST_DIR 2>&1 | grep -q "is not on an XFS filesystem" && \ export XFS_IO_PROG="$XFS_IO_PROG -F"