Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
Re: Take solock_shared() in soo_stat()
To:
Vitaliy Makkoveev <mvs@openbsd.org>
Cc:
tech@openbsd.org
Date:
Wed, 10 Apr 2024 19:41:29 +0200

Download raw body.

Thread
On Wed, Apr 10, 2024 at 04:09:00PM +0300, Vitaliy Makkoveev wrote:
> Only unix(4) and tcp(4) sockets set (*pru_sence)() handler. The rest of
> soo_stat() is the read only access.
> 
> solock() can't be pushed down to PCB layer because tcp(4) `so_rcv' still
> relies on it.

OK bluhm@

> Index: sys/kern/sys_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/sys_socket.c,v
> retrieving revision 1.63
> diff -u -p -r1.63 sys_socket.c
> --- sys/kern/sys_socket.c	31 Mar 2024 13:50:00 -0000	1.63
> +++ sys/kern/sys_socket.c	10 Apr 2024 13:06:26 -0000
> @@ -145,7 +145,7 @@ soo_stat(struct file *fp, struct stat *u
>  
>  	memset(ub, 0, sizeof (*ub));
>  	ub->st_mode = S_IFSOCK;
> -	solock(so);
> +	solock_shared(so);
>  	mtx_enter(&so->so_rcv.sb_mtx);
>  	if ((so->so_rcv.sb_state & SS_CANTRCVMORE) == 0 ||
>  	    so->so_rcv.sb_cc != 0)
> @@ -156,7 +156,7 @@ soo_stat(struct file *fp, struct stat *u
>  	ub->st_uid = so->so_euid;
>  	ub->st_gid = so->so_egid;
>  	(void)pru_sense(so, ub);
> -	sounlock(so);
> +	sounlock_shared(so);
>  	return (0);
>  }
>