]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
ioctl32-linux26-20050223
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Wed, 23 Feb 2005 23:07:31 +0000 (23:07 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 23 Feb 2005 23:07:31 +0000 (23:07 +0000)
FIXES 17669

add ioctl32 support for linux 2.6

src/afs/LINUX/osi_module.c
src/config/afs_args.h

index 6cfe80160eea0d5ed51eee721d37a6e7414920dd..6a458568b05d1fb65c2c051d226ff8effdcb0aa9 100644 (file)
@@ -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
index b2dce5d55b4a2c62de96229e62a7d475c320e2ba..7f19687bb1332079cee904c2581ad5d12c5f1522 100644 (file)
@@ -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;