]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
userfaultfd: convert new_userfaultfd() to FD_PREPARE()
authorChristian Brauner <brauner@kernel.org>
Sun, 23 Nov 2025 16:33:34 +0000 (17:33 +0100)
committerChristian Brauner <brauner@kernel.org>
Fri, 28 Nov 2025 11:42:33 +0000 (12:42 +0100)
Link: https://patch.msgid.link/20251123-work-fd-prepare-v4-16-b6efa1706cfd@kernel.org
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/userfaultfd.c

index 54c6cc7fe9c629f51d2f0da90e46404eda3d1138..e6e74b384087dfa92acbc4981a405514e2a824af 100644 (file)
@@ -2111,9 +2111,7 @@ static void init_once_userfaultfd_ctx(void *mem)
 
 static int new_userfaultfd(int flags)
 {
-       struct userfaultfd_ctx *ctx;
-       struct file *file;
-       int fd;
+       struct userfaultfd_ctx *ctx __free(kfree) = NULL;
 
        VM_WARN_ON_ONCE(!current->mm);
 
@@ -2135,26 +2133,18 @@ static int new_userfaultfd(int flags)
        atomic_set(&ctx->mmap_changing, 0);
        ctx->mm = current->mm;
 
-       fd = get_unused_fd_flags(flags & UFFD_SHARED_FCNTL_FLAGS);
-       if (fd < 0)
-               goto err_out;
+       FD_PREPARE(fdf, flags & UFFD_SHARED_FCNTL_FLAGS,
+                  anon_inode_create_getfile("[userfaultfd]", &userfaultfd_fops, ctx,
+                                            O_RDONLY | (flags & UFFD_SHARED_FCNTL_FLAGS),
+                                            NULL));
+       if (fdf.err)
+               return fdf.err;
 
-       /* Create a new inode so that the LSM can block the creation.  */
-       file = anon_inode_create_getfile("[userfaultfd]", &userfaultfd_fops, ctx,
-                       O_RDONLY | (flags & UFFD_SHARED_FCNTL_FLAGS), NULL);
-       if (IS_ERR(file)) {
-               put_unused_fd(fd);
-               fd = PTR_ERR(file);
-               goto err_out;
-       }
        /* prevent the mm struct to be freed */
        mmgrab(ctx->mm);
-       file->f_mode |= FMODE_NOWAIT;
-       fd_install(fd, file);
-       return fd;
-err_out:
-       kmem_cache_free(userfaultfd_ctx_cachep, ctx);
-       return fd;
+       fd_prepare_file(fdf)->f_mode |= FMODE_NOWAIT;
+       retain_and_null_ptr(ctx);
+       return fd_publish(fdf);
 }
 
 static inline bool userfaultfd_syscall_allowed(int flags)