| From ba6cc29351b1fa0cb9adce91b88b9f3c3cbe9c46 Mon Sep 17 00:00:00 2001 |
| From: Charalampos Mitrodimas <charmitro@posteo.net> |
| Date: Sat, 16 Aug 2025 14:14:37 +0000 |
| Subject: debugfs: fix mount options not being applied |
| |
| From: Charalampos Mitrodimas <charmitro@posteo.net> |
| |
| commit ba6cc29351b1fa0cb9adce91b88b9f3c3cbe9c46 upstream. |
| |
| Mount options (uid, gid, mode) are silently ignored when debugfs is |
| mounted. This is a regression introduced during the conversion to the |
| new mount API. |
| |
| When the mount API conversion was done, the parsed options were never |
| applied to the superblock when it was reused. As a result, the mount |
| options were ignored when debugfs was mounted. |
| |
| Fix this by following the same pattern as the tracefs fix in commit |
| e4d32142d1de ("tracing: Fix tracefs mount options"). Call |
| debugfs_reconfigure() in debugfs_get_tree() to apply the mount options |
| to the superblock after it has been created or reused. |
| |
| As an example, with the bug the "mode" mount option is ignored: |
| |
| $ mount -o mode=0666 -t debugfs debugfs /tmp/debugfs_test |
| $ mount | grep debugfs_test |
| debugfs on /tmp/debugfs_test type debugfs (rw,relatime) |
| $ ls -ld /tmp/debugfs_test |
| drwx------ 25 root root 0 Aug 4 14:16 /tmp/debugfs_test |
| |
| With the fix applied, it works as expected: |
| |
| $ mount -o mode=0666 -t debugfs debugfs /tmp/debugfs_test |
| $ mount | grep debugfs_test |
| debugfs on /tmp/debugfs_test type debugfs (rw,relatime,mode=666) |
| $ ls -ld /tmp/debugfs_test |
| drw-rw-rw- 37 root root 0 Aug 2 17:28 /tmp/debugfs_test |
| |
| Fixes: a20971c18752 ("vfs: Convert debugfs to use the new mount API") |
| Closes: https://bugzilla.kernel.org/show_bug.cgi?id=220406 |
| Cc: stable <stable@kernel.org> |
| Reviewed-by: Eric Sandeen <sandeen@redhat.com> |
| Signed-off-by: Charalampos Mitrodimas <charmitro@posteo.net> |
| Link: https://lore.kernel.org/r/20250816-debugfs-mount-opts-v3-1-d271dad57b5b@posteo.net |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/debugfs/inode.c | 11 ++++++++++- |
| 1 file changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/fs/debugfs/inode.c |
| +++ b/fs/debugfs/inode.c |
| @@ -183,6 +183,9 @@ static int debugfs_reconfigure(struct fs |
| struct debugfs_fs_info *sb_opts = sb->s_fs_info; |
| struct debugfs_fs_info *new_opts = fc->s_fs_info; |
| |
| + if (!new_opts) |
| + return 0; |
| + |
| sync_filesystem(sb); |
| |
| /* structure copy of new mount options to sb */ |
| @@ -269,10 +272,16 @@ static int debugfs_fill_super(struct sup |
| |
| static int debugfs_get_tree(struct fs_context *fc) |
| { |
| + int err; |
| + |
| if (!(debugfs_allow & DEBUGFS_ALLOW_API)) |
| return -EPERM; |
| |
| - return get_tree_single(fc, debugfs_fill_super); |
| + err = get_tree_single(fc, debugfs_fill_super); |
| + if (err) |
| + return err; |
| + |
| + return debugfs_reconfigure(fc); |
| } |
| |
| static void debugfs_free_fc(struct fs_context *fc) |