| #!/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 |