#!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: Test tracefs GID mount option # requires: "[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