From f64d38b2f2df002399ef9cfd85ec4925ebcf0986 Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Wed, 23 Feb 2005 23:11:35 +0000 Subject: [PATCH] STABLE14-ioctl32-linux26-20050223 FIXES 17669 add ioctl32 support for linux 2.6 (cherry picked from commit 0b1be0bedb8a7e6dcaed6e6f353d46c89966ad21) --- 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 df214bbca..fc2ec7e45 100644 --- a/src/afs/LINUX/osi_module.c +++ b/src/afs/LINUX/osi_module.c @@ -98,6 +98,9 @@ csdbproc_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) @@ -114,6 +117,10 @@ afsproc_init(void) entry2 = create_proc_read_entry(PROC_CELLSERVDB_NAME, (S_IFREG|S_IRUGO), openafs_procfs, csdbproc_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; } @@ -123,6 +130,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 @@ -136,7 +147,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 4c2a8f458..1960023af 100644 --- a/src/config/afs_args.h +++ b/src/config/afs_args.h @@ -183,6 +183,7 @@ typedef struct cm_initparams_v1 { #define PROC_CELLSERVDB_NAME "CellServDB" #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