mirror of
https://github.com/torvalds/linux.git
synced 2026-04-22 16:53:59 -04:00
Fix eventfs ownership testcase to find mount point if stat -c "%m" failed.
This can happen on the system based on busybox. In this case, this will
try to use the current working directory, which should be a tracefs top
directory (and eventfs is mounted as a part of tracefs.)
If it does not work, the test is skipped as UNRESOLVED because of
the environmental problem.
Fixes: ee9793be08 ("tracing/selftests: Add ownership modification tests for eventfs")
Signed-off-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Acked-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
133 lines
3.2 KiB
Bash
133 lines
3.2 KiB
Bash
#!/bin/sh
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# description: Test file and directory ownership changes for eventfs
|
|
|
|
original_group=`stat -c "%g" .`
|
|
original_owner=`stat -c "%u" .`
|
|
|
|
mount_point=`stat -c '%m' .`
|
|
|
|
# If stat -c '%m' does not work (e.g. busybox) or failed, try to use the
|
|
# current working directory (which should be a tracefs) as the mount point.
|
|
if [ ! -d "$mount_point" ]; then
|
|
if mount | grep -qw $PWD ; then
|
|
mount_point=$PWD
|
|
else
|
|
# If PWD doesn't work, that is an environmental problem.
|
|
exit_unresolved
|
|
fi
|
|
fi
|
|
|
|
mount_options=`mount | grep "$mount_point" | sed -e 's/.*(\(.*\)).*/\1/'`
|
|
|
|
# find another owner and group that is not the original
|
|
other_group=`tac /etc/group | grep -v ":$original_group:" | head -1 | cut -d: -f3`
|
|
other_owner=`tac /etc/passwd | grep -v ":$original_owner:" | head -1 | cut -d: -f3`
|
|
|
|
# Remove any group ownership already
|
|
new_options=`echo "$mount_options" | sed -e "s/gid=[0-9]*/gid=$other_group/"`
|
|
|
|
if [ "$new_options" = "$mount_options" ]; then
|
|
new_options="$mount_options,gid=$other_group"
|
|
mount_options="$mount_options,gid=$original_group"
|
|
fi
|
|
|
|
canary="events/timer events/timer/timer_cancel events/timer/timer_cancel/format"
|
|
|
|
test() {
|
|
file=$1
|
|
test_group=$2
|
|
|
|
owner=`stat -c "%u" $file`
|
|
group=`stat -c "%g" $file`
|
|
|
|
echo "testing $file $owner=$original_owner and $group=$test_group"
|
|
if [ $owner -ne $original_owner ]; then
|
|
exit_fail
|
|
fi
|
|
if [ $group -ne $test_group ]; then
|
|
exit_fail
|
|
fi
|
|
|
|
# Note, the remount does not update ownership so test going to and from owner
|
|
echo "test owner $file to $other_owner"
|
|
chown $other_owner $file
|
|
owner=`stat -c "%u" $file`
|
|
if [ $owner -ne $other_owner ]; then
|
|
exit_fail
|
|
fi
|
|
|
|
chown $original_owner $file
|
|
owner=`stat -c "%u" $file`
|
|
if [ $owner -ne $original_owner ]; then
|
|
exit_fail
|
|
fi
|
|
|
|
}
|
|
|
|
run_tests() {
|
|
for d in "." "events" "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
|
|
test "$d" $other_group
|
|
done
|
|
|
|
chgrp $original_group events
|
|
test "events" $original_group
|
|
for d in "." "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
|
|
test "$d" $other_group
|
|
done
|
|
|
|
chgrp $original_group events/sched
|
|
test "events/sched" $original_group
|
|
for d in "." "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
|
|
test "$d" $other_group
|
|
done
|
|
|
|
chgrp $original_group events/sched/sched_switch
|
|
test "events/sched/sched_switch" $original_group
|
|
for d in "." "events/sched/sched_switch/enable" $canary; do
|
|
test "$d" $other_group
|
|
done
|
|
|
|
chgrp $original_group events/sched/sched_switch/enable
|
|
test "events/sched/sched_switch/enable" $original_group
|
|
for d in "." $canary; do
|
|
test "$d" $other_group
|
|
done
|
|
}
|
|
|
|
# Run the tests twice as leftovers can cause issues
|
|
for loop in 1 2 ; do
|
|
|
|
echo "Running iteration $loop"
|
|
|
|
mount -o remount,"$new_options" .
|
|
|
|
run_tests
|
|
|
|
mount -o remount,"$mount_options" .
|
|
|
|
for d in "." "events" "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable" $canary; do
|
|
test "$d" $original_group
|
|
done
|
|
|
|
# check instances as well
|
|
|
|
chgrp $other_group instances
|
|
|
|
instance="$(mktemp -u test-XXXXXX)"
|
|
|
|
mkdir instances/$instance
|
|
|
|
cd instances/$instance
|
|
|
|
run_tests
|
|
|
|
cd ../..
|
|
|
|
rmdir instances/$instance
|
|
|
|
chgrp $original_group instances
|
|
done
|
|
|
|
exit 0
|