[Devel] [PATCH RHEL10 COMMIT] ms/anon_inode: rework assertions

Konstantin Khorenko khorenko at virtuozzo.com
Fri Jul 31 12:35:14 MSK 2026


The commit is pushed to "branch-rh10-6.12.0-211.39.1.16.x.vz10-ovz" and will appear at git at bitbucket.org:openvz/vzkernel.git
after rh10-6.12.0-211.39.1.16.1.vz10
------>
commit 683ad75e57be013f77d85ebfea53b80d010afacb
Author: Christian Brauner <brauner at kernel.org>
Date:   Mon Jul 27 14:22:48 2026 +0200

    ms/anon_inode: rework assertions
    
    Making anonymous inodes regular files comes with a lot of risk and
    regression potential as evidenced by a recent hickup in io_uring. We're
    better of continuing to not have them be regular files. Since we have
    S_ANON_INODE we can port all of our assertions easily.
    
    Link: https://lore.kernel.org/20250702-work-fixes-v1-1-ff76ea589e33@kernel.org
    Fixes: cfd86ef7e8e7 ("anon_inode: use a proper mode internally")
    Acked-by: Jens Axboe <axboe at kernel.dk>
    Cc: stable at kernel.org
    Reported-by: Jens Axboe <axboe at kernel.dk>
    Signed-off-by: Christian Brauner <brauner at kernel.org>
    
    (cherry picked from commit 1e7ab6f67824343ee3e96f100f0937c393749a8a)
    
    This fixes CRIU dump of processes that use AIO, since CRIU does not
    expect S_IFREG on AIO inodes.
    
    vz10 backport notes:
     - drop debug with missing VFS_WARN_ON_ONCE/VFS_BUG_ON_INODE
     - add fput(file) on the introduced error paths in do_open_execat()
    
    Feature: ve: CRIU support
    https://virtuozzo.atlassian.net/browse/VSTOR-139264
    Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
    Reviewed-by: Vasileios Almpanis <vasileios.almpanis at virtuozzo.com>
    Reviewed-by: Vladimir Riabchun <vladimir.riabchun at virtuozzo.com>
---
 fs/exec.c  | 8 ++++++--
 fs/libfs.c | 8 +++-----
 2 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/fs/exec.c b/fs/exec.c
index dd5de1a4a9d6a..e861a54b491f8 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -921,13 +921,17 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags)
 	if (IS_ERR(file))
 		return file;
 
+	if (path_noexec(&file->f_path)) {
+		fput(file);
+		return ERR_PTR(-EACCES);
+	}
+
 	/*
 	 * In the past the regular type check was here. It moved to may_open() in
 	 * 633fb6ac3980 ("exec: move S_ISREG() check earlier"). Since then it is
 	 * an invariant that all non-regular files error out before we get here.
 	 */
-	if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode)) ||
-	    path_noexec(&file->f_path)) {
+	if (WARN_ON_ONCE(!S_ISREG(file_inode(file)->i_mode))) {
 		fput(file);
 		return ERR_PTR(-EACCES);
 	}
diff --git a/fs/libfs.c b/fs/libfs.c
index c4a305967619f..af191a388303c 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -1652,12 +1652,10 @@ struct inode *alloc_anon_inode(struct super_block *s)
 	 */
 	inode->i_state = I_DIRTY;
 	/*
-	 * Historically anonymous inodes didn't have a type at all and
-	 * userspace has come to rely on this. Internally they're just
-	 * regular files but S_IFREG is masked off when reporting
-	 * information to userspace.
+	 * Historically anonymous inodes don't have a type at all and
+	 * userspace has come to rely on this.
 	 */
-	inode->i_mode = S_IFREG | S_IRUSR | S_IWUSR;
+	inode->i_mode = S_IRUSR | S_IWUSR;
 	inode->i_uid = current_fsuid();
 	inode->i_gid = current_fsgid();
 	inode->i_flags |= S_PRIVATE | S_ANON_INODE;


More information about the Devel mailing list