Files
apfstests/tests/generic/423
T
David Howells d1ba8b79a6 generic: Add first statx test
Add a statx test script that does the following:

 (1) Creates one each of the various types of file object and creates a
     hard link to the regular file.

     Note that the creation of an AF_UNIX socket is done with netcat in a
     bash coprocessing thread.  This might be best done with another
     in-house helper to avoid a dependency on nc.

 (2) Invokes the C test program included in this patch after the creation
     and hands it a list of things to check appropriate to each object.

 (3) Asks the test program to check the creation time of each object
     against that of the preceding object.

 (4) Makes various tests on the timestamps of the hardlinked file.

The patch also creates a C[*] test program to do the actual stat checking.
The test program then does the following:

 (1) Compares the output of statx() to that of fstatat().

 (2) Optionally compares the timestamps to see that they're sensibly
     ordered with respect to each other.

 (3) Optionally compares the timestamps to those of a reference file.

 (4) Optionally compares the timestamps to a specified time.

 (5) Optionally compares selected stats to values specified on the command
     line.

 (6) Optionally compares all the stats to those of a reference file,
     requiring them to be the same (hard link checking).

For example:

	./src/stat_test /dev/null \
	       stx_type=char \
	       stx_rdev_major=3 \
	       stx_rdev_minor=8 \
	       stx_nlink=1 \
	       ref=/dev/zero \
	       ts=B,b

The test program can also be given a --check-statx parameter to give a
quick exit code-based answer on whether statx() exists within the kernel.

[*] Note that it proved much easier to do this in C than trying to do it in
    shell script and trying parsing the output of xfs_io.  Using xfs_io has
    other pitfalls also: it wants to *open* the file, even if the file is
    not an appropriate type for this or does not grant permission to do so.
    I can get around this by opening O_PATH, but then xfs_io fails to
    handle XFS files because it wants to issue ioctls on every fd it opens.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eryu Guan <eguan@redhat.com>
2017-04-11 12:34:24 +08:00

181 lines
4.4 KiB
Bash
Executable File

#! /bin/bash
# FS QA Test 423
#
# Test the statx system call
#
#-----------------------------------------------------------------------
# Copyright (c) 2017 Red Hat, Inc. All Rights Reserved.
# Written by David Howells (dhowells@redhat.com)
#
# 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 -rf $TEST_DIR/$seq-*
}
# 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 Linux
_require_test
_require_test_program "stat_test"
_require_test_program "af_unix"
_require_statx
function check_stat () {
$here/src/stat_test $* || echo stat_test failed
}
function create_af_unix () {
$here/src/af_unix $* || echo af_unix failed
}
###############################################################################
#
# Check statx'ing of various types of object
#
# After each object is created, barring the first, we check that the creation
# time and the change time of the new object as same as or later than the
# corresponding timestamps on the previous object created.
#
###############################################################################
echo "Test statx on a fifo"
mkfifo -m 0600 $TEST_DIR/$seq-fifo
check_stat $TEST_DIR/$seq-fifo \
ts_order \
stx_type=fifo \
stx_mode=0600 \
stx_rdev_major=0 \
stx_rdev_minor=0 \
stx_nlink=1
echo "Test statx on a chardev"
mknod -m 0600 $TEST_DIR/$seq-null c 1 3
check_stat $TEST_DIR/$seq-null \
ts_order \
ref=$TEST_DIR/$seq-fifo \
ts=B,b \
ts=M,m \
stx_type=char \
stx_mode=0600 \
stx_rdev_major=1 \
stx_rdev_minor=3 \
stx_nlink=1
echo "Test statx on a directory"
mkdir $TEST_DIR/$seq-dir
check_stat $TEST_DIR/$seq-dir \
ts_order \
ref=$TEST_DIR/$seq-null \
ts=B,b \
ts=M,m \
stx_type=dir \
stx_mode=0755 \
stx_rdev_major=0 \
stx_rdev_minor=0
echo "Test statx on a blockdev"
mknod -m 0600 $TEST_DIR/$seq-loopy b 7 123
check_stat $TEST_DIR/$seq-loopy \
ts_order \
ref=$TEST_DIR/$seq-dir \
ts=B,b \
ts=M,m \
stx_type=block \
stx_mode=0600 \
stx_rdev_major=7 \
stx_rdev_minor=123 \
stx_nlink=1
echo "Test statx on a file"
dd if=/dev/zero of=$TEST_DIR/$seq-file bs=1024 count=20
check_stat $TEST_DIR/$seq-file \
ts_order \
ref=$TEST_DIR/$seq-loopy \
ts=B,b \
ts=M,m \
stx_type=file \
stx_size=20480 \
stx_rdev_major=0 \
stx_rdev_minor=0 \
stx_nlink=1
echo "Test statx on a symlink"
ln -s $TEST_DIR/$seq-nowhere $TEST_DIR/$seq-symlink
check_stat $TEST_DIR/$seq-symlink \
ts_order \
ref=$TEST_DIR/$seq-file \
ts=B,b \
ts=M,m \
stx_type=sym \
stx_rdev_major=0 \
stx_rdev_minor=0 \
stx_nlink=1
echo "Test statx on an AF_UNIX socket"
create_af_unix $TEST_DIR/$seq-sock
check_stat $TEST_DIR/$seq-sock \
ts_order \
ref=$TEST_DIR/$seq-symlink \
ts=B,b \
ts=M,m \
stx_type=sock \
stx_rdev_major=0 \
stx_rdev_minor=0 \
stx_nlink=1
#
# Test hard link creation. Make sure that the file's ctime is now same as or
# later than the creation time of the socket, but that the file's creation time
# still lies somewhere between those of the directory and the socket.
#
echo "Test a hard link to a file"
ln $TEST_DIR/$seq-file $TEST_DIR/$seq-link
check_stat $TEST_DIR/$seq-link \
ref=$TEST_DIR/$seq-dir \
ts=B,b \
ref=$TEST_DIR/$seq-sock \
ts=b,B \
ts=B,c \
ts=C,c \
ref=$TEST_DIR/$seq-file \
cmp_ref \
stx_nlink=2
# Done. We leave the success determination to the output comparator.
status=0
exit