Index: sys/socketvar.h =================================================================== RCS file: /cvs/src/sys/sys/socketvar.h,v retrieving revision 1.58 diff -u -p -r1.58 socketvar.h --- sys/socketvar.h 19 Jan 2015 19:57:59 -0000 1.58 +++ sys/socketvar.h 30 Mar 2015 02:01:09 -0000 @@ -122,8 +122,8 @@ struct socket { #define SB_NOINTR 0x40 /* operations not interruptible */ #define SB_KNOTE 0x80 /* kernel note attached */ - void (*so_upcall)(struct socket *so, caddr_t arg, int waitf); - caddr_t so_upcallarg; /* Arg for above */ + int (*so_upcall)(struct socket *so, void *arg, int waitf); + void * so_upcallarg; /* Arg for above */ uid_t so_euid, so_ruid; /* who opened the socket */ gid_t so_egid, so_rgid; pid_t so_cpid; /* pid of process that opened socket */ Index: kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.137 diff -u -p -r1.137 uipc_socket.c --- kern/uipc_socket.c 14 Mar 2015 03:38:51 -0000 1.137 +++ kern/uipc_socket.c 30 Mar 2015 02:01:09 -0000 @@ -1440,15 +1440,18 @@ somove(struct socket *so, int wait) void sorwakeup(struct socket *so) { + int wake = 1; + #ifdef SOCKET_SPLICE if (so->so_rcv.sb_flagsintr & SB_SPLICE) (void) somove(so, M_DONTWAIT); if (isspliced(so)) return; #endif - sowakeup(so, &so->so_rcv); if (so->so_upcall) - (*(so->so_upcall))(so, so->so_upcallarg, M_DONTWAIT); + wake = (*(so->so_upcall))(so, so->so_upcallarg, M_DONTWAIT); + if (wake) + sowakeup(so, &so->so_rcv); } void Index: nfs/nfs_socket.c =================================================================== RCS file: /cvs/src/sys/nfs/nfs_socket.c,v retrieving revision 1.108 diff -u -p -r1.108 nfs_socket.c --- nfs/nfs_socket.c 14 Mar 2015 03:38:52 -0000 1.108 +++ nfs/nfs_socket.c 30 Mar 2015 02:01:09 -0000 @@ -1560,17 +1560,17 @@ nfs_msg(struct nfsreq *rep, char *msg) * Essentially do as much as possible non-blocking, else punt and it will * be called with M_WAIT from an nfsd. */ -void -nfsrv_rcv(struct socket *so, caddr_t arg, int waitflag) +int +nfsrv_rcv(struct socket *so, void *arg, int waitflag) { - struct nfssvc_sock *slp = (struct nfssvc_sock *)arg; + struct nfssvc_sock *slp = arg; struct mbuf *m; struct mbuf *mp, *nam; struct uio auio; int flags, error; if ((slp->ns_flag & SLP_VALID) == 0) - return; + return (1); #ifdef notdef /* * Define this to test for nfsds handling this under heavy load. @@ -1663,6 +1663,8 @@ dorecs: if (waitflag == M_DONTWAIT && (slp->ns_rec || (slp->ns_flag & (SLP_NEEDQ | SLP_DISCONN)))) nfsrv_wakenfsd(slp); + + return (0); } /* Index: nfs/nfs_syscalls.c =================================================================== RCS file: /cvs/src/sys/nfs/nfs_syscalls.c,v retrieving revision 1.99 diff -u -p -r1.99 nfs_syscalls.c --- nfs/nfs_syscalls.c 14 Mar 2015 03:38:52 -0000 1.99 +++ nfs/nfs_syscalls.c 30 Mar 2015 02:01:09 -0000 @@ -279,8 +279,8 @@ nfssvc_addsock(struct file *fp, struct m fp->f_count++; slp->ns_fp = fp; s = splsoftnet(); - so->so_upcallarg = (caddr_t)slp; so->so_upcall = nfsrv_rcv; + so->so_upcallarg = slp; slp->ns_flag = (SLP_VALID | SLP_NEEDQ); nfsrv_wakenfsd(slp); splx(s); Index: nfs/nfs_var.h =================================================================== RCS file: /cvs/src/sys/nfs/nfs_var.h,v retrieving revision 1.60 diff -u -p -r1.60 nfs_var.h --- nfs/nfs_var.h 11 Jun 2013 16:42:17 -0000 1.60 +++ nfs/nfs_var.h 30 Mar 2015 02:01:09 -0000 @@ -192,7 +192,7 @@ int nfs_rcvlock(struct nfsreq *); void nfs_rcvunlock(int *); int nfs_getreq(struct nfsrv_descript *, struct nfsd *, int); void nfs_msg(struct nfsreq *, char *); -void nfsrv_rcv(struct socket *, caddr_t, int); +int nfsrv_rcv(struct socket *, void *, int); int nfsrv_getstream(struct nfssvc_sock *, int); int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *, struct nfsrv_descript **);