102 lines
2.4 KiB
Plaintext
102 lines
2.4 KiB
Plaintext
|
#!/bin/sh
|
||
|
# SPDX-License-Identifier: GPL-2.0
|
||
|
# description: Test tracefs GID mount option
|
||
|
# requires: "[gid=<gid>]":README
|
||
|
|
||
|
fail() {
|
||
|
local msg="$1"
|
||
|
|
||
|
echo "FAILED: $msg"
|
||
|
exit_fail
|
||
|
}
|
||
|
|
||
|
find_alternate_gid() {
|
||
|
local original_gid="$1"
|
||
|
tac /etc/group | grep -v ":$original_gid:" | head -1 | cut -d: -f3
|
||
|
}
|
||
|
|
||
|
mount_tracefs_with_options() {
|
||
|
local mount_point="$1"
|
||
|
local options="$2"
|
||
|
|
||
|
mount -t tracefs -o "$options" nodev "$mount_point"
|
||
|
|
||
|
setup
|
||
|
}
|
||
|
|
||
|
unmount_tracefs() {
|
||
|
local mount_point="$1"
|
||
|
|
||
|
# Need to make sure the mount isn't busy so that we can umount it
|
||
|
(cd $mount_point; finish_ftrace;)
|
||
|
|
||
|
cleanup
|
||
|
}
|
||
|
|
||
|
create_instance() {
|
||
|
local mount_point="$1"
|
||
|
local instance="$mount_point/instances/$(mktemp -u test-XXXXXX)"
|
||
|
|
||
|
mkdir "$instance"
|
||
|
echo "$instance"
|
||
|
}
|
||
|
|
||
|
remove_instance() {
|
||
|
local instance="$1"
|
||
|
|
||
|
rmdir "$instance"
|
||
|
}
|
||
|
|
||
|
check_gid() {
|
||
|
local mount_point="$1"
|
||
|
local expected_gid="$2"
|
||
|
|
||
|
echo "Checking permission group ..."
|
||
|
|
||
|
cd "$mount_point"
|
||
|
|
||
|
for file in "." "events" "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable"; do
|
||
|
local gid=`stat -c "%g" $file`
|
||
|
if [ "$gid" -ne "$expected_gid" ]; then
|
||
|
cd - # Return to the previous working directory (tracefs root)
|
||
|
fail "$(realpath $file): Expected group $expected_gid; Got group $gid"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
cd - # Return to the previous working directory (tracefs root)
|
||
|
}
|
||
|
|
||
|
test_gid_mount_option() {
|
||
|
local mount_point=$(get_mount_point)
|
||
|
local mount_options=$(get_mnt_options "$mount_point")
|
||
|
local original_group=$(stat -c "%g" .)
|
||
|
local other_group=$(find_alternate_gid "$original_group")
|
||
|
|
||
|
# Set up mount options with new GID for testing
|
||
|
local 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
|
||
|
|
||
|
# Unmount existing tracefs instance and mount with new GID
|
||
|
unmount_tracefs "$mount_point"
|
||
|
mount_tracefs_with_options "$mount_point" "$new_options"
|
||
|
|
||
|
check_gid "$mount_point" "$other_group"
|
||
|
|
||
|
# Check that files created after the mount inherit the GID
|
||
|
local instance=$(create_instance "$mount_point")
|
||
|
check_gid "$instance" "$other_group"
|
||
|
remove_instance "$instance"
|
||
|
|
||
|
# Unmount and remount with the original GID
|
||
|
unmount_tracefs "$mount_point"
|
||
|
mount_tracefs_with_options "$mount_point" "$mount_options"
|
||
|
check_gid "$mount_point" "$original_group"
|
||
|
}
|
||
|
|
||
|
test_gid_mount_option
|
||
|
|
||
|
exit 0
|