From nobody Sun Nov 24 06:34:12 2024 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 00A601F9ABB for ; Wed, 6 Nov 2024 17:22:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730913768; cv=none; b=f8pS5F+JtYaAS46xKvv7cjQpZ4pvFTTR5Tkbvsv1AYSOX3lHM/3ypn+WgOAlFqFBBQTm7muZxAIXBiXDQVmnyWtxGLwEI1cU4AlgIIFZsUhBX9pTSNSW/1fzkmbuDAYXn8W2LHZKDFRi7U0+YG4tsm9eImcHrOqg+8rOzBUMO7Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1730913768; c=relaxed/simple; bh=BnnbcK7EvbaUNMV7DgM4BVKqLy+ZRqGziQZoMChzrZQ=; h=Date:From:To:Cc:Subject:Message-ID:MIME-Version:Content-Type; b=DZQB6M0XQN9V6ZSHhwtAzGC0Iuu4TapwY9BVuUd8MBtT7lidMCUhyNp6stYKgPpAaurFGmVGtEoInRINDMGuDYiM5Vr4xeHL1WpSgXOat0hNMPvZOPiFAZAai+0ZzuFadlh/nes3+/MmTQY0HL5Os1vQcLPc99LwpZQIhc4OSIU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id E3F26C4CEC6; Wed, 6 Nov 2024 17:22:46 +0000 (UTC) Date: Wed, 6 Nov 2024 12:22:50 -0500 From: Steven Rostedt To: Linus Torvalds Cc: LKML , Masami Hiramatsu , Mathieu Desnoyers , Kalesh Singh Subject: [GIT PULL] tracefs: Fix regression of setting group permissions at boot Message-ID: <20241106122250.2667681b@gandalf.local.home> X-Mailer: Claws Mail 3.20.0git84 (GTK+ 2.24.33; x86_64-pc-linux-gnu) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Kalesh Singh Linus, Fix tracefs mount options: The commit 78ff64081949 ("vfs: Convert tracefs to use the new mount API") broke the gid setting when set by fstab or other mount utility. It is ignored when it is set. Fix the code so that it recognizes the option again and will honor the settings on mount at boot up. Update the internal documentation and create a selftest to make sure it doesn't break again in the future. Please pull the latest tracefs-v6.12-rc6 tree, which can be found at: git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace.git tracefs-v6.12-rc6 Tag SHA1: ba611308a30ae768483f77653d25ac6c98c618a7 Head SHA1: 8b55572e51805184353ee7d587c720a51818fb82 Kalesh Singh (3): tracing: Fix tracefs mount options tracing: Document tracefs gid mount option tracing/selftests: Add tracefs mount options test ---- fs/tracefs/inode.c | 12 ++- kernel/trace/trace.c | 4 + .../ftrace/test.d/00basic/mount_options.tc | 101 +++++++++++++++++= ++++ .../ftrace/test.d/00basic/test_ownership.tc | 16 +--- tools/testing/selftests/ftrace/test.d/functions | 25 +++++ 5 files changed, 142 insertions(+), 16 deletions(-) create mode 100644 tools/testing/selftests/ftrace/test.d/00basic/mount_opt= ions.tc --------------------------- diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c index 1748dff58c3b..cfc614c638da 100644 --- a/fs/tracefs/inode.c +++ b/fs/tracefs/inode.c @@ -392,6 +392,9 @@ static int tracefs_reconfigure(struct fs_context *fc) struct tracefs_fs_info *sb_opts =3D sb->s_fs_info; struct tracefs_fs_info *new_opts =3D fc->s_fs_info; =20 + if (!new_opts) + return 0; + sync_filesystem(sb); /* structure copy of new mount options to sb */ *sb_opts =3D *new_opts; @@ -478,14 +481,17 @@ static int tracefs_fill_super(struct super_block *sb,= struct fs_context *fc) sb->s_op =3D &tracefs_super_operations; sb->s_d_op =3D &tracefs_dentry_operations; =20 - tracefs_apply_options(sb, false); - return 0; } =20 static int tracefs_get_tree(struct fs_context *fc) { - return get_tree_single(fc, tracefs_fill_super); + int err =3D get_tree_single(fc, tracefs_fill_super); + + if (err) + return err; + + return tracefs_reconfigure(fc); } =20 static void tracefs_free_fc(struct fs_context *fc) diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index a8f52b6527ca..2b64b3ec67d9 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5501,6 +5501,10 @@ static const struct file_operations tracing_iter_fop= s =3D { =20 static const char readme_msg[] =3D "tracing mini-HOWTO:\n\n" + "By default tracefs removes all OTH file permission bits.\n" + "When mounting tracefs an optional group id can be specified\n" + "which adds the group to every directory and file in tracefs:\n\n" + "\t e.g. mount -t tracefs [-o [gid=3D]] nodev /sys/kernel/tracing\n\= n" "# echo 0 > tracing_on : quick way to disable tracing\n" "# echo 1 > tracing_on : quick way to re-enable tracing\n\n" " Important files:\n" diff --git a/tools/testing/selftests/ftrace/test.d/00basic/mount_options.tc= b/tools/testing/selftests/ftrace/test.d/00basic/mount_options.tc new file mode 100644 index 000000000000..35e8d47d6072 --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/00basic/mount_options.tc @@ -0,0 +1,101 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# description: Test tracefs GID mount option +# requires: "[gid=3D]":README + +fail() { + local msg=3D"$1" + + echo "FAILED: $msg" + exit_fail +} + +find_alternate_gid() { + local original_gid=3D"$1" + tac /etc/group | grep -v ":$original_gid:" | head -1 | cut -d: -f3 +} + +mount_tracefs_with_options() { + local mount_point=3D"$1" + local options=3D"$2" + + mount -t tracefs -o "$options" nodev "$mount_point" + + setup +} + +unmount_tracefs() { + local mount_point=3D"$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=3D"$1" + local instance=3D"$mount_point/instances/$(mktemp -u test-XXXXXX)" + + mkdir "$instance" + echo "$instance" +} + +remove_instance() { + local instance=3D"$1" + + rmdir "$instance" +} + +check_gid() { + local mount_point=3D"$1" + local expected_gid=3D"$2" + + echo "Checking permission group ..." + + cd "$mount_point" + + for file in "." "events" "events/sched" "events/sched/sched_switch" "even= ts/sched/sched_switch/enable"; do + local gid=3D`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=3D$(get_mount_point) + local mount_options=3D$(get_mnt_options "$mount_point") + local original_group=3D$(stat -c "%g" .) + local other_group=3D$(find_alternate_gid "$original_group") + + # Set up mount options with new GID for testing + local new_options=3D`echo "$mount_options" | sed -e "s/gid=3D[0-9]*/gid= =3D$other_group/"` + if [ "$new_options" =3D "$mount_options" ]; then + new_options=3D"$mount_options,gid=3D$other_group" + mount_options=3D"$mount_options,gid=3D$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=3D$(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 diff --git a/tools/testing/selftests/ftrace/test.d/00basic/test_ownership.t= c b/tools/testing/selftests/ftrace/test.d/00basic/test_ownership.tc index 094419e190c2..e71cc3ad0bdf 100644 --- a/tools/testing/selftests/ftrace/test.d/00basic/test_ownership.tc +++ b/tools/testing/selftests/ftrace/test.d/00basic/test_ownership.tc @@ -1,24 +1,14 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: Test file and directory ownership changes for eventfs +# requires: "[gid=3D]":README =20 original_group=3D`stat -c "%g" .` original_owner=3D`stat -c "%u" .` =20 -mount_point=3D`stat -c '%m' .` +local mount_point=3D$(get_mount_point) =20 -# If stat -c '%m' does not work (e.g. busybox) or failed, try to use the -# current working directory (which should be a tracefs) as the mount point. -if [ ! -d "$mount_point" ]; then - if mount | grep -qw $PWD ; then - mount_point=3D$PWD - else - # If PWD doesn't work, that is an environmental problem. - exit_unresolved - fi -fi - -mount_options=3D`mount | grep "$mount_point" | sed -e 's/.*(\(.*\)).*/\1/'` +mount_options=3D$(get_mnt_options "$mount_point") =20 # find another owner and group that is not the original other_group=3D`tac /etc/group | grep -v ":$original_group:" | head -1 | cu= t -d: -f3` diff --git a/tools/testing/selftests/ftrace/test.d/functions b/tools/testin= g/selftests/ftrace/test.d/functions index 779f3e62ec90..84d6a9c7ad67 100644 --- a/tools/testing/selftests/ftrace/test.d/functions +++ b/tools/testing/selftests/ftrace/test.d/functions @@ -193,3 +193,28 @@ ftrace_errlog_check() { # err-prefix command-with-erro= r-pos-by-^ command-file # " Command: " and "^\n" =3D> 13 test $(expr 13 + $pos) -eq $N } + +# Helper to get the tracefs mount point +get_mount_point() { + local mount_point=3D`stat -c '%m' .` + + # If stat -c '%m' does not work (e.g. busybox) or failed, try to use the + # current working directory (which should be a tracefs) as the mount poin= t. + if [ ! -d "$mount_point" ]; then + if mount | grep -qw "$PWD"; then + mount_point=3D$PWD + else + # If PWD doesn't work, that is an environmental problem. + exit_unresolved + fi + fi + echo "$mount_point" +} + +# Helper function to retrieve mount options for a given mount point +get_mnt_options() { + local mnt_point=3D"$1" + local opts=3D$(mount | grep -m1 "$mnt_point" | sed -e 's/.*(\(.*\)).*/\1/= ') + + echo "$opts" +} \ No newline at end of file