aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorPaul Saab <ps@FreeBSD.org>2005-11-21 19:25:24 +0000
committerPaul Saab <ps@FreeBSD.org>2005-11-21 19:25:24 +0000
commit38b29f71ef14554cbc5475a992967619edb20365 (patch)
tree2d24f17c86af06abf2c9e6bc121d7a87713de915 /sys
parent3834aac17ec71ce0bde77afe381a0f007d2d5d1d (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/nfsclient/nfs_socket.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/nfsclient/nfs_socket.c b/sys/nfsclient/nfs_socket.c
index 511e2291772b2..ed826f8b7c931 100644
--- a/sys/nfsclient/nfs_socket.c
+++ b/sys/nfsclient/nfs_socket.c
@@ -523,6 +523,17 @@ nfs_send(struct socket *so, struct sockaddr *nam, struct mbuf *top,
return (error);
}
+static __inline int
+nfs_cantrecvmore(struct socket *so)
+{
+ int ret;
+
+ SOCKBUF_LOCK(&so->so_rcv);
+ ret = (so->so_rcv.sb_state & SBS_CANTRCVMORE);
+ SOCKBUF_UNLOCK(&so->so_rcv);
+ return ret;
+}
+
int
nfs_reply(struct nfsreq *rep)
{
@@ -552,7 +563,7 @@ tryagain:
}
so = rep->r_nmp->nm_so;
mtx_lock(&rep->r_nmp->nm_nfstcpstate.mtx);
- if (!so ||
+ if (!so || nfs_cantrecvmore(so) ||
(rep->r_nmp->nm_nfstcpstate.flags & NFS_TCP_FORCE_RECONNECT)) {
mtx_unlock(&rep->r_nmp->nm_nfstcpstate.mtx);
error = nfs_reconnect(rep);