From ed513bb516acdb28fc6bbf01714ef2e1df422a8a Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 11 Mar 2015 12:55:42 -0500 Subject: [PATCH] Do not require AFS_SYSCALL 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 Reviewed-by: Ian Wienand Reviewed-by: Benjamin Kaduk --- src/afsd/afsd_kernel.c | 10 ++++++++-- src/afsd/vsys.c | 4 ++++ src/rx/rx_user.c | 4 +++- src/sys/pioctl.c | 7 ++++++- src/sys/setpag.c | 8 +++++++- src/venus/fstrace.c | 18 ++++++++++++++++-- src/viced/viced.c | 13 ++++++++++++- src/volser/volmain.c | 7 +++++++ 8 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/afsd/afsd_kernel.c b/src/afsd/afsd_kernel.c index b15df7476c..093ba5cc0c 100644 --- a/src/afsd/afsd_kernel.c +++ b/src/afsd/afsd_kernel.c @@ -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); } } diff --git a/src/afsd/vsys.c b/src/afsd/vsys.c index 44f4281626..6b5d3b9bc8 100644 --- a/src/afsd/vsys.c +++ b/src/afsd/vsys.c @@ -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; } diff --git a/src/rx/rx_user.c b/src/rx/rx_user.c index f135fac0ea..4793494041 100644 --- a/src/rx/rx_user.c +++ b/src/rx/rx_user.c @@ -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); diff --git a/src/sys/pioctl.c b/src/sys/pioctl.c index 031def2282..f2f9138dee 100644 --- a/src/sys/pioctl.c +++ b/src/sys/pioctl.c @@ -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); } diff --git a/src/sys/setpag.c b/src/sys/setpag.c index 3c90279ee7..48570bf78a 100644 --- a/src/sys/setpag.c +++ b/src/sys/setpag.c @@ -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; diff --git a/src/venus/fstrace.c b/src/venus/fstrace.c index 12a594972f..04e7407a1a 100644 --- a/src/venus/fstrace.c +++ b/src/venus/fstrace.c @@ -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 */ diff --git a/src/viced/viced.c b/src/viced/viced.c index a8b6e337ce..11f21e0e7e 100644 --- a/src/viced/viced.c +++ b/src/viced/viced.c @@ -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) { diff --git a/src/volser/volmain.c b/src/volser/volmain.c index 430510f4fe..f454dd10dd 100644 --- a/src/volser/volmain.c +++ b/src/volser/volmain.c @@ -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)