Re: [PATCH] fs/proc/task_mmu: return -ENOTTY for unknown pagemap ioctls
From: Andrew Morton
Date: Fri Oct 23 2026 - 14:24:38 EST
On Fri, 23 Oct 2026 14:13:00 -0400 Hengyu Liang <hengyul@xxxxxxxxxx> wrote:
> Commit 52526ca7fdb9 ("fs/proc/task_mmu: implement IOCTL to get and
> optionally clear info about PTEs") made do_pagemap_cmd() the ioctl
> handler of /proc/<pid>/pagemap.
>
> However, do_pagemap_cmd() returns -EINVAL for every command other than
> PAGEMAP_SCAN. Before that commit, pagemap had no ioctl handler, and
> the VFS returned -ENOTTY for these commands. As of now, they fail with
> EINVAL, so tcgetattr() and isatty() on pagemap report EINVAL instead
> of ENOTTY.
>
> The issue can be reproduced with a simple C program:
>
> #include <fcntl.h>
> #include <stdio.h>
> #include <termios.h>
>
> int main(void)
> {
> struct termios t;
> int fd = open("/proc/self/pagemap", O_RDONLY);
>
> if (tcgetattr(fd, &t) < 0)
> perror("tcgetattr");
> return 0;
> }
>
> Before that commit, the result is:
>
> tcgetattr: Inappropriate ioctl for device
>
> After that commit, the result is:
>
> tcgetattr: Invalid argument
>
> This patch will return -ENOIOCTLCMD for unknown commands, as
> procfs_procmap_ioctl() in the same file does, so that the VFS turns it
> into -ENOTTY.
OK, thanks, annoying.
> Fixes: 52526ca7fdb9 ("fs/proc/task_mmu: implement IOCTL to get and optionally clear info about PTEs")
Three years ago. So if anyone had to update their userspace code
because we altered this, they will now need to unupdate it. It's hard
to believe that this will cause significant harm - perhaps there are
correctness test suites which will be surprised (again).
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Hengyu Liang <hengyul@xxxxxxxxxx>
> ---
> Unknown commands should fail with ENOTTY: Documentation/driver-api/
> ioctl.rst says so and calls -EINVAL wrong, and POSIX requires
> tcgetattr() to fail with ENOTTY on a file that is not a terminal.
>
> I found no user space that relies on EINVAL here: Wine and the mm and
> kvm selftests only use PAGEMAP_SCAN on pagemap, whose results do not
> change, and CRIU and LTP only read the file.
Good info, thanks.