* [PATCH 1/1] [nfs-utils] handle EINTR during connection establishment
@ 2016-01-14 21:34 Olga Kornievskaia
2016-01-16 22:01 ` Steve Dickson
0 siblings, 1 reply; 2+ messages in thread
From: Olga Kornievskaia @ 2016-01-14 21:34 UTC (permalink / raw)
To: steved; +Cc: linux-nfs
both connect() and select() can receive EINTR signals that we need to
recover from.
In Unix Network Programming, volume 1, section 5.9, W. Richard Stevens
states:
What we are doing […] is restarting the interrupted system call ourself.
This is fine for accept, along with the functions such as read, write,
select and open. But there is one function that we cannot restart ourself:
connect. If this function returns EINTR, we cannot call it again, as doing
so will return an immediate error. When connect is interrupted by a caught
signal and is not automatically restarted, we must call select to wait for
the connection to complete,
Thus for connect() treat both EINPROGRESS and EINTR the same -- call
select().
For select(), it should be re-tried again upon receiving EINTR.
Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
---
support/nfs/rpc_socket.c | 16 +++++++++++-----
1 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/support/nfs/rpc_socket.c b/support/nfs/rpc_socket.c
index c14efe8..edd43cc 100644
--- a/support/nfs/rpc_socket.c
+++ b/support/nfs/rpc_socket.c
@@ -215,7 +215,7 @@ static int nfs_connect_nb(const int fd, const struct sockaddr *sap,
* use it later.
*/
ret = connect(fd, sap, salen);
- if (ret < 0 && errno != EINPROGRESS) {
+ if (ret < 0 && errno != EINPROGRESS && errno != EINTR) {
ret = -1;
goto done;
}
@@ -227,10 +227,16 @@ static int nfs_connect_nb(const int fd, const struct sockaddr *sap,
FD_ZERO(&rset);
FD_SET(fd, &rset);
- ret = select(fd + 1, NULL, &rset, NULL, timeout);
- if (ret <= 0) {
- if (ret == 0)
- errno = ETIMEDOUT;
+ while ((ret = select(fd + 1, NULL, &rset, NULL, timeout)) < 0) {
+ if (errno != EINTR) {
+ ret = -1;
+ goto done;
+ } else {
+ continue;
+ }
+ }
+ if (ret == 0) {
+ errno = ETIMEDOUT;
ret = -1;
goto done;
}
--
1.7.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 1/1] [nfs-utils] handle EINTR during connection establishment
2016-01-14 21:34 [PATCH 1/1] [nfs-utils] handle EINTR during connection establishment Olga Kornievskaia
@ 2016-01-16 22:01 ` Steve Dickson
0 siblings, 0 replies; 2+ messages in thread
From: Steve Dickson @ 2016-01-16 22:01 UTC (permalink / raw)
To: Olga Kornievskaia; +Cc: linux-nfs
On 01/14/2016 04:34 PM, Olga Kornievskaia wrote:
> both connect() and select() can receive EINTR signals that we need to
> recover from.
>
> In Unix Network Programming, volume 1, section 5.9, W. Richard Stevens
> states:
>
> What we are doing […] is restarting the interrupted system call ourself.
> This is fine for accept, along with the functions such as read, write,
> select and open. But there is one function that we cannot restart ourself:
> connect. If this function returns EINTR, we cannot call it again, as doing
> so will return an immediate error. When connect is interrupted by a caught
> signal and is not automatically restarted, we must call select to wait for
> the connection to complete,
>
> Thus for connect() treat both EINPROGRESS and EINTR the same -- call
> select().
>
> For select(), it should be re-tried again upon receiving EINTR.
>
> Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Committed... Nice work!!
steved.
> ---
> support/nfs/rpc_socket.c | 16 +++++++++++-----
> 1 files changed, 11 insertions(+), 5 deletions(-)
>
> diff --git a/support/nfs/rpc_socket.c b/support/nfs/rpc_socket.c
> index c14efe8..edd43cc 100644
> --- a/support/nfs/rpc_socket.c
> +++ b/support/nfs/rpc_socket.c
> @@ -215,7 +215,7 @@ static int nfs_connect_nb(const int fd, const struct sockaddr *sap,
> * use it later.
> */
> ret = connect(fd, sap, salen);
> - if (ret < 0 && errno != EINPROGRESS) {
> + if (ret < 0 && errno != EINPROGRESS && errno != EINTR) {
> ret = -1;
> goto done;
> }
> @@ -227,10 +227,16 @@ static int nfs_connect_nb(const int fd, const struct sockaddr *sap,
> FD_ZERO(&rset);
> FD_SET(fd, &rset);
>
> - ret = select(fd + 1, NULL, &rset, NULL, timeout);
> - if (ret <= 0) {
> - if (ret == 0)
> - errno = ETIMEDOUT;
> + while ((ret = select(fd + 1, NULL, &rset, NULL, timeout)) < 0) {
> + if (errno != EINTR) {
> + ret = -1;
> + goto done;
> + } else {
> + continue;
> + }
> + }
> + if (ret == 0) {
> + errno = ETIMEDOUT;
> ret = -1;
> goto done;
> }
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-01-16 22:01 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-01-14 21:34 [PATCH 1/1] [nfs-utils] handle EINTR during connection establishment Olga Kornievskaia
2016-01-16 22:01 ` Steve Dickson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).