Do not require AFS_SYSCALL 37/11937/11
authorAndrew Deason <adeason@sinenomine.net>
Wed, 11 Mar 2015 17:55:42 +0000 (12:55 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Sat, 10 Feb 2018 15:29:00 +0000 (10:29 -0500)
Various parts of the code make use of AFS_SYSCALL in order to
communicate with the libafs kernel module. Even though most modern
platforms do not use an actual syscall anymore (instead using an
ioctl-based method or similar to emulate the traditional AFS syscall),
some code paths rely on AFS_SYSCALL as a fallback, or just use
AFS_SYSCALL because they were never updated to use the newer methods.

Even platforms that do not use the traditional AFS syscall still
define the AFS_SYSCALL number, in case someone still uses it for
something. However, some platforms do not have an AFS syscall number;
there is no "slot" allocated to us, so we cannot safely issue any
syscall.

For those platforms, we must not reference AFS_SYSCALL at all, or we
will fail to build. So, get rid of these references to AFS_SYSCALL if
it is not defined. In some places, we can just avoid the relevant code
making the syscall. In a few other places, we just pretend like the
libafs kernel module was not loaded and yield an ENOSYS error, to make
the code simpler.

Change-Id: I38e033caf7149c2b1b567f9877221ca8551db2ea
Reviewed-on: https://gerrit.openafs.org/11937
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Ian Wienand <iwienand@redhat.com>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>

src/afsd/afsd_kernel.c
src/afsd/vsys.c
src/rx/rx_user.c
src/sys/pioctl.c
src/sys/setpag.c
src/venus/fstrace.c
src/viced/viced.c
src/volser/volmain.c

index b15df74..093ba5c 100644 (file)
@@ -274,12 +274,18 @@ afsd_call_syscall(struct afsd_syscall_args *args)
     error = os_syscall(args);
 
     if (afsd_debug) {
+        const char *syscall_str;
+#if defined(AFS_SYSCALL)
+        syscall_str = AFS_STRINGIZE(AFS_SYSCALL);
+#else
+        syscall_str = "[AFS_SYSCALL]";
+#endif
        if (error == -1) {
            char *s = strerror(errno);
-           printf("SScall(%d, %d, %d)=%d (%d, %s)\n", AFS_SYSCALL, AFSCALL_CALL,
+           printf("SScall(%s, %d, %d)=%d (%d, %s)\n", syscall_str, AFSCALL_CALL,
                   (int)args->params[0], error, errno, s);
        } else {
-           printf("SScall(%d, %d, %d)=%d\n", AFS_SYSCALL, AFSCALL_CALL,
+           printf("SScall(%s, %d, %d)=%d\n", syscall_str, AFSCALL_CALL,
                   (int)args->params[0], error);
        }
     }
index 44f4281..6b5d3b9 100644 (file)
@@ -57,9 +57,13 @@ main(int argc, char **argv)
            numberFlag = 1;
        }
     }
+#ifdef AFS_SYSCALL
     code =
        syscall(AFS_SYSCALL, parms[0], parms[1], parms[2], parms[3], parms[4],
                parms[5]);
+#else
+    code = -1;
+#endif
     printf("code %d\n", code);
     return 0;
 }
index f135fac..4793494 100644 (file)
@@ -448,8 +448,10 @@ rxi_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
 
 #if defined(AFS_SGI_ENV)
     rcode = afs_syscall(AFS_SYSCALL, 28, a3, a4, a5);
-#else
+#elif defined(AFS_SYSCALL)
     rcode = syscall(AFS_SYSCALL, 28 /* AFSCALL_CALL */ , a3, a4, a5);
+#else
+    rcode = -1;
 #endif /* AFS_SGI_ENV */
 
     signal(SIGSYS, old);
index 031def2..f2f9138 100644 (file)
@@ -51,9 +51,14 @@ lpioctl(char *path, int cmd, void *cmarg, int follow)
     rval = proc_afs_syscall(AFSCALL_PIOCTL, (long)path, cmd, (long)cmarg,
                            follow, &errcode);
 
-    if(rval)
+    if(rval) {
+# ifdef AFS_SYSCALL
        errcode = syscall(AFS_SYSCALL, AFSCALL_PIOCTL, path, cmd, cmarg,
                          follow);
+# else
+       errcode = -1;
+# endif
+    }
 
     return (errcode);
 }
index 3c90279..48570bf 100644 (file)
@@ -55,8 +55,14 @@ lsetpag(void)
 
     rval = proc_afs_syscall(AFSCALL_SETPAG,0,0,0,0,&errcode);
 
-    if(rval)
+    if(rval) {
+# ifdef AFS_SYSCALL
       errcode = syscall(AFS_SYSCALL, AFSCALL_SETPAG);
+# else
+      errcode = -1;
+# endif
+    }
+
 #elif defined(AFS_DARWIN80_ENV)
     int rval;
 
index 12a5949..04e7407 100644 (file)
@@ -1120,12 +1120,22 @@ afs_syscall(long call, long parm0, long parm1, long parm2, long parm3,
     /* Linux can only handle 5 arguments in the actual syscall. */
     if (call == AFSCALL_ICL) {
        rval = proc_afs_syscall(call, parm0, parm1, parm2, (long)eparm, &code);
-       if (rval)
+       if (rval) {
+#ifdef AFS_SYSCALL
            code = syscall(AFS_SYSCALL, call, parm0, parm1, parm2, eparm);
+#else
+           code = -1;
+#endif
+       }
     } else {
        rval = proc_afs_syscall(call, parm0, parm1, parm2, parm3, &code);
-       if (rval)
+       if (rval) {
+#ifdef AFS_SYSCALL
            code = syscall(AFS_SYSCALL, call, parm0, parm1, parm2, parm3);
+#else
+           code = -1;
+#endif
+       }
     }
 #if defined(AFS_SPARC64_LINUX20_ENV) || defined(AFS_SPARC_LINUX20_ENV)
     /* on sparc this function returns none value, so do it myself */
@@ -1137,7 +1147,11 @@ afs_syscall(long call, long parm0, long parm1, long parm2, long parm3,
     if (!code) code = rval;
 #else
 #if !defined(AFS_SGI_ENV) && !defined(AFS_AIX32_ENV)
+# if defined(AFS_SYSCALL)
     code = syscall(AFS_SYSCALL, call, parm0, parm1, parm2, parm3, parm4);
+# else
+    code = -1;
+# endif
 #else
 #if defined(AFS_SGI_ENV)
     code = syscall(AFS_ICL, call, parm0, parm1, parm2, parm3, parm4);  /* XXX */
index a8b6e33..11f21e0 100644 (file)
@@ -312,7 +312,18 @@ fs_IsLocalRealmMatch(void *rock, char *name, char *inst, char *cell)
     return islocal;
 }
 
-#if !defined(AFS_NT40_ENV) && !defined(AFS_DARWIN160_ENV)
+#if defined(AFS_NT40_ENV)
+/* no viced_syscall */
+#elif defined(AFS_DARWIN160_ENV)
+/* no viced_syscall */
+#elif !defined(AFS_SYSCALL)
+int
+viced_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
+{
+    errno = ENOSYS;
+    return -1;
+}
+#else
 int
 viced_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
 {
index 430510f..f454dd1 100644 (file)
@@ -173,6 +173,13 @@ volser_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
     }
     return err;
 }
+#elif !defined(AFS_SYSCALL)
+int
+volser_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
+{
+    errno = ENOSYS;
+    return -1;
+}
 #else
 int
 volser_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)