sys: retry lsetpag if errno is EINTR 95/12295/5
authorMarcio Barbosa <mbarbosa@sinenomine.net>
Mon, 6 Jun 2016 17:03:54 +0000 (14:03 -0300)
committerBenjamin Kaduk <kaduk@mit.edu>
Thu, 28 Nov 2019 22:51:37 +0000 (17:51 -0500)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Andrew Deason <adeason@sinenomine.net>
Reviewed-by: Cheyenne Wills <cwills@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/afsweb/apache_afs_utils.c
src/kopenafs/kopenafs.c
src/sys/rmtsysc.c

index ba0d919..c185c54 100644 (file)
@@ -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;
 }
 
 /*
index 0a59cc8..143c3bb 100644 (file)
@@ -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
index cba777b..cf16afc 100644 (file)
@@ -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);