[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20250712063901.3761823-1-kuniyu@google.com>
Date: Sat, 12 Jul 2025 06:38:33 +0000
From: Kuniyuki Iwashima <kuniyu@...gle.com>
To: viro@...iv.linux.org.uk
Cc: linux-fsdevel@...r.kernel.org, netdev@...r.kernel.org, kuniyu@...gle.com
Subject: Re: [PATCH][RFC] don't bother with path_get()/path_put() in unix_open_file()
From: Al Viro <viro@...iv.linux.org.uk>
Date: Sat, 12 Jul 2025 06:41:57 +0100
> 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: Al Viro <viro@...iv.linux.org.uk>
Sounds good. I confirmed vfs_open() copies the passed const path ptr.
Reviewed-by: Kuniyuki Iwashima <kuniyu@...gle.com>
> diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
> index 52b155123985..019ba2609b66 100644
> --- a/net/unix/af_unix.c
> +++ b/net/unix/af_unix.c
> @@ -3191,7 +3191,6 @@ EXPORT_SYMBOL_GPL(unix_outq_len);
>
> static int unix_open_file(struct sock *sk)
> {
> - struct path path;
> struct file *f;
> int fd;
>
> @@ -3201,27 +3200,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;
> }
Powered by blists - more mailing lists