From 5b71bab4ff0a0f6f1e0cec2c71adfd48b3f35cca Mon Sep 17 00:00:00 2001 From: Ben Kaduk Date: Wed, 25 Aug 2010 23:21:30 -0400 Subject: [PATCH] FBSD: properly register our syscall Use the provided interface, syscall_register(), instead of manually tweaking the sysent table. Starting afsd will still fail at present on FreeBSD HEAD without an additional kernel patch to syscalls.master. Change-Id: I18db7c8b74dbd114165f7617df25e462cb372e88 Reviewed-on: http://gerrit.openafs.org/2616 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/afs/FBSD/osi_vfsops.c | 46 ++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/src/afs/FBSD/osi_vfsops.c b/src/afs/FBSD/osi_vfsops.c index 4dafff7305..3bed07bac3 100644 --- a/src/afs/FBSD/osi_vfsops.c +++ b/src/afs/FBSD/osi_vfsops.c @@ -20,40 +20,50 @@ int afs_pbuf_freecnt = -1; extern int Afs_xsetgroups(); extern int afs_xioctl(); -static sy_call_t *old_handler; +static struct sysent old_sysent; +static struct sysent afs_sysent = { + 5, /* int sy_narg */ + afs3_syscall, /* sy_call_t *sy_call */ +#ifdef AFS_FBSD60_ENV + AUE_NULL, /* au_event_t sy_auevent */ +#ifdef AFS_FBSD70_ENV + NULL, /* systrace_args_funt_t sy_systrace_args_func */ + 0, /* u_int32_t sy_entry */ + 0, /* u_int32_t sy_return */ +#ifdef AFS_FBSD90_ENV + 0, /* u_int32_t sy_flags */ + 0 /* u_int32_t sy_thrcnt */ +#endif +#endif +#endif /* FBSD60 */ +}; int afs_init(struct vfsconf *vfc) { - if (sysent[AFS_SYSCALL].sy_call != nosys - && sysent[AFS_SYSCALL].sy_call != lkmnosys) { - printf("AFS_SYSCALL in use. aborting\n"); - return EBUSY; + int code; + int offset = AFS_SYSCALL; + + code = syscall_register(&offset, &afs_sysent, &old_sysent); + if (code) { + printf("AFS_SYSCALL in use, error %i. aborting\n", code); + return code; } osi_Init(); afs_pbuf_freecnt = nswbuf / 2 + 1; -#if 0 - sysent[SYS_setgroups].sy_call = Afs_xsetgroups; - sysent[SYS_ioctl].sy_call = afs_xioctl; -#endif - old_handler = sysent[AFS_SYSCALL].sy_call; - sysent[AFS_SYSCALL].sy_call = afs3_syscall; - sysent[AFS_SYSCALL].sy_narg = 5; + return 0; } int afs_uninit(struct vfsconf *vfc) { + int offset = AFS_SYSCALL; + if (afs_globalVFS) return EBUSY; -#if 0 - sysent[SYS_ioctl].sy_call = ioctl; - sysent[SYS_setgroups].sy_call = setgroups; -#endif - sysent[AFS_SYSCALL].sy_narg = 0; - sysent[AFS_SYSCALL].sy_call = old_handler; + syscall_deregister(&offset, &old_sysent); return 0; }