Unverified Commit 39f6e758 authored by Christian Brauner's avatar Christian Brauner
Browse files

userfaultfd: convert new_userfaultfd() to FD_PREPARE()

parent 14010faa
Loading
Loading
Loading
Loading
+10 −20
Original line number Diff line number Diff line
@@ -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)