summaryrefslogtreecommitdiffstats
path: root/xlators/nfs/lib/src/rpcsvc.c
diff options
context:
space:
mode:
Diffstat (limited to 'xlators/nfs/lib/src/rpcsvc.c')
-rw-r--r--xlators/nfs/lib/src/rpcsvc.c24
1 files changed, 14 insertions, 10 deletions
diff --git a/xlators/nfs/lib/src/rpcsvc.c b/xlators/nfs/lib/src/rpcsvc.c
index 179fd9b4d..5798aa669 100644
--- a/xlators/nfs/lib/src/rpcsvc.c
+++ b/xlators/nfs/lib/src/rpcsvc.c
@@ -2638,30 +2638,33 @@ tx_remaining:
/* If we've broken out of the loop above then we must unblock
* the transmission now.
*/
- nfs_rpcsvc_socket_unblock_tx (conn->sockfd);
- if (list_empty (&conn->txbufs))
- conn->eventidx = event_select_on (conn->stage->eventpool,
- conn->sockfd, conn->eventidx,
- -1, 0);
-
- return 0;
+ if (written != -1) {
+ nfs_rpcsvc_socket_unblock_tx (conn->sockfd);
+ if (list_empty (&conn->txbufs))
+ conn->eventidx = event_select_on (conn->stage->eventpool,
+ conn->sockfd, conn->eventidx,
+ -1, 0);
+ return 0;
+ } else
+ return -1;
}
int
nfs_rpcsvc_conn_data_poll_out (rpcsvc_conn_t *conn)
{
+ int ret = -1;
if (!conn)
return -1;
pthread_mutex_lock (&conn->connlock);
{
- __nfs_rpcsvc_conn_data_poll_out (conn);
+ ret = __nfs_rpcsvc_conn_data_poll_out (conn);
}
pthread_mutex_unlock (&conn->connlock);
- return 0;
+ return ret;
}
@@ -2685,7 +2688,8 @@ nfs_rpcsvc_conn_data_handler (int fd, int idx, void *data, int poll_in,
return 0;
}
- if (poll_in) {
+ /* don't handle poll_in if we failed when we handled poll_out */
+ if ((ret != -1) && poll_in) {
ret = 0;
ret = nfs_rpcsvc_conn_data_poll_in (conn);
}