svn commit: r225234 - head/sys/rpc

[ Available lists | Index of svn-src-all | Month of Aug 2011 | Week of 28 Aug 2011 | Raw email | View thread | Wrap long lines | Reply | Tag ]
From
Artem Belevich <art@FreeBSD.org>
Date
28 Aug 2011 18:09:17
Subject
svn commit: r225234 - head/sys/rpc
Message-ID
201108281809.p7SI9H6q062008@svn.freebsd.org


[ Hide this part ]
Author: art
Date: Sun Aug 28 18:09:17 2011
New Revision: 225234
URL: http://svn.freebsd.org/changeset/base/225234

Log:
Make sure RPC calls over UDP return RPC_INTR status is the process has
been interrupted in a restartable syscall. Otherwise we could end up
in an (almost) endless loop in clnt_reconnect_call().

PR: kern/160198
Reviewed by: rmacklem
Approved by: re (kib), avg (mentor)
MFC after: 1 week

Modified:
head/sys/rpc/clnt_dg.c

Modified: head/sys/rpc/clnt_dg.c
==============================================================================
--- head/sys/rpc/clnt_dg.c Sun Aug 28 16:11:24 2011 (r225233)
+++ head/sys/rpc/clnt_dg.c Sun Aug 28 18:09:17 2011 (r225234)
@@ -467,7 +467,10 @@ send_again:
cu->cu_waitflag, "rpccwnd", 0);
if (error) {
errp->re_errno = error;
- errp->re_status = stat = RPC_CANTSEND;
+ if (error == EINTR || error == ERESTART)
+ errp->re_status = stat = RPC_INTR;
+ else
+ errp->re_status = stat = RPC_CANTSEND;
goto out;
}
}
@@ -636,7 +639,7 @@ get_reply:
*/
if (error != EWOULDBLOCK) {
errp->re_errno = error;
- if (error == EINTR)
+ if (error == EINTR || error == ERESTART)
errp->re_status = stat = RPC_INTR;
else
errp->re_status = stat = RPC_CANTRECV;

Elapsed time: 0.075 seconds