mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
d1ba8b79a6
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>
181 lines
4.4 KiB
Bash
Executable File
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
|