xref: /linux/tools/testing/selftests/ftrace/test.d/00basic/mount_options.tc (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
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