From: Chaskiel M Grundman Date: Wed, 23 Feb 2005 23:07:31 +0000 (+0000) Subject: ioctl32-linux26-20050223 X-Git-Tag: openafs-devel-1_5_0~746 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=0b1be0bedb8a7e6dcaed6e6f353d46c89966ad21;p=packages%2Fo%2Fopenafs.git ioctl32-linux26-20050223 FIXES 17669 add ioctl32 support for linux 2.6 --- 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;