2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 * Linux module support routines.
14 #include <afsconfig.h>
15 #include "afs/param.h"
18 #include <linux/module.h> /* early to avoid printf->printk mapping */
19 #include "afs/sysincludes.h"
20 #include "afsincludes.h"
21 #include <linux/unistd.h> /* For syscall numbers. */
24 #ifdef AFS_AMD64_LINUX20_ENV
25 #include <asm/ia32_unistd.h>
28 #if defined(AFS_SPARC64_LINUX26_ENV) && defined(NEED_IOCTL32) && !defined(HAVE_COMPAT_IOCTL)
29 #include <linux/ioctl32.h>
32 #include <linux/slab.h>
33 #include <linux/init.h>
34 #include <linux/sched.h>
35 #include <linux/kernel.h>
37 #include "osi_compat.h"
39 extern struct proc_dir_entry
*openafs_procfs
;
40 #if defined(NEED_IOCTL32) && !defined(HAVE_COMPAT_IOCTL)
41 static int ioctl32_done
;
44 extern asmlinkage
long
45 afs_syscall(long syscall
, long parm1
, long parm2
, long parm3
, long parm4
);
48 afs_ioctl(struct inode
*inode
, struct file
*file
, unsigned int cmd
,
52 struct afsprocdata sysargs
;
54 struct afsprocdata32 sysargs32
;
57 if (cmd
!= VIOC_SYSCALL
&& cmd
!= VIOC_SYSCALL32
) return -EINVAL
;
60 # if defined(AFS_S390X_LINUX26_ENV)
61 if (test_thread_flag(TIF_31BIT
))
62 # elif defined(AFS_AMD64_LINUX20_ENV)
63 if (test_thread_flag(TIF_IA32
))
65 if (test_thread_flag(TIF_32BIT
))
66 # endif /* AFS_S390X_LINUX26_ENV */
68 if (copy_from_user(&sysargs32
, (void *)arg
,
69 sizeof(struct afsprocdata32
)))
72 return afs_syscall((unsigned long)sysargs32
.syscall
,
73 (unsigned long)sysargs32
.param1
,
74 (unsigned long)sysargs32
.param2
,
75 (unsigned long)sysargs32
.param3
,
76 (unsigned long)sysargs32
.param4
);
78 #endif /* NEED_IOCTL32 */
80 if (copy_from_user(&sysargs
, (void *)arg
, sizeof(struct afsprocdata
)))
83 return afs_syscall(sysargs
.syscall
, sysargs
.param1
,
84 sysargs
.param2
, sysargs
.param3
, sysargs
.param4
);
88 #if defined(HAVE_UNLOCKED_IOCTL) || defined(HAVE_COMPAT_IOCTL)
89 static long afs_unlocked_ioctl(struct file
*file
, unsigned int cmd
,
91 return afs_ioctl(FILE_INODE(file
), file
, cmd
, arg
);
95 static struct file_operations afs_syscall_fops
= {
96 #ifdef HAVE_UNLOCKED_IOCTL
97 .unlocked_ioctl
= afs_unlocked_ioctl
,
101 #ifdef HAVE_COMPAT_IOCTL
102 .compat_ioctl
= afs_unlocked_ioctl
,
109 struct proc_dir_entry
*entry
;
111 entry
= afs_proc_create(PROC_SYSCALL_NAME
, 0666, openafs_procfs
, &afs_syscall_fops
);
112 #if defined(STRUCT_PROC_DIR_ENTRY_HAS_OWNER)
114 entry
->owner
= THIS_MODULE
;
117 #if defined(NEED_IOCTL32) && !defined(HAVE_COMPAT_IOCTL)
118 if (register_ioctl32_conversion(VIOC_SYSCALL32
, NULL
) == 0)
124 osi_ioctl_clean(void)
126 remove_proc_entry(PROC_SYSCALL_NAME
, openafs_procfs
);
127 #if defined(NEED_IOCTL32) && !defined(HAVE_COMPAT_IOCTL)
129 unregister_ioctl32_conversion(VIOC_SYSCALL32
);