Current-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: nfs client kernel crash



On Jun 13,  9:56am, 6bone%6bone.informatik.uni-leipzig.de@localhost (6bone%6bone.informatik.uni-leipzig.de@localhost) wrote:
-- Subject: Re: nfs client kernel crash

| On Sat, 4 Jun 2016, Christos Zoulas wrote:
| 
| > | The PR/50432 may describe the same problem.
| >
| > Thanks!
| >
| > christos
| >
| 
| A few weeks ago I changed the storage of our netbsd mirror to nfs. Since 
| the change, the mirror crashes regularly. There are also other problems 
| with the nfs. So the mirror is not usable at the moment.
| 
| Can you have a look at the problem? Perhaps you can find a quick 
| workaround.

Can you try this? The first one might not apply cleanly since I changed
the loop, but it should work just the same if you put the spl stuff around
the old loop.

christos

Index: nfs_clntsocket.c
===================================================================
RCS file: /cvsroot/src/sys/nfs/nfs_clntsocket.c,v
retrieving revision 1.4
diff -u -u -r1.4 nfs_clntsocket.c
--- nfs_clntsocket.c	13 Jun 2016 14:23:26 -0000	1.4
+++ nfs_clntsocket.c	13 Jun 2016 14:29:31 -0000
@@ -324,7 +324,7 @@
 	struct mbuf *mrep, *nam, *md;
 	u_int32_t rxid, *tl;
 	char *dpos, *cp2;
-	int error;
+	int error, s;
 
 	/*
 	 * Loop around until we get our own reply
@@ -402,6 +402,7 @@
 		 * Loop through the request list to match up the reply
 		 * Iff no match, just drop the datagram
 		 */
+		s = splsoftnet();
 		TAILQ_FOREACH(rep, &nfs_reqq, r_chain) {
 			if (rep->r_mrep != NULL || rxid != rep->r_xid)
 				continue;
@@ -467,6 +468,7 @@
 			nmp->nm_timeouts = 0;
 			break;
 		}
+		splx(s);
 		nfs_rcvunlock(nmp);
 		/*
 		 * If not matched to a request, drop it.
Index: nfs_socket.c
===================================================================
RCS file: /cvsroot/src/sys/nfs/nfs_socket.c,v
retrieving revision 1.197
diff -u -u -r1.197 nfs_socket.c
--- nfs_socket.c	15 Jul 2015 03:28:55 -0000	1.197
+++ nfs_socket.c	13 Jun 2016 14:29:31 -0000
@@ -349,7 +349,7 @@
 {
 	struct nfsreq *rp;
 	struct nfsmount *nmp = rep->r_nmp;
-	int error;
+	int error, s;
 	time_t before_ts;
 
 	nfs_disconnect(nmp);
@@ -384,6 +384,7 @@
 	 * Loop through outstanding request list and fix up all requests
 	 * on old socket.
 	 */
+	s = splsoftnet();
 	TAILQ_FOREACH(rp, &nfs_reqq, r_chain) {
 		if (rp->r_nmp == nmp) {
 			if ((rp->r_flags & R_MUSTRESEND) == 0)
@@ -391,6 +392,7 @@
 			rp->r_rexmit = 0;
 		}
 	}
+	splx(s);
 	return (0);
 }
 

christos


Home | Main Index | Thread Index | Old Index