From patchwork Mon Apr 3 12:00:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Howells X-Patchwork-Id: 9659451 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 60B3860353 for ; Mon, 3 Apr 2017 12:01:12 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 513F926E3A for ; Mon, 3 Apr 2017 12:01:12 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 4619C284BC; Mon, 3 Apr 2017 12:01:12 +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=unavailable 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 A13D626E3A for ; Mon, 3 Apr 2017 12:01:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751465AbdDCMBK (ORCPT ); Mon, 3 Apr 2017 08:01:10 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47582 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751457AbdDCMBJ (ORCPT ); Mon, 3 Apr 2017 08:01:09 -0400 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 30A337D0FD; Mon, 3 Apr 2017 12:00:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 30A337D0FD Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=dhowells@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 30A337D0FD Received: from warthog.procyon.org.uk (ovpn-120-211.rdu2.redhat.com [10.10.120.211]) by smtp.corp.redhat.com (Postfix) with ESMTP id A5B9A7EFF6; Mon, 3 Apr 2017 12:00:18 +0000 (UTC) Organization: Red Hat UK Ltd. Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SI4 1TE, United Kingdom. Registered in England and Wales under Company Registration No. 3798903 Subject: [PATCH 4/4] xfstests: Check the stx_attributes settable by chattr [ver #3] From: David Howells To: linux-xfs@vger.kernel.org Cc: hch@infradead.org, amir73il@gmail.com, david@fromorbit.com, fstests@vger.kernel.org, dhowells@redhat.com, linux-fsdevel@vger.kernel.org Date: Mon, 03 Apr 2017 13:00:14 +0100 Message-ID: <149122081486.24821.15266397607503484126.stgit@warthog.procyon.org.uk> In-Reply-To: <149122078093.24821.17192375733082382807.stgit@warthog.procyon.org.uk> References: <149122078093.24821.17192375733082382807.stgit@warthog.procyon.org.uk> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Mon, 03 Apr 2017 12:01:08 +0000 (UTC) Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Check the stx_attributes that can be set by calling chattr. Signed-off-by: David Howells --- doc/requirement-checking.txt | 16 +++++++ src/stat_test.c | 71 +++++++++++++++++++++++++++++++ tests/generic/421 | 95 ++++++++++++++++++++++++++++++++++++++++++ tests/generic/421.out | 1 tests/generic/group | 1 5 files changed, 183 insertions(+), 1 deletion(-) create mode 100755 tests/generic/421 create mode 100644 tests/generic/421.out -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/doc/requirement-checking.txt b/doc/requirement-checking.txt index 29f0b74..523b27f 100644 --- a/doc/requirement-checking.txt +++ b/doc/requirement-checking.txt @@ -12,7 +12,11 @@ they have. This is done with _require_ macros, which may take parameters. _require_test_program _require_xfs_io_command - (2) System call requirements. + (2) Filesystem capability requirements. + + _require_chattr + + (3) System call requirements. _require_statx @@ -59,6 +63,16 @@ _require_xfs_io_command "falloc" the 'falloc' command. +================================== +FILESYSTEM CAPABILITY REQUIREMENTS +================================== + +_require_chattr + + The test requires that the chattr command be available and supported by + the $TEST_DEV filesystem. No check is made of the scratch filesystem. + + ======================== SYSTEM CALL REQUIREMENTS ======================== diff --git a/src/stat_test.c b/src/stat_test.c index cb3d4f4..b1205ec 100644 --- a/src/stat_test.c +++ b/src/stat_test.c @@ -102,6 +102,30 @@ static int field_cmp(const void *_key, const void *_p) return strcmp(key, p->name); } +/* + * Sorted list of attribute flags for bsearch(). + */ +struct attr_name { + const char *name; + __u64 attr_flag; +}; + +static const struct attr_name attr_list[] = { + { "append", STATX_ATTR_APPEND }, + { "automount", STATX_ATTR_AUTOMOUNT }, + { "compressed", STATX_ATTR_COMPRESSED }, + { "encrypted", STATX_ATTR_ENCRYPTED }, + { "immutable", STATX_ATTR_IMMUTABLE }, + { "nodump", STATX_ATTR_NODUMP }, +}; + +static int attr_name_cmp(const void *_key, const void *_p) +{ + const char *key = _key; + const struct attr_name *p = _p; + return strcmp(key, p->name); +} + struct file_type { const char *name; mode_t mode; @@ -128,6 +152,13 @@ void format(void) fprintf(stderr, "usage: %s [-v] [-m] [checks]\n", prog); fprintf(stderr, "\t can be basic, all or a number; all is the default\n"); fprintf(stderr, "checks is a list of zero or more of:\n"); + fprintf(stderr, "\tattr=[+-] -- check an attribute in stx_attributes\n"); + fprintf(stderr, "\t\tappend -- The file is marked as append only\n"); + fprintf(stderr, "\t\tautomount -- The object is an automount point\n"); + fprintf(stderr, "\t\tcompressed -- The file is marked as compressed\n"); + fprintf(stderr, "\t\tencrypted -- The file is marked as encrypted\n"); + fprintf(stderr, "\t\timmutable -- The file is marked as immutable\n"); + fprintf(stderr, "\t\tnodump -- The file is marked as no-dump\n"); fprintf(stderr, "\tcmp_ref -- check that the reference file has identical stats\n"); fprintf(stderr, "\tref= -- get reference stats from file\n"); fprintf(stderr, "\tstx_= -- statx field value check\n"); @@ -564,6 +595,40 @@ static void check_field(const struct statx *stx, char *arg) } /* + * Check attributes in stx_attributes. When stx_attributes_mask gets in + * upstream, we will need to consider that also. + */ +static void check_attribute(const struct statx *stx, char *arg) +{ + const struct attr_name *p; + __u64 attr; + bool set; + + verbose("check attr %s\n", arg); + switch (arg[0]) { + case '+': set = true; break; + case '-': set = false; break; + default: + bad_arg("attr flag must be marked + (set) or - (unset)\n"); + } + arg++; + + p = bsearch(arg, attr_list, sizeof(attr_list) / sizeof(attr_list[0]), + sizeof(attr_list[0]), attr_name_cmp); + if (!p) + bad_arg("Unrecognised attr name '%s'\n", arg); + + attr = p->attr_flag; + if (set) { + check(stx->stx_attributes && attr, + "Attribute %s should be set\n", arg); + } else { + check(~stx->stx_attributes && attr, + "Attribute %s should be unset\n", arg); + } +} + +/* * Do the testing. */ int main(int argc, char **argv) @@ -669,6 +734,12 @@ int main(int argc, char **argv) for (; *argv; argv++) { char *arg = *argv; + if (strncmp("attr=", arg, 5) == 0) { + /* attr=[+-] - check attribute flag */ + check_attribute(&stx, arg + 5); + continue; + } + if (strcmp("cmp_ref", arg) == 0) { /* cmp_ref - check ref file has same stats */ cmp_ref(&stx, mask); diff --git a/tests/generic/421 b/tests/generic/421 new file mode 100755 index 0000000..33a5ec8 --- /dev/null +++ b/tests/generic/421 @@ -0,0 +1,95 @@ +#! /bin/bash +# FS QA Test 421 +# +# Test the statx stx_attribute flags that can be set with chattr +# +#----------------------------------------------------------------------- +# Copyright (c) 2017 YOUR NAME HERE. 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 +trap "_cleanup; exit \$status" 0 1 2 3 15 + +_cleanup() +{ + cd / + rm -f $tmp.* + rm -f $seq-file +} + +# 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 generic +_supported_os IRIX Linux +_require_test +_require_test_program "stat_test" +_require_statx +_require_chattr + +function check_stat () { + $here/src/stat_test $* || echo stat_test failed +} + +touch $seq-file + +function try () { + chattr $* $seq-file + check_stat $seq-file \ + attr=${1/a/append} \ + attr=${2/c/compressed} \ + attr=${3/i/immutable} \ + attr=${4/d/nodump} \ + stx_type=file \ + stx_size=0 \ + stx_rdev_major=0 \ + stx_rdev_minor=0 \ + stx_nlink=1 +} + +# We can turn on and off append (a), compressed (c), immutable (i) and +# no-dump (d) +for a in +a -a +do + for c in +c -c + do + for i in +i -i + do + for d in +d -d + do + try $a $c $i $d + done + done + done +done + +# Done. We leave the success determination to the output comparator. +status=0 +exit diff --git a/tests/generic/421.out b/tests/generic/421.out new file mode 100644 index 0000000..984fb43 --- /dev/null +++ b/tests/generic/421.out @@ -0,0 +1 @@ +QA output created by 421 diff --git a/tests/generic/group b/tests/generic/group index 5678101..f8b01fc 100644 --- a/tests/generic/group +++ b/tests/generic/group @@ -423,3 +423,4 @@ 418 auto rw 419 auto quick encrypt 420 auto quick +421 auto quick