From 0b1be0bedb8a7e6dcaed6e6f353d46c89966ad21 Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Wed, 23 Feb 2005 23:07:31 +0000 Subject: [PATCH] ioctl32-linux26-20050223 FIXES 17669 add ioctl32 support for linux 2.6 --- src/afs/LINUX/osi_module.c | 13 ++++++++++++- src/config/afs_args.h | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/afs/LINUX/osi_module.c b/src/afs/LINUX/osi_module.c index 6cfe80160..6a458568b 100644 --- a/src/afs/LINUX/osi_module.c +++ b/src/afs/LINUX/osi_module.c @@ -423,6 +423,9 @@ callproc_read(char *buffer, char **start, off_t offset, int count, } static struct proc_dir_entry *openafs_procfs; +#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) +static int ioctl32_done; +#endif static int afsproc_init(void) @@ -450,6 +453,10 @@ afsproc_init(void) entry = create_proc_read_entry(PROC_SERVICES_NAME, (S_IFREG|S_IRUGO), openafs_procfs, servicesproc_read, NULL); entry = create_proc_read_entry(PROC_RXSTATS_NAME, (S_IFREG|S_IRUGO), openafs_procfs, rxstatsproc_read, NULL); +#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) + if (register_ioctl32_conversion(VIOC_SYSCALL32, NULL) == 0) + ioctl32_done = 1; +#endif return 0; } @@ -466,6 +473,10 @@ afsproc_exit(void) remove_proc_entry(PROC_CELLSERVDB_NAME, openafs_procfs); remove_proc_entry(PROC_SYSCALL_NAME, openafs_procfs); remove_proc_entry(PROC_FSDIRNAME, proc_root_fs); +#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) + if (ioctl32_done) + unregister_ioctl32_conversion(VIOC_SYSCALL32); +#endif } extern asmlinkage long @@ -479,7 +490,7 @@ afs_ioctl(struct inode *inode, struct file *file, unsigned int cmd, struct afsprocdata sysargs; struct afsprocdata32 sysargs32; - if (cmd != VIOC_SYSCALL) return -EINVAL; + if (cmd != VIOC_SYSCALL && cmd != VIOC_SYSCALL32) return -EINVAL; #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) #ifdef AFS_SPARC64_LINUX24_ENV diff --git a/src/config/afs_args.h b/src/config/afs_args.h index b2dce5d55..7f19687bb 100644 --- a/src/config/afs_args.h +++ b/src/config/afs_args.h @@ -189,6 +189,7 @@ typedef struct cm_initparams_v1 { #define PROC_RXSTATS_NAME "rx_stats" #define VIOC_SYSCALL_TYPE 'C' #define VIOC_SYSCALL _IOW(VIOC_SYSCALL_TYPE,1,void *) +#define VIOC_SYSCALL32 _IOW(VIOC_SYSCALL_TYPE,1,int) struct afsprocdata { long param4; -- 2.39.5