| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- #!/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_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"
- 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
|