From: Andrey Albershteyn Date: Fri, 3 Oct 2025 09:32:45 +0000 (+0200) Subject: generic: introduce test to test file_getattr/file_setattr syscalls X-Git-Tag: v2025.10.05~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4eb40174d77c1bfbbaaeeda68bab9ccd51516842;p=xfstests-dev.git generic: introduce test to test file_getattr/file_setattr syscalls Add a test to test basic functionality of file_getattr() and file_setattr() syscalls. Most of the work is done in file_attr utility. Signed-off-by: Andrey Albershteyn Reviewed-by: Darrick J. Wong Signed-off-by: Zorro Lang --- diff --git a/common/filter b/common/filter index bbe13f4c..b330b278 100644 --- a/common/filter +++ b/common/filter @@ -683,5 +683,20 @@ _filter_sysfs_error() sed 's/.*: \(.*\)$/\1/' } +# Filter file attributes (aka lsattr/chattr) +# To filter X: +# ... | _filter_file_attributes X +# Or to filter all except X +# ... | _filter_file_attributes ~X +_filter_file_attributes() +{ + if [[ $1 == ~* ]]; then + regex=$(echo "[aAcCdDeEFijmNPsStTuxVX]" | tr -d "$1") + else + regex="$1" + fi + awk "{ printf \"%s \", gensub(\"$regex\", \"-\", \"g\", \$1) } {print \$2}" +} + # make sure this script returns success /bin/true diff --git a/tests/generic/772 b/tests/generic/772 new file mode 100755 index 00000000..cc1a1bb5 --- /dev/null +++ b/tests/generic/772 @@ -0,0 +1,109 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2025 Red Hat Inc. All Rights Reserved. +# +# FS QA Test No. 772 +# +# Test file_getattr/file_setattr syscalls +# +. ./common/preamble +_begin_fstest auto + +. ./common/filter + +# Modify as appropriate. +_require_scratch +_require_test_program "af_unix" +_require_test_program "file_attr" +_require_symlinks +_require_mknod + +_scratch_mkfs >>$seqres.full 2>&1 +_scratch_mount + +file_attr () { + $here/src/file_attr $* +} + +create_af_unix () { + $here/src/af_unix $* || echo af_unix failed +} + +projectdir=$SCRATCH_MNT/prj + +# Create normal files and special files +mkdir $projectdir +mkfifo $projectdir/fifo +mknod $projectdir/chardev c 1 1 +mknod $projectdir/blockdev b 1 1 +create_af_unix $projectdir/socket +touch $projectdir/foo +ln -s $projectdir/foo $projectdir/symlink +touch $projectdir/bar +ln -s $projectdir/bar $projectdir/broken-symlink +rm -f $projectdir/bar + +echo "Error codes" +# wrong AT_ flags +file_attr --get --invalid-at $projectdir ./foo +file_attr --set --invalid-at $projectdir ./foo +# wrong fsxattr size (too big, too small) +file_attr --get --too-big-arg $projectdir ./foo +file_attr --get --too-small-arg $projectdir ./foo +file_attr --set --too-big-arg $projectdir ./foo +file_attr --set --too-small-arg $projectdir ./foo +# out of fsx_xflags mask +file_attr --set --new-fsx-flag $projectdir ./foo + +echo "Initial attributes state" +file_attr --get $projectdir | _filter_scratch | _filter_file_attributes ~d +file_attr --get $projectdir ./fifo | _filter_file_attributes ~d +file_attr --get $projectdir ./chardev | _filter_file_attributes ~d +file_attr --get $projectdir ./blockdev | _filter_file_attributes ~d +file_attr --get $projectdir ./socket | _filter_file_attributes ~d +file_attr --get $projectdir ./foo | _filter_file_attributes ~d +file_attr --get $projectdir ./symlink | _filter_file_attributes ~d + +echo "Set FS_XFLAG_NODUMP (d)" +file_attr --set --set-nodump $projectdir +file_attr --set --set-nodump $projectdir ./fifo +file_attr --set --set-nodump $projectdir ./chardev +file_attr --set --set-nodump $projectdir ./blockdev +file_attr --set --set-nodump $projectdir ./socket +file_attr --set --set-nodump $projectdir ./foo +file_attr --set --set-nodump $projectdir ./symlink + +echo "Read attributes" +file_attr --get $projectdir | _filter_scratch | _filter_file_attributes ~d +file_attr --get $projectdir ./fifo | _filter_file_attributes ~d +file_attr --get $projectdir ./chardev | _filter_file_attributes ~d +file_attr --get $projectdir ./blockdev | _filter_file_attributes ~d +file_attr --get $projectdir ./socket | _filter_file_attributes ~d +file_attr --get $projectdir ./foo | _filter_file_attributes ~d +file_attr --get $projectdir ./symlink | _filter_file_attributes ~d + +echo "Set attribute on broken link with AT_SYMLINK_NOFOLLOW" +file_attr --set --set-nodump $projectdir ./broken-symlink +file_attr --get $projectdir ./broken-symlink + +file_attr --set --no-follow --set-nodump $projectdir ./broken-symlink +file_attr --get --no-follow $projectdir ./broken-symlink | _filter_file_attributes ~d + +cd $SCRATCH_MNT +touch ./foo2 +echo "Initial state of foo2" +file_attr --get --at-cwd ./foo2 | _filter_file_attributes ~d +echo "Set attribute relative to AT_FDCWD" +file_attr --set --at-cwd --set-nodump ./foo2 +file_attr --get --at-cwd ./foo2 | _filter_file_attributes ~d + +echo "Set attribute on AT_FDCWD" +mkdir ./bar +file_attr --get --at-cwd ./bar | _filter_file_attributes ~d +cd ./bar +file_attr --set --at-cwd --set-nodump "" +file_attr --get --at-cwd . | _filter_file_attributes ~d + +# success, all done +status=0 +exit diff --git a/tests/generic/772.out b/tests/generic/772.out new file mode 100644 index 00000000..f7c23d94 --- /dev/null +++ b/tests/generic/772.out @@ -0,0 +1,37 @@ +QA output created by 772 +Error codes +Can not get fsxattr on ./foo: Invalid argument +Can not get fsxattr on ./foo: Invalid argument +Can not get fsxattr on ./foo: Argument list too long +Can not get fsxattr on ./foo: Invalid argument +Can not get fsxattr on ./foo: Argument list too long +Can not get fsxattr on ./foo: Invalid argument +Can not set fsxattr on ./foo: Invalid argument +Initial attributes state +----------------- SCRATCH_MNT/prj +----------------- ./fifo +----------------- ./chardev +----------------- ./blockdev +----------------- ./socket +----------------- ./foo +----------------- ./symlink +Set FS_XFLAG_NODUMP (d) +Read attributes +------d---------- SCRATCH_MNT/prj +------d---------- ./fifo +------d---------- ./chardev +------d---------- ./blockdev +------d---------- ./socket +------d---------- ./foo +------d---------- ./symlink +Set attribute on broken link with AT_SYMLINK_NOFOLLOW +Can not get fsxattr on ./broken-symlink: No such file or directory +Can not get fsxattr on ./broken-symlink: No such file or directory +------d---------- ./broken-symlink +Initial state of foo2 +----------------- ./foo2 +Set attribute relative to AT_FDCWD +------d---------- ./foo2 +Set attribute on AT_FDCWD +----------------- ./bar +------d---------- .