Unverified Commit 1f531e35 authored by Al Viro's avatar Al Viro Committed by Christian Brauner
Browse files

don't bother with path_get()/path_put() in unix_open_file()



Once unix_sock ->path is set, we are guaranteed that its ->path will remain
unchanged (and pinned) until the socket is closed.  OTOH, dentry_open()
does not modify the path passed to it.

IOW, there's no need to copy unix_sk(sk)->path in unix_open_file() - we
can just pass it to dentry_open() and be done with that.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Link: https://lore.kernel.org/20250712054157.GZ1880847@ZenIV


Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@google.com>
Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent a683a5b2
Loading
Loading
Loading
Loading
+4 −12
Original line number Diff line number Diff line
@@ -3201,7 +3201,6 @@ EXPORT_SYMBOL_GPL(unix_outq_len);

static int unix_open_file(struct sock *sk)
{
	struct path path;
	struct file *f;
	int fd;

@@ -3211,27 +3210,20 @@ static int unix_open_file(struct sock *sk)
	if (!smp_load_acquire(&unix_sk(sk)->addr))
		return -ENOENT;

	path = unix_sk(sk)->path;
	if (!path.dentry)
	if (!unix_sk(sk)->path.dentry)
		return -ENOENT;

	path_get(&path);

	fd = get_unused_fd_flags(O_CLOEXEC);
	if (fd < 0)
		goto out;
		return fd;

	f = dentry_open(&path, O_PATH, current_cred());
	f = dentry_open(&unix_sk(sk)->path, O_PATH, current_cred());
	if (IS_ERR(f)) {
		put_unused_fd(fd);
		fd = PTR_ERR(f);
		goto out;
		return PTR_ERR(f);
	}

	fd_install(fd, f);
out:
	path_put(&path);

	return fd;
}