PERFORCE change 143208 for review
Marko Zec
zec at FreeBSD.org
Mon Jun 9 18:42:29 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=143208
Change 143208 by zec at zec_tpx32 on 2008/06/09 18:41:43
Attempt to fix rpc.lockd triggered panics. The problem
was (and still most probably is) caused by network stack
functions being called without curvnet context being set
first.
The canonical remedy is insertioin of CURVNET_SET() /
CURVNET_RESTORE() macro pairs at proper places in the
offending callers. Obviously to insert such macros at
_proper_ places one should have a clear understanding
on how the calling code works, and I have absolutely no
clue on what and how the kernel-level RPC stuff is
supposed to do...
Reported by: kris@
Affected files ...
.. //depot/projects/vimage/src/sys/rpc/clnt_dg.c#2 edit
.. //depot/projects/vimage/src/sys/rpc/rpc_generic.c#2 edit
.. //depot/projects/vimage/src/sys/rpc/svc_dg.c#2 edit
.. //depot/projects/vimage/src/sys/rpc/svc_generic.c#2 edit
Differences ...
==== //depot/projects/vimage/src/sys/rpc/clnt_dg.c#2 (text+ko) ====
==== //depot/projects/vimage/src/sys/rpc/rpc_generic.c#2 (text+ko) ====
@@ -42,6 +42,7 @@
*/
#include "opt_inet6.h"
+#include "opt_vimage.h"
#include <sys/param.h>
#include <sys/kernel.h>
@@ -54,6 +55,7 @@
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/syslog.h>
+#include <sys/vimage.h>
#include <rpc/rpc.h>
#include <rpc/nettype.h>
@@ -183,9 +185,12 @@
struct sockopt opt;
int error;
+ CURVNET_SET(so->so_vnet);
error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa);
- if (error)
+ if (error) {
+ CURVNET_RESTORE();
return 0;
+ }
sip->si_alen = sa->sa_len;
family = sa->sa_family;
@@ -198,6 +203,7 @@
opt.sopt_valsize = sizeof type;
opt.sopt_td = NULL;
error = sogetopt(so, &opt);
+ CURVNET_RESTORE();
if (error)
return 0;
@@ -694,7 +700,9 @@
struct sockaddr *sa;
int error, bound;
+ CURVNET_SET(so->so_vnet);
error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa);
+ CURVNET_RESTORE();
if (error)
return (0);
==== //depot/projects/vimage/src/sys/rpc/svc_dg.c#2 (text+ko) ====
@@ -43,6 +43,8 @@
* svc_dg.c, Server side for connectionless RPC.
*/
+#include "opt_vimage.h"
+
#include <sys/param.h>
#include <sys/lock.h>
#include <sys/kernel.h>
@@ -55,6 +57,7 @@
#include <sys/socketvar.h>
#include <sys/systm.h>
#include <sys/uio.h>
+#include <sys/vimage.h>
#include <rpc/rpc.h>
@@ -125,7 +128,9 @@
xprt->xp_p2 = NULL;
xprt->xp_ops = &svc_dg_ops;
+ CURVNET_SET(so->so_vnet);
error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa);
+ CURVNET_RESTORE();
if (error)
goto freedata;
==== //depot/projects/vimage/src/sys/rpc/svc_generic.c#2 (text+ko) ====
@@ -46,6 +46,7 @@
*/
#include "opt_inet6.h"
+#include "opt_vimage.h"
#include <sys/param.h>
#include <sys/lock.h>
@@ -59,6 +60,7 @@
#include <sys/systm.h>
#include <sys/sx.h>
#include <sys/ucred.h>
+#include <sys/vimage.h>
#include <rpc/rpc.h>
#include <rpc/rpcb_clnt.h>
@@ -203,7 +205,9 @@
socklen_t salen;
if (sa == NULL) {
+ CURVNET_SET(so->so_vnet);
error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa);
+ CURVNET_RESTORE();
if (error)
return (error);
freesa = TRUE;
@@ -324,6 +328,7 @@
/*
* If the socket is unbound, try to bind it.
*/
+ CURVNET_SET(so->so_vnet);
if (madeso || !__rpc_sockisbound(so)) {
if (bindaddr == NULL) {
if (bindresvport(so, NULL)) {
@@ -393,9 +398,11 @@
if (nconf) {
xprt->xp_netid = strdup(nconf->nc_netid, M_RPC);
}
+ CURVNET_RESTORE();
return (xprt);
freedata:
+ CURVNET_RESTORE();
if (madeso)
(void)soclose(so);
if (xprt) {
More information about the p4-projects
mailing list