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 */