From 2ae2a15c9dc9b26eaa15964cc96fdeeb6d82c74c Mon Sep 17 00:00:00 2001 From: Marcio Barbosa Date: Mon, 6 Jun 2016 14:03:54 -0300 Subject: [PATCH] sys: retry lsetpag if errno is EINTR The variable errno might be set by some system calls to indicate the reason why the system call in question did not work as expected. If the setpag system call is interrupted by a signal, the value of errno will be EINTR. This value means that setpag did not succeed because it was interrupted. If lsetpag did not succeed and errno is equal to EINTR, try again. Change-Id: Ibf306d62fc8d2fa9ccb0692f9031c5aa659b2bfe Reviewed-on: https://gerrit.openafs.org/12295 Tested-by: BuildBot Reviewed-by: Andrew Deason Reviewed-by: Cheyenne Wills Reviewed-by: Benjamin Kaduk --- src/afsweb/apache_afs_utils.c | 8 +++++++- src/kopenafs/kopenafs.c | 8 +++++++- src/sys/rmtsysc.c | 5 ++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/afsweb/apache_afs_utils.c b/src/afsweb/apache_afs_utils.c index ba0d919..c185c54 100644 --- a/src/afsweb/apache_afs_utils.c +++ b/src/afsweb/apache_afs_utils.c @@ -44,7 +44,13 @@ do_pioctl(char *in_buffer, int in_size, char *out_buffer, int out_size, int do_setpag() { - return lsetpag(); + int code; + + do { + code = lsetpag(); + } while (code && errno == EINTR); + + return code; } /* diff --git a/src/kopenafs/kopenafs.c b/src/kopenafs/kopenafs.c index 0a59cc8..143c3bb 100644 --- a/src/kopenafs/kopenafs.c +++ b/src/kopenafs/kopenafs.c @@ -71,7 +71,13 @@ k_hasafs(void) int k_setpag(void) { - return lsetpag(); + int code; + + do { + code = lsetpag(); + } while (code && errno == EINTR); + + return code; } int diff --git a/src/sys/rmtsysc.c b/src/sys/rmtsysc.c index cba777b..cf16afc 100644 --- a/src/sys/rmtsysc.c +++ b/src/sys/rmtsysc.c @@ -146,7 +146,10 @@ setpag(void) if (!(conn = rx_connection(&errorcode, "setpag"))) { /* Remote call can't be performed for some reason. * Try the local 'setpag' system call ... */ - errorcode = lsetpag(); + do { + errorcode = lsetpag(); + } while (errorcode && errno == EINTR); + return errorcode; } ngroups = SetClientCreds(&creds, groups); -- 1.9.4