1#!/bin/sh 2# SPDX-License-Identifier: GPL-2.0 3# description: Test tracefs GID mount option 4# requires: "[gid=<gid>]":README 5 6fail() { 7 local msg="$1" 8 9 echo "FAILED: $msg" 10 exit_fail 11} 12 13find_alternate_gid() { 14 local original_gid="$1" 15 tac /etc/group | grep -v ":$original_gid:" | head -1 | cut -d: -f3 16} 17 18mount_tracefs_with_options() { 19 local mount_point="$1" 20 local options="$2" 21 22 mount -t tracefs -o "$options" nodev "$mount_point" 23 24 setup 25} 26 27unmount_tracefs() { 28 local mount_point="$1" 29 30 # Need to make sure the mount isn't busy so that we can umount it 31 (cd $mount_point; finish_ftrace;) 32 33 cleanup 34} 35 36create_instance() { 37 local mount_point="$1" 38 local instance="$mount_point/instances/$(mktemp -u test-XXXXXX)" 39 40 mkdir "$instance" 41 echo "$instance" 42} 43 44remove_instance() { 45 local instance="$1" 46 47 rmdir "$instance" 48} 49 50check_gid() { 51 local mount_point="$1" 52 local expected_gid="$2" 53 54 echo "Checking permission group ..." 55 56 cd "$mount_point" 57 58 for file in "." "events" "events/sched" "events/sched/sched_switch" "events/sched/sched_switch/enable"; do 59 local gid=`stat -c "%g" $file` 60 if [ "$gid" -ne "$expected_gid" ]; then 61 cd - # Return to the previous working directory (tracefs root) 62 fail "$(realpath $file): Expected group $expected_gid; Got group $gid" 63 fi 64 done 65 66 cd - # Return to the previous working directory (tracefs root) 67} 68 69test_gid_mount_option() { 70 local mount_point=$(get_mount_point) 71 local mount_options=$(get_mnt_options "$mount_point") 72 local original_group=$(stat -c "%g" .) 73 local other_group=$(find_alternate_gid "$original_group") 74 75 # Set up mount options with new GID for testing 76 local new_options=`echo "$mount_options" | sed -e "s/gid=[0-9]*/gid=$other_group/"` 77 if [ "$new_options" = "$mount_options" ]; then 78 new_options="$mount_options,gid=$other_group" 79 mount_options="$mount_options,gid=$original_group" 80 fi 81 82 # Unmount existing tracefs instance and mount with new GID 83 unmount_tracefs "$mount_point" 84 mount_tracefs_with_options "$mount_point" "$new_options" 85 86 check_gid "$mount_point" "$other_group" 87 88 # Check that files created after the mount inherit the GID 89 local instance=$(create_instance "$mount_point") 90 check_gid "$instance" "$other_group" 91 remove_instance "$instance" 92 93 # Unmount and remount with the original GID 94 unmount_tracefs "$mount_point" 95 mount_tracefs_with_options "$mount_point" "$mount_options" 96 check_gid "$mount_point" "$original_group" 97} 98 99test_gid_mount_option 100 101exit 0 102