Index: nfs/nfs_syscalls.c
===================================================================
RCS file: /cvs/src/sys/nfs/nfs_syscalls.c,v
retrieving revision 1.67
diff -u -p -r1.67 nfs_syscalls.c
--- nfs/nfs_syscalls.c  26 Jun 2008 23:56:26 -0000      1.67
+++ nfs/nfs_syscalls.c  27 Jun 2008 18:24:39 -0000
@@ -107,6 +107,7 @@ int nfs_niothreads = -1;
 
 #ifdef NFSSERVER
 static void nfsd_rt(int, struct nfsrv_descript *, int);
+int nfsrv_getslp(struct nfsd *);
 #endif
 
 /*
@@ -310,32 +311,13 @@ nfssvc_nfsd(nsd, argp, p)
         */
        for (;;) {
                if ((nfsd->nfsd_flag & NFSD_REQINPROG) == 0) {
-                       while (nfsd->nfsd_slp == (struct nfssvc_sock *)0 &&
-                           (nfsd_head_flag & NFSD_CHECKSLP) == 0) {
-                               nfsd->nfsd_flag |= NFSD_WAITING;
-                               nfsd_waiting++;
-                               error = tsleep((caddr_t)nfsd, PSOCK | PCATCH,
-                                   "nfsd", 0);
-                               nfsd_waiting--;
-                               if (error)
-                                       goto done;
-                       }
-                       if (nfsd->nfsd_slp == NULL &&
-                           (nfsd_head_flag & NFSD_CHECKSLP) != 0) {
-                               TAILQ_FOREACH(slp, &nfssvc_sockhead, ns_chain) {
-                                   if ((slp->ns_flag & (SLP_VALID | SLP_DOREC))
-                                       == (SLP_VALID | SLP_DOREC)) {
-                                           slp->ns_flag &= ~SLP_DOREC;
-                                           slp->ns_sref++;
-                                           nfsd->nfsd_slp = slp;
-                                           break;
-                                   }
-                               }
-                               if (slp == 0)
-                                       nfsd_head_flag &= ~NFSD_CHECKSLP;
-                       }
-                       if ((slp = nfsd->nfsd_slp) == (struct nfssvc_sock *)0)
-                               continue;
+
+                       /* attach an nfssvc_sock to nfsd */
+                       error = nfsrv_getslp(nfsd);
+                       if (error)
+                               goto done;
+                       slp = nfsd->nfsd_slp;
+
                        if (slp->ns_flag & SLP_VALID) {
                                struct timeval tv;
 
@@ -800,3 +782,46 @@ nfs_getset_niothreads(set)
        }
 }
 #endif /* NFSCLIENT */
+
+#ifdef NFSSERVER
+/*
+ * Find an nfssrv_sock for nfsd, sleeping if needed.
+ */
+int
+nfsrv_getslp(struct nfsd *nfsd)
+{
+       struct nfssvc_sock *slp;
+       int error;
+
+again:
+       while (nfsd->nfsd_slp == NULL &&
+           (nfsd_head_flag & NFSD_CHECKSLP) == 0) {
+               nfsd->nfsd_flag |= NFSD_WAITING;
+               nfsd_waiting++;
+               error = tsleep(nfsd, PSOCK | PCATCH, "nfsd", 0);
+               nfsd_waiting--;
+               if (error)
+                       return (error);
+       }
+
+       if (nfsd->nfsd_slp == NULL &&
+           (nfsd_head_flag & NFSD_CHECKSLP) != 0) {
+               TAILQ_FOREACH(slp, &nfssvc_sockhead, ns_chain) {
+                       if ((slp->ns_flag & (SLP_VALID | SLP_DOREC)) ==
+                           (SLP_VALID | SLP_DOREC)) {
+                               slp->ns_flag &= ~SLP_DOREC;
+                               slp->ns_sref++;
+                               nfsd->nfsd_slp = slp;
+                               break;
+                       }
+               }
+               if (slp == NULL)
+                       nfsd_head_flag &= ~NFSD_CHECKSLP;
+       }
+
+       if (nfsd->nfsd_slp == NULL)
+               goto again;
+
+       return (0);
+}
+#endif /* NFSSERVER */

Reply via email to