| #!/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 | |
| } | |
| remount_tracefs_with_options() { | |
| local mount_point="$1" | |
| local options="$2" | |
| mount -t tracefs -o "remount,$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_system;) | |
| 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" | |
| remount_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" | |
| remount_tracefs_with_options "$mount_point" "$mount_options" | |
| check_gid "$mount_point" "$original_group" | |
| } | |
| test_gid_mount_option | |
| exit 0 |