On Thu, Feb 09, 2017 at 12:36:44PM +0100, Martin Pieuchot wrote:
> [0] https://marc.info/?l=openbsd-misc&m=148661605114230&w=2

My test shows that unix doamin socket on NFS file system works.

>  void
>  sofree(struct socket *so)
>  {
> -     NET_ASSERT_LOCKED();
> -

Could you keep an SOCKET_ASSERT_LOCKED(so) here?

> @@ -232,7 +230,7 @@ soclose(struct socket *so)
>       struct socket *so2;
>       int s, error = 0;
>  
> -     NET_LOCK(s);
> +     SOCKET_LOCK(so, s);
>       if (so->so_options & SO_ACCEPTCONN) {
>               while ((so2 = TAILQ_FIRST(&so->so_q0)) != NULL) {
>                       (void) soqremque(so2, 0);

Here comes the call to soabort(so2).

int
soabort(struct socket *so)
{
        NET_ASSERT_LOCKED();

So this must be an SOCKET_ASSERT_LOCKED(so).

splassert: soabort: want 64 have 0
Starting stack trace...
splassert_check(40,0,d09e5ddb,d09d5adf,d03cfed0) at splassert_check+0x78
splassert_check(40,d09e5ddb,d09e5ddb,d03cabb2,d97d2e68) at splassert_check+0x78
soabort(d9553484,1,0,0,0) at soabort+0x5c
soclose(d9553ba4,0,2f39005a,d97d2e60,0) at soclose+0x188
soo_close(d97d20a0,d95c7ea0,2f39005a,0,0) at soo_close+0x1b
fdrop(d97d20a0,d95c7ea0,f5786edc,d03a29df,d954472c) at fdrop+0x28
closef(d97d20a0,d95c7ea0,f5786f0c,d03a93e2,d0bca2c0) at closef+0xcc
sys_close(d95c7ea0,f5786f5c,f5786f7c,0,f5786fa8) at sys_close+0x5a
syscall() at syscall+0x250

> @@ -121,6 +121,9 @@ uipc_usrreq(struct socket *so, int req, 
>               error = EINVAL;
>               goto release;
>       }
> +
> +     NET_ASSERT_UNLOCKED();
> +
>       switch (req) {
...
>       case PRU_BIND:
> -             /* XXXSMP breaks atomicity */
> -             rw_exit_write(&netlock);
> +             NET_ASSERT_UNLOCKED();

Do not assert twice.

>  unp_detach(struct unpcb *unp)
>  {
>       struct vnode *vp;
> -
> -     NET_ASSERT_UNLOCKED();
> -
> +     

There is a tab after the +

> @@ -539,7 +526,7 @@ unp_connect(struct socket *so, struct mb
>               error = EPROTOTYPE;
>               goto bad;
>       }
> -     NET_LOCK(s);
> +     SOCKET_LOCK(so, s);
>       if (so->so_proto->pr_flags & PR_CONNREQUIRED) {
>               if ((so2->so_options & SO_ACCEPTCONN) == 0 ||
>                   (so3 = sonewconn(so2, 0)) == 0) {
> @@ -564,7 +551,7 @@ unp_connect(struct socket *so, struct mb
>       }
>       error = unp_connect2(so, so2);
>  unlock:
> -     NET_UNLOCK(s);
> +     SOCKET_UNLOCK(s);
>  bad:

The socket sould be a PF_LOCAL anyway, so SOCKET_LOCK() and
SOCKET_UNLOCK() do nothing.  Remove these lines.

> +#define SOCKET_LOCK(so, s)                                           \
> +do {                                                                 \
> +     if (so->so_proto->pr_domain->dom_family != PF_LOCAL)            \
> +             NET_LOCK(s);                                            \
> +     else                                                            \
> +             s = -42;                                                \
> +} while (0)
> +
> +#define      SOCKET_UNLOCK(s)                                                
> \
> +do {                                                                 \
> +     if (s != -42)                                                   \
> +             NET_UNLOCK(s);                                          \
> +} while (0)

The 42 looks like an evil hack.

bluhm

Reply via email to